[table=98%,
. F4 T: r$ r: T7 s# D[tr][td]
( ?" ?& n: O8 r0 a0 c& \) N q3 S, A- ]4 a2 ^
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,7 v& g: k% {3 D2 [
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
Z' Z0 j; C A5 v6 B6 S[*,
2 _6 x. L6 G0 F* x[*,多点触控:
, u1 r/ M4 D- F D[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。& k0 l" Y a! g9 x! j8 G$ \
[*,原理:" H2 v, M7 \$ o- U
[*,Int pointCount = event.getPointerCount();, l( l: Y( G9 V' r" j' w; U) i
[*,获取当前的点击个数。% n7 {# g) H7 `4 l# R
[*,ACTION_POINTER_1_DOWN% i, m# r( ]- V; G, j* `
[*,ACTION_POINTER_2_DOWN% [2 k2 |% c' `
[*,ACTION_POINTER_3_DOWN
2 R4 q& g [) G/ t6 E[*,ACTION_POINTER_1_UP
, {/ S! @8 F+ S7 k/ |% Y5 a[*,ACTION_POINTER_2_UP
6 x3 v6 Y* q1 t9 h& g8 f[*,ACTION_POINTER_3_UP
9 r8 c' `% R4 I[*,ACTION_POINTER_1_MOVE
% k% G4 O( r7 d% O" s[*,ACTION_POINTER_2_MOVE2 ]; q/ v {' u1 Z+ ^: E4 T5 `
[*,ACTION_POINTER_3_MOVE
1 ~/ X) u2 n" C4 u[*,[font=宋体,获取各个点的事件响应. g, G' p$ z+ W7 t9 T& f. c% C
[*,
" r3 _" ^0 z. f+ J% m1 k8 @+ b[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
. k" Z6 i7 ]8 H& A6 t[*,[font=宋体,同理第二点也一样。
, S q/ J0 |' G/ b* `7 H9 b0 _$ s[*,+ s6 Q) Z8 u9 ^, A5 [+ P
[*,2:[font=宋体,安卓生命周期
/ E6 C; e t/ x0 {+ P6 n$ ][*,[font=宋体,默认的安卓生命周期为点击应用图标
4 C0 U2 \& ]9 n7 p* n2 t8 F# A }[*,OnCreat OnStart OnResume; |* ^, ^( y" \: A% z9 N9 w
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory9 {2 B' J9 }" \" O; u5 C+ M
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
* z% \0 ^; Q1 u* U: I* x[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到, u& y. w# `" K. j+ f, L
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;( W& c3 W! Z+ O4 I
[*,[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,就可以了不要让他走周期流程
, Y2 W0 ~( H; E* @/ ~8 [5 |[*,8 m) Z+ }. i( G3 s4 ^$ V- f9 M
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏+ Q. r1 L# T- v
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
2 l; D" M& C+ _' L$ k[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.0 b5 D8 T6 T0 ?! Z3 t$ m0 d4 F3 c
[*,[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,.
" Z1 D/ ?* h4 t. g7 N% x7 n[*,: \& v' G0 g$ O2 u6 ^( g6 O1 R
[*,[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 A9 j% Z" J# e) g+ P/ k. }[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加2 B' p+ @& ^- y# I( |. E# L& M- A
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,7 F* m. d' R% Q, b
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
& ~* B7 u* A3 O. l[*,android:screenOrientation=[i,"landscape"[/i,>
3 `* h. e3 {; J2 c5 j[*,
9 w, m8 M) o/ p0 c6 l[*,
7 V- w5 b. d: I9 q; m[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
6 U5 Z$ e/ Y8 ~) A- X( b5 O[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类8 _, H4 ?. M6 e, Y* w; k
[*,
# ~+ @# ]6 i5 ~5 {( }' h1 O% W! ~[*,读权限5 Z: t) i" h3 b v' U" E# d/ R* f* s5 d
[*,
1 o0 w' w% K; U( W0 _# E[*,
@& e$ A. s/ ~3 t[*,写权限( @7 z: K/ f' H2 x: ]
[*,% H3 A, ~8 Q3 I+ e" J0 O
[*,
! R |: l, T1 t2 R& Q" J[*,电话接收以及监听权限
6 \( S i5 D7 Y3 z: ~4 f$ c[*,
4 O9 X. D7 Z: v# g[*,
" ^; F7 p9 |, |& {1 ]1 c4 A$ d[*,短信接收以及监听权限. `# w3 E1 ?$ p, g& I7 I+ l
[*,
! Z6 |2 l! Q1 a _, o[*,
( a/ i' C' P# v' a[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页' u1 |- b% A2 l; Q! Q q- {
[*,% r0 K! @* C [ t; [
[*,
3 v" X5 J; a+ I: L* j1 N. ~[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
; \+ C% f0 g, u$ F, e4 _# i2 X0 X[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.4 p- r1 `" r0 ^
[*,[font=宋体,所以需要这种方式.
0 K: `( e* S2 B. ~" v0 b: X. X7 h[*,[font=宋体,在JAVA[font=宋体,中自定一个类
/ F1 K o3 c6 d z[*,Class MyData
$ X: { `( P& k6 |[*,{
+ H$ x5 d$ r ~* l0 L1 }2 J[*,Public:7 s( x& }; _5 u* `7 H
[*,Int a;8 E9 I" k$ m- B6 k u
[*,Int b;4 h" V4 j, B, R+ N r r0 F' P7 a
[*,Int c;, O! A/ a) d' b2 l
[*,……..};
' x/ E$ W& s. Z: b[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
5 b5 ?: V; L% \% [. U: s# Q, M; ^[*,public static native void GetData (MyData data);3 ?5 q f9 L0 W* E
[*,JNI[font=宋体,层中声明
+ W. A% ^+ B0 W$ N& E0 d8 v4 [[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
2 G" k' s: |3 l4 C8 p[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值8 U7 w0 v% R i7 C$ t
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");
6 r5 l& z1 h! y S4 U3 |[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值% E4 l) F* L- O m. J/ g* z& H. Y
[*,env->SetIntField(m_pdata, “a”, 5);
f, b& _: t9 k: Y6 H& \2 a$ i[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.! B3 K% p0 g* {: S6 k; L F
[*,0 Y8 ]$ [+ X+ i8 `3 S/ B& b
[*,
1 @5 t# k" _5 C$ M' q$ J6 O[*,6:[font=宋体,工程搭建
$ `( Q1 M8 i g+ y) a3 c% U[*,[font=宋体,首先编译引擎代码.7 [ _2 Y$ A1 ^9 n/ v9 k
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
. j: l# |0 Q6 k3 c+ ? s[*,[font=宋体,需要重新 Cmake
# T( x" p$ \7 S5 t/ H[*,[font=宋体,编译好代码后打开ZSDome
2 C; r! [( o+ A/ h u/ G" |[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
5 v1 }) q9 E9 n3 v( V[*,[font=宋体,然后直接直接运行即可." A4 i$ s& \% ?/ h* q
[*,
9 e" D! V3 V5 h9 @[*,对应接口
8 g' L g' E; \! s$ b5 [8 c" t[*,Android# u) |) F0 o( i1 m: c$ L
[*,DemoInit----[font=宋体,初始化引擎, O- Y1 U8 ]) H4 a) K( X
[*,Render----[font=宋体,渲染主逻辑/ T4 p" q6 v. j) Z! R
[*,
8 W0 t# _# l7 R1 g n! J[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用3 b7 [ J6 e9 F7 O# u
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
9 Q& {- o# F1 z% o! M[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
2 {% K$ i1 n( o$ p# t6 _( e[*,; t* m! A" C6 V) F
[*,然后使用:. ~9 C% T/ h l6 \- E% O: P1 B+ G
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()
6 W# g. H( f- ~ Y X7 R. c# ^* l[/list, [/td][/tr]# E: W% c R/ b0 w
[/table], z. \6 h1 K! Z6 \& L
' M$ k4 o, Q& _7 n9 [) x+ s
3 A' H7 V/ M0 z' n# u+ ~6 e
|