|
[table=98%,
0 Z$ @- k6 j9 R1 f' S& L( a( R[tr][td]
4 J" |2 l( |$ G3 _: R. ?; [" T0 O- J
3 `- d/ a! R! F% A2 \0 H/ |. u[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,, E4 W3 M- Y7 Y6 U2 Z
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案- S" c3 }" ~. T+ v9 a
[*,0 S, r' Z8 [$ n& c
[*,多点触控:
2 ]( e- l# Y" ^ ^" c, O! W$ ~[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。: S# l; S9 B: a: J6 o2 y- C
[*,原理:" G9 \* c: F' H4 C$ H
[*,Int pointCount = event.getPointerCount();- I' W" e4 w- v$ I, x4 Z
[*,获取当前的点击个数。
) U4 t7 l( b) L; x N; k' B[*,ACTION_POINTER_1_DOWN
1 S' _( n" L* _6 c2 Z) o6 {6 [6 r[*,ACTION_POINTER_2_DOWN0 B. P/ Q; V5 C/ B
[*,ACTION_POINTER_3_DOWN
( R" @3 t% R/ c' m1 o m[*,ACTION_POINTER_1_UP; X! F6 K! h3 }, `; J O, o
[*,ACTION_POINTER_2_UP9 a. q3 I+ B: M8 }0 L; y
[*,ACTION_POINTER_3_UP' p% y" k5 Q0 y3 p9 H9 b
[*,ACTION_POINTER_1_MOVE
* ~' m+ G7 j2 M# k9 }[*,ACTION_POINTER_2_MOVE
- x4 E X' Q' A$ j. L9 N% ?. i[*,ACTION_POINTER_3_MOVE
' p$ z) p# A W& a8 M[*,[font=宋体,获取各个点的事件响应/ Y9 }+ O+ [/ k6 P4 F/ w x
[*,0 B, y; Q( w6 s! `: s. S7 z, r
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。) ] u5 P, o/ i0 Y- w; @$ s
[*,[font=宋体,同理第二点也一样。" {- T0 X4 J, {% e' d1 y. T
[*," {9 t' v: f, X2 d; ?: S. C
[*,2:[font=宋体,安卓生命周期9 y+ @; {9 M2 F
[*,[font=宋体,默认的安卓生命周期为点击应用图标2 L1 r1 z @/ N2 n9 S8 r8 s# `
[*,OnCreat OnStart OnResume k) Z1 ~3 n2 y" T' r
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
/ J0 c% e# x- x# Z( `& E[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
9 }. Z$ O1 N% G$ @[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到+ b9 B9 G9 o: k
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
, h2 `1 e# \! { \5 l[*,[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,就可以了不要让他走周期流程! Y. W; c5 U8 k6 j8 i8 I n
[*,
" ^& \ k& l9 ]4 Q[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏
) g S' t/ e3 x# ~/ e[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
" h4 W- G2 X w1 R[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
6 }0 b+ J: z; @* o, f; n[*,[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,.
1 N& i* q1 ]1 Y[*,
3 W4 V6 ]6 G0 C; k[*,[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,具体写法6 N. C& f$ z" c7 M8 N
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
# x3 B+ ~4 Z% x+ \0 {[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,
* f; {; y! g. Z( M! i5 E[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
( C$ g O2 {+ C$ L[*,android:screenOrientation=[i,"landscape"[/i,>
& _& x }* s9 [) @8 l& w2 G[*,% X% O' q9 e: R$ Q1 R
[*,
' E; |- O2 b" g) _[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限: |$ d, j( E% Q( k% U. [# Q8 l
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类
5 M: D8 Y8 Z' H( p A5 G[*,
# D2 b' \ N4 U$ u0 K8 W% ]" H[*,读权限' E6 e8 A, l6 u9 a; \+ K. X+ o
[*,
% g! |* w2 Y( j2 U% O[*,' S- h b# ?6 `( {: S3 r2 n
[*,写权限
, ^9 I8 N C* Q0 F[*,
" n6 I" ~) ^+ O[*,
6 @2 Q7 |) L: c: y& V: K[*,电话接收以及监听权限 p4 V: \6 ~$ L- o6 n9 }
[*,4 f0 ^ X/ s( S. j
[*, m3 T' G- a' W2 q
[*,短信接收以及监听权限
7 j, a& u) I2 n, u# X[*,
& C9 m9 }& }, ]! Q+ L/ O* _5 q[*,
# m7 n+ {- a' ?( J* D[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页2 W. ?+ t3 U2 n; W w# D8 X
[*,
5 |0 i# d% Q: W, f% d' |. ?1 l[*,
R. K. Q8 U+ r* @2 q* E8 S7 Q- A5 L[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
* e* t3 ~- }" X6 v[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
0 f k* W/ w( z2 W4 l" }[*,[font=宋体,所以需要这种方式.
|) g/ f; o. l4 |9 x1 C[*,[font=宋体,在JAVA[font=宋体,中自定一个类
$ V& {' `* Z7 q# a. Q7 {1 }/ ][*,Class MyData
0 l+ k4 M- b: A6 T" ^; a4 ^[*,{" H. q% `. N$ P/ u5 t
[*,Public:) }, T T* t. w$ D* K
[*,Int a;
7 f3 ?% l& |: }2 }' r[*,Int b; n' x, S/ w; \! w t( z
[*,Int c;
! L( x. ^2 P6 I& ~[*,……..};
1 S6 e; [% z+ M2 E& @% \[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
, J& N: Z9 i: V7 b[*,public static native void GetData (MyData data);
6 B0 N: y; H$ I* Z$ L( @[*,JNI[font=宋体,层中声明, e) j7 A( a7 `# w4 Y- X* }# \; L
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
' N; K% C* e9 t7 ^[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值7 N! K Q. r @
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");
' N, x. ]) ^1 {* E6 `4 z6 o[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
$ m# Y, _+ ], U[*,env->SetIntField(m_pdata, “a”, 5);9 T2 O+ Q$ k! B0 Q
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.( h3 W6 L! o& T) i* _3 ]/ L
[*,0 y5 S- Q0 Q1 [. V1 O3 ?3 t
[*,9 p1 o. M: C) p9 ?$ I! D. B5 T
[*,6:[font=宋体,工程搭建1 ^: @5 @4 Z' j3 Q
[*,[font=宋体,首先编译引擎代码.6 q" L5 l2 V5 j: `
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
5 ^+ b- o6 _" O- N; I[*,[font=宋体,需要重新 Cmake
- _9 p# l6 L) v[*,[font=宋体,编译好代码后打开ZSDome
7 W$ W0 |3 z3 M' f4 a0 w[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下9 J: Q A+ O7 c1 d& {0 |" T8 s
[*,[font=宋体,然后直接直接运行即可.
7 G- n" A3 ]6 n) ][*,
% i) \+ B" m" G& e1 @[*,对应接口. D" A/ B R# B8 N5 u
[*,Android- W# d, ^) P( ^# o+ H
[*,DemoInit----[font=宋体,初始化引擎
0 i% b' L3 E7 P; h5 P( Y$ j+ h7 r) R[*,Render----[font=宋体,渲染主逻辑0 q% {3 H1 K8 P! u4 \
[*,
] c+ B* i% S- j1 z[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
' l& k: c+ J# N/ o* g) j, H5 N[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib# g' A q5 M+ [4 v l0 J
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
/ h$ d! P4 j% p( O* m+ E! d[*,
+ k8 ~; ^9 Y# C; }3 R c: s; v[*,然后使用:
# A- U! J( o8 B- e _/ Q b5 Z% y( P[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()
4 n8 U# E5 E* Y" d[/list, [/td][/tr]
: y- B3 `" \$ Q. c# K: Y5 i[/table]
, ~, U+ ]6 u/ I# L9 R: m' k3 p5 a# K! g" G/ h l
3 ?. d' K3 Y' L) _ |