|
[table=98%,7 r6 q+ @* q$ ^+ P
[tr][td]5 }( ^: J6 t9 @, v6 b
1 d; s- F q7 b
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
6 Q+ r$ N& y }; ], c$ c[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案* v8 \+ J0 x" E
[*,
9 g# Z3 o0 W/ f" M+ B5 @[*,多点触控:
" m0 U# r2 E. s v[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
+ P U4 ]5 ^# ^, ?8 O3 l[*,原理:
, }# z) Y! D* P- e ?% A w+ m5 q; L[*,Int pointCount = event.getPointerCount();; T: x4 v+ d- C
[*,获取当前的点击个数。
. n/ a. H# G7 j6 R7 @5 g+ U- G[*,ACTION_POINTER_1_DOWN3 i f0 k2 ?+ A% G) U, \7 C
[*,ACTION_POINTER_2_DOWN& r' l1 W6 g! X) h
[*,ACTION_POINTER_3_DOWN! M* W- v1 N; I* V1 o3 j+ X- b! _
[*,ACTION_POINTER_1_UP/ O& Z* g. q) m' f5 g
[*,ACTION_POINTER_2_UP
4 I6 C# f- k4 f. ` r8 U[*,ACTION_POINTER_3_UP% K' U5 D) h- r5 `
[*,ACTION_POINTER_1_MOVE: J1 V1 O9 g% p. d
[*,ACTION_POINTER_2_MOVE
2 V% h, E8 {9 g% _; a[*,ACTION_POINTER_3_MOVE; T9 |* d: B9 j6 D/ C, h) \
[*,[font=宋体,获取各个点的事件响应
: O! r; p& n" m) Z( o; f[*,0 N$ a7 |1 w' Y3 H D5 l. L$ o+ S1 M
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。4 H8 }# f# Y& f
[*,[font=宋体,同理第二点也一样。
/ A s8 M9 X! g# `[*,
) R( x7 |: [' o g7 I3 s W# M) w[*,2:[font=宋体,安卓生命周期
/ r2 `; r( k; Y[*,[font=宋体,默认的安卓生命周期为点击应用图标1 l; H' w+ H# y0 W7 C3 z
[*,OnCreat OnStart OnResume9 j( b& L! Y' S" J# s) t
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
- J) w+ T( u8 K8 { M[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
~1 r3 E( W1 s/ R: G; k[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
6 u( `$ Y: s+ z, L% h/ W[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
& Y1 Z, f+ D* s* A' R; x* w. C' x% T[*,[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,就可以了不要让他走周期流程; @2 L! x9 s6 O: [9 ]
[*,
6 s: J7 X& B" B1 B' G[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏
! L; h) K2 w! |! q[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的./ {/ u0 \+ P) A; e1 G1 F7 s/ X
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.9 C+ X9 ~% I+ B, ]2 M
[*,[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,. a! v+ \! L6 Z0 ]7 g+ C6 Z6 y9 |
[*,
5 |1 k8 K- q* \+ M B% b" p[*,[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,具体写法
5 } v# Y9 O2 g9 {* q5 H! T$ z[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加1 e& L& L" @5 A- n1 _" H: }2 d
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,; f8 O" _, D0 v/ x% i) G% N
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
/ P) u, q6 P) \: o) D+ E[*,android:screenOrientation=[i,"landscape"[/i,>8 l1 V0 ~ u/ E, t+ v& w
[*,
) R" S% g6 g: m% K! C2 F5 L[*,3 j. K# U: r3 K, r
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
- Q, k: W+ b4 y8 W+ D% ]4 I[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类$ e' c) x/ H# I: u3 |, \3 X7 q
[*,
5 x0 u! u- W4 j8 Y1 a' o[*,读权限 _. Z0 E, e) ^' X/ P
[*,2 A2 m, S& f( e6 k( H6 D6 T
[*,
, A& u* Q( k5 Z3 @3 m[*,写权限+ e6 v7 Q. r: c, w
[*,7 ~4 E }3 H: a# i, A8 C: ^1 K+ U
[*,* \8 D* h7 `8 S* P( ]. \& `) e
[*,电话接收以及监听权限
6 y$ b8 t6 M& i& H L$ B/ z[*,
9 G5 R0 q8 n: G& \% }[*,) }$ I8 f( O2 o3 b7 q
[*,短信接收以及监听权限
( }% w m6 M, V1 p, |[*,
9 q% E, v# y) V[*,
( i' p- Q7 l' g' r[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
2 W& \5 o$ w7 k) u* k[*,6 D/ C) K3 ]& o% t) f6 c4 X+ d
[*,9 Q2 f$ j( ^* h% H( h" W
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
5 R' e8 P% M$ u, A[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,. g* g5 [- M1 m& R$ j
[*,[font=宋体,所以需要这种方式., \; f7 S d- `1 V
[*,[font=宋体,在JAVA[font=宋体,中自定一个类7 m5 g" _" U/ r: p6 i
[*,Class MyData
8 \. ^* \, [& f! v- J- i0 \* Q[*,{8 Z! r& E: A& N0 k" [- v3 T
[*,Public:" t% ~0 z- t3 n# R
[*,Int a;
: A9 R# V; n1 A5 X1 }[*,Int b;
$ A+ x* H/ m7 D5 J& S[*,Int c;2 M3 Q. o# R0 R' z& A0 O2 t
[*,……..};
6 a& @' ~' U9 j6 ?9 ^- b, T9 S[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
- x. F8 {' T$ S; W[*,public static native void GetData (MyData data);4 {9 n7 k2 Y! p
[*,JNI[font=宋体,层中声明 W; j- K" g/ T- k; k
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)5 {% q# o7 M! V4 p
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值% j" ~) x" W" X7 p* i
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");# Y1 o) r- x; q2 K
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
6 j% I, U3 [; Q I4 Y* H[*,env->SetIntField(m_pdata, “a”, 5);
: H" ^" q4 F; q9 u[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.) S5 A( j! N' w- M7 X
[*,: Y" Y0 O7 ]( J5 H3 h; o# X& x$ {1 B7 H
[*,- U7 r8 \4 M2 x5 L
[*,6:[font=宋体,工程搭建
8 H3 p# q6 d$ P# x[*,[font=宋体,首先编译引擎代码.3 [: X' _: Q% l1 {
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.4 d4 N9 k% ?7 F% ]# w' F# l
[*,[font=宋体,需要重新 Cmake# S1 R' |% {/ i* D( v9 I* l
[*,[font=宋体,编译好代码后打开ZSDome
) k: C- A, u; D2 L, e1 F5 M9 O4 Z[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
% h4 {' B+ P; |5 L[*,[font=宋体,然后直接直接运行即可.9 P) Z3 [' H& O3 C) x
[*,
+ s; z. Q, ^5 b l& v' }[*,对应接口3 G( {9 y# {$ U0 \# E9 r
[*,Android
3 ~2 T/ p- V1 ^& X* t2 r[*,DemoInit----[font=宋体,初始化引擎
1 C* ]9 G. V& j- r0 l h K[*,Render----[font=宋体,渲染主逻辑
$ ^ X4 x+ y6 F5 y* K( U[*,
/ K/ _7 x# _% C2 k5 g% A[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用. o5 k& r3 X( s: v5 f" ^5 M: r
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
- ~" e R' U \, }( k2 V[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
/ c5 s7 S" B: q" f; X[*,
- @- p7 `8 g4 P# Z5 T[*,然后使用:
: B3 q$ u6 _ [ A3 ]! N% s[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()6 J+ B6 q5 f- L7 H
[/list, [/td][/tr]
9 K0 j2 p4 ?# ?& E% I* `[/table]6 e$ ~2 E* N+ |5 q! i. Q4 O* U) n
8 A. A$ V- ~8 F9 E+ A0 U
6 p2 ?, c" m2 X2 w0 Y2 ]* i |