|
[table=98%,' ~ L6 C; I! |7 }4 A( y
[tr][td]
' F/ B: M+ Q+ D1 `, h B8 b9 f0 [# e- I4 `
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,9 G: Z: Y8 O0 P/ W& k9 y
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
% P [0 `1 p9 T& B" C0 k8 I. e6 w[*,
9 u C( r2 D1 z. L. m[*,多点触控:
8 b5 k# V4 c( C7 J+ }7 ~[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。2 W4 x" i0 s( I3 \. c _
[*,原理:
2 | a: i- M! k5 a/ Q' L[*,Int pointCount = event.getPointerCount();
, E3 I1 P7 H4 _8 P) A[*,获取当前的点击个数。
, E1 H- T4 g- \1 T; J' a[*,ACTION_POINTER_1_DOWN: N% R3 W9 z( h+ G9 M6 P& U8 L
[*,ACTION_POINTER_2_DOWN
/ P J" B) N* a4 {[*,ACTION_POINTER_3_DOWN8 _; m+ c; N: d) b+ B) H# u
[*,ACTION_POINTER_1_UP
) T: j; D9 o7 w' o O4 u+ o[*,ACTION_POINTER_2_UP; D: {: Z/ r. {& K
[*,ACTION_POINTER_3_UP
- |/ L0 B% Z) ^$ U0 b[*,ACTION_POINTER_1_MOVE
5 F5 E k! x2 D! \5 z' ][*,ACTION_POINTER_2_MOVE/ ~' n; a. J3 |# z! f+ x
[*,ACTION_POINTER_3_MOVE
2 ^% m4 k) I/ n0 y/ V' z[*,[font=宋体,获取各个点的事件响应, z k7 z6 |, J) u% w$ t' n
[*,4 f. X/ y, Q( }4 T4 @
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
. `9 ?: n! A6 O3 I8 Y[*,[font=宋体,同理第二点也一样。1 k% F: b- H$ ^- O/ K S0 y" N
[*,
# w. L/ O' y! R5 z[*,2:[font=宋体,安卓生命周期
d! M; U2 d( B V- v[*,[font=宋体,默认的安卓生命周期为点击应用图标5 H2 f% [+ [: l5 K( ?& F9 B0 O& m1 Q
[*,OnCreat OnStart OnResume
! l( g' w, e' [[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory% r+ g+ z* j7 |0 V6 Z* i
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
7 R& ~9 E2 G* I" X9 f" C" L: h# g[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
. |% S: t7 B% \4 G9 K[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;1 |2 t, ~" \6 ?, r9 I; Z/ @! f o
[*,[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,就可以了不要让他走周期流程
; @' f0 E* k7 h* ?[*,) A5 k6 j# P2 a$ A' _) s
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏3 ^; C$ F( B0 Z' [: J* y9 l
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的." Q! ^* c! u; U3 G- G1 k- h
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
& c6 i& h. U1 ?$ y* g! ][*,[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,.- H% a% y0 _1 @) p6 i
[*,
3 D' m( ^$ {4 {" a# Z1 ^[*,[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,具体写法9 l- B1 x5 l6 D5 M! Q) o1 O6 Q+ C
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
# k( |. B6 s# V) r' b7 Z8 v# q7 X' x[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,
: T7 e H9 A' H* R O[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,/ M s& ]8 S. u
[*,android:screenOrientation=[i,"landscape"[/i,>
7 h3 D6 \0 ~: s; q f+ t6 @[*,
/ s0 f, {7 J" F& K. M9 R0 u# e[*,3 w* F+ Z5 m! g* N: A7 @! [
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限) X, h0 Y5 ?0 y
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类* D9 T% D5 y+ b) ^
[*,
# ?* J. ]' U% G" ?0 g[*,读权限2 g, G, ^" @7 g+ K2 E
[*,
k; }( l: ]1 w" K3 |* Y[*,
W3 d- ~/ W6 z' ]3 Y6 c* f[*,写权限
4 V( c* f" Y$ ] n" S8 e[*,
( ]% B/ Y! T! r" u! }8 f[*,# a, y* X5 \9 G6 R& x. }$ F
[*,电话接收以及监听权限% h( m- s/ O" B" a; d [: z9 B
[*,
4 |5 B+ Q1 ?1 }/ Y5 S. Y[*,& s" }! y1 p4 [9 W+ F' R, \9 p( ?
[*,短信接收以及监听权限( }; h. ?( `. Z7 B8 B: U8 X- G* N+ i
[*,+ C3 L% `# t% K/ O- R
[*,
+ @# `) T, n0 j3 }5 A[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页% U/ Q4 ~% A) h
[*,
' \% x2 v, u! A* W' Z, k[*,
6 P3 o% B% r* D) P- u7 o' |[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互! J; L! H% j# r
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,., e/ s) O; @3 x
[*,[font=宋体,所以需要这种方式.3 f6 ?! _! n# b A
[*,[font=宋体,在JAVA[font=宋体,中自定一个类# }) r X7 Y; Q! Q$ c3 B; a4 z
[*,Class MyData8 W1 X3 f; W" [1 `
[*,{4 D$ b8 Y( x' w, b* k% h- H
[*,Public:8 [8 g. E* s0 _0 j. o, J
[*,Int a;( q1 u. ]9 P$ V' b; O- f
[*,Int b;
/ h0 X: N# e. \. a[*,Int c;' V& }6 G: C0 d' f
[*,……..};
( |- E5 Y$ r# Y[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明3 A( C# ~# ~$ i5 p4 V
[*,public static native void GetData (MyData data); q' J% b# f9 |) S7 A% r$ z3 S
[*,JNI[font=宋体,层中声明 o; H0 F2 S& s& {/ }, [. b# k2 Q/ G
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)" D$ c1 h [1 Z7 H
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
7 R& y* J9 z4 R8 P4 y$ W; T1 h[*,jfieldID sound = env->GetFieldID(cls, "a", "I"); u6 m" u4 ^, h7 k, I! n6 } m& g, a
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
) Q$ @/ B& J! s5 C[*,env->SetIntField(m_pdata, “a”, 5);
# g6 B8 c) R& i" @% h[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.0 q) q- p8 q( F. @0 S
[*,' D0 x `4 X3 Y' f& |
[*,
1 O9 k7 l2 B+ }, s" W[*,6:[font=宋体,工程搭建
$ V) ?3 o" i1 u% U& k* j3 T. l[*,[font=宋体,首先编译引擎代码.( S1 @& [7 u# b8 C, s1 Y
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
% V7 g1 c6 Z" [/ x8 j8 J( |9 n# S[*,[font=宋体,需要重新 Cmake+ o7 s- k9 u5 c) T
[*,[font=宋体,编译好代码后打开ZSDome3 g- z: n% k0 |: T$ o
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下( t$ N( U" {) f* z J" b
[*,[font=宋体,然后直接直接运行即可.0 r8 [0 F1 {5 c+ c/ V4 `9 o$ f
[*,& _+ K5 Q' M% O& v
[*,对应接口
* K! J/ M, E5 B3 U[*,Android
a( {6 N0 S9 M! O* Y[*,DemoInit----[font=宋体,初始化引擎/ I* I" X& c T6 x3 o4 _$ o# g
[*,Render----[font=宋体,渲染主逻辑) l- J O3 n! H: d! M) x2 q
[*,
1 P" }" b6 G4 \$ w6 y[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用( ^! o% k. E) V! l, P
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib3 R% {6 ]. R& B
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a- o- ^9 K, {/ Q7 T) Y
[*,
" o0 {# \% O& n. u) f6 ~8 N[*,然后使用:
7 C7 ?/ s: D3 g4 A$ O[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()
( U7 V* p* U9 k4 ^9 @) r[/list, [/td][/tr]3 ^) ?8 w& D% Z3 X& o
[/table]8 J" q* W1 r { a
|2 v) W8 H, I4 L' V7 G- [3 X2 w5 p+ D) G
|