[color=#939ead,[list, y- m) N9 `9 O6 g5 L3 U
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案- u A: Z- e+ E3 r+ B2 X# O
[*,
: F$ N9 O8 j) A[*,多点触控:
2 c3 R/ ?& x! L9 K S+ K[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。2 o' g6 O- F$ j7 ~% D
[*,原理:& R7 V& `4 N; D% W0 g$ v. h$ d
[*,Int pointCount = event.getPointerCount();
3 C0 f u# {( i: T5 l- v" z( `[*,获取当前的点击个数。
+ ?. h: ^8 r% X/ Z$ X[*,ACTION_POINTER_1_DOWN
F5 M1 Y2 B3 g( d[*,ACTION_POINTER_2_DOWN
3 O% f/ R) B7 }1 t; J. [9 R[*,ACTION_POINTER_3_DOWN
0 C4 S0 s, S: L$ s1 o* l; V" O[*,ACTION_POINTER_1_UP
% e7 W* A) _" V& f[*,ACTION_POINTER_2_UP9 i5 T/ r7 e7 ], J+ j
[*,ACTION_POINTER_3_UP% l' W4 ~) R2 d' I+ y! K* t
[*,ACTION_POINTER_1_MOVE& s$ n+ B3 p! j2 |8 L1 _. H" _% _
[*,ACTION_POINTER_2_MOVE
( h& j+ \/ A/ J& d[*,ACTION_POINTER_3_MOVE9 w8 P+ K9 o' G/ {, I
[*,[font=宋体,获取各个点的事件响应5 {' A2 s5 K3 f# p
[*,( s# p. h4 }+ y2 H+ B
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。2 n/ Q3 j) z$ u% f
[*,[font=宋体,同理第二点也一样。% T' n; U" P+ u% Q
[*,; U ^4 x% m1 L- T9 P$ F
[*,2:[font=宋体,安卓生命周期6 Q" k. g8 Y# Z7 x; q( Q
[*,[font=宋体,默认的安卓生命周期为点击应用图标
5 ?! V# A. t9 [2 `3 m) K4 }1 F1 [5 r[*,OnCreat OnStart OnResume
6 S- E% M# G/ {0 A[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory) ^) \! _% ]6 I' H; D0 q1 D
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.1 Y- l7 F: _2 f- o7 M' z2 D
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到& s0 ?& ]/ | C
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;$ ]" A% l, v2 J# g; o; E: ]* Q
[*,[font=宋体,[font=宋体,[size=10pt,所以选择屏蔽.[font=宋体,[font=宋体,[size=10pt,代码很简单只需要在截取到[font=Courier New,[size=10pt,Back[font=宋体,[font=宋体,[size=10pt,事件时[font=Courier New,[size=10pt,return[font=宋体,[font=宋体,[size=10pt,就可以了不要让他走周期流程+ k$ m) F* M& [* [$ \+ H
[*,
& {" F+ \% K. i! I" L: r# E$ v U[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏
_& g, r9 s" G; ?% [" O[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
$ n( t5 Z( U w: B[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
! L: Q/ I z1 i% n* U[*,[font=宋体,遇到问题:[font=宋体,之前是在代码中添加转横屏操作[font=Courier New,.[font=宋体,后来发现当转的时候调用了onConfigurationChanged.[font=宋体,并且又走了[font=Courier New,OnStart[font=宋体,和[font=Courier New,OnCreat[font=宋体,并且在他析构的时候调用了[font=Courier New,OnDestory.[font=宋体,导致整个生命周期流程乱套了[font=Courier New,.8 N- y6 \$ h, R3 p. C. z, H! A
[*,
' _, _/ f3 Q% G1 u N6 [" X5 Q[*,[font=宋体,[font=宋体,[size=10pt,正确的做法,[font=宋体,[font=宋体,[size=10pt,在创建[font=Courier New,[size=10pt,Activity[font=宋体,[font=宋体,[size=10pt,之前就将屏幕转好[font=Courier New,[size=10pt,,[font=宋体,[font=宋体,[size=10pt,具体写法
1 y- Z# b- Y4 @. l9 p# R[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
( h+ O3 Q" K1 n4 d, D[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,( ~$ u- \( n1 E9 [) f$ n j" ?
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
2 E4 y! O! N- J I& i[*,android:screenOrientation=[i,"landscape"[/i,>
# ~- Y ^1 s' O$ x7 N% V1 r: {[*,
' M0 a+ M4 Z6 S[*,
. u$ m2 A7 `- m3 j; t( i6 E) s[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
( v" l5 {4 e( p5 c- c( r$ ~[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类( o1 M4 J5 P! O' F! L% ^
[*,! d: N5 ?' m7 t% l" i( H* O
[*,读权限
6 H. r( I$ f8 s' L[*,1 H2 c* ]6 P, g! P) c% s4 N! Y
[*,
: Z! I6 c1 x- J3 W; W* A# ?8 \[*,写权限
" @4 G& K, c, Z( i/ B2 j% c2 W# }: l3 O[*,
* w9 y/ P) W# x; ~. G, u[*,6 p) C# ? e8 D+ [# ~' {
[*,电话接收以及监听权限
- U4 h+ v& p% u2 H" y8 s4 ?[*,' s4 n, X' W& D9 R/ s( Z) U% s
[*,+ ~6 `7 p9 {' e+ G$ ~, C
[*,短信接收以及监听权限
) _/ L' f$ k% F! y- |[*,4 T' W4 }! x) I5 _. n' B' q6 V; U
[*,
, l0 k$ H5 N7 M[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
. g0 P+ ^+ H0 ?. p4 u0 S! ?[*,
7 q* D' _9 j8 ~ e$ K8 v2 }[*,
6 K/ v+ S J$ o# _+ R0 w% h0 Q0 c[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
( ~2 {, v* X$ S& M[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.6 P4 i' R+ r4 M2 K' B
[*,[font=宋体,所以需要这种方式./ m4 N4 i" q2 g' g8 t& W0 i7 s
[*,[font=宋体,在JAVA[font=宋体,中自定一个类
3 `- @8 [/ v. M[*,Class MyData$ V+ U+ L3 _3 Q! I7 E* ?
[*,{
' {2 E+ }9 z7 B, c" `[*,Public:
" M+ B& h3 d6 o; ~7 r. ~+ [[*,Int a;
3 A' u/ y1 C' P% e[*,Int b;4 W$ H: |* W6 B3 p
[*,Int c;; b- h. g3 |' e! y% k# `/ N* Z
[*,……..}; m% d1 w1 W; u& b/ [0 `
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明7 h" X4 _+ R' Q5 M
[*,public static native void GetData (MyData data);/ P; Q/ }9 X: Z# F. g
[*,JNI[font=宋体,层中声明
* O! d1 I' H0 z( T" f& I. u n[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
2 C n, i* y; c2 E7 F[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值) W! q* T# M6 ~8 _; z, @( i' i$ b
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");3 d' ^) Q" c6 |
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值5 F# ~" g( R: O$ N" ^8 Y
[*,env->SetIntField(m_pdata, “a”, 5);9 t7 k( ^2 L2 U' A5 @+ B& V
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.# ^" a* ?" D2 ^/ s6 ^1 O
[*,
( h. R( N6 A# U9 e[*,
1 n2 E& c) d" z) t8 x[*,6:[font=宋体,工程搭建
: Z* Y. P4 B& f9 T1 e[*,[font=宋体,首先编译引擎代码.
: c# z3 x5 }$ L5 F3 w0 C( I[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.- c$ \# S9 d' G3 S7 ^
[*,[font=宋体,需要重新 Cmake% {/ i* l3 ?, }
[*,[font=宋体,编译好代码后打开ZSDome1 O" z( M2 t) V( q
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
) o0 {1 X5 f. T[*,[font=宋体,然后直接直接运行即可. X6 b* C3 ?2 k$ l6 ?5 n X. K1 R% d
[*,
6 J1 r$ f$ M! p[*,对应接口! a) C" w$ _, u+ P, k
[*,Android
% p8 M/ X Z% X/ T[*,DemoInit----[font=宋体,初始化引擎$ `/ p+ A0 G, v' [% V. S
[*,Render----[font=宋体,渲染主逻辑4 B+ Z# f0 a0 y& ~5 n# _8 ~
[*,
5 U0 R+ Y& `; {+ Q- V/ A4 q' c$ Y[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
) u, _! J; [( h7 `8 E: ?+ W[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
U# D5 R$ G4 }$ k/ }) v/ d4 o[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
, W6 k: n" `& r. Z# M8 O8 Z[*,5 s5 y( b; n& Z9 t3 z1 \
[*,然后使用:
9 I2 S: U( J- v8 E5 d! o2 [; e7 L[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()$ l8 u" s& Y2 g
[/list,
[/td][/tr]