|
[table=98%,
% F z( _" t" I1 Y8 Q. X0 }[tr][td]' ^7 M2 L9 ?8 A: f! l
4 p3 n8 Q7 T! I2 N: I0 H5 S
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,( c& S) f( W3 t7 g4 N
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案" \# B* } }$ R! [9 R: F9 {
[*,
5 q6 ]5 i( T/ |' I[*,多点触控:
/ Q+ t! u; J0 j/ y% c9 f% S k[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。7 J' D6 F/ Z. H" `
[*,原理:
- o3 x3 O, W3 u4 R6 \[*,Int pointCount = event.getPointerCount();8 ]9 Z4 Y8 I. @
[*,获取当前的点击个数。6 S/ M# n( N- \+ }
[*,ACTION_POINTER_1_DOWN
9 H3 \' N( N; h; f f" \( c[*,ACTION_POINTER_2_DOWN
3 H; D$ g" e; P[*,ACTION_POINTER_3_DOWN
W$ \$ @$ h: f- i% u$ N3 C& z6 a[*,ACTION_POINTER_1_UP
* t- j: Z) B- _[*,ACTION_POINTER_2_UP P8 |# T( G/ b% l* g8 L$ a5 |
[*,ACTION_POINTER_3_UP) N X- l0 p9 W. v/ Y0 q& j4 u
[*,ACTION_POINTER_1_MOVE$ r( Y, ?9 F" ~* S+ K3 V
[*,ACTION_POINTER_2_MOVE2 B; ?" F$ _* R2 `9 I
[*,ACTION_POINTER_3_MOVE
0 j k4 ?7 Y, r; o8 K( X[*,[font=宋体,获取各个点的事件响应8 H* B: F3 C# y+ ^# j, _0 w, e
[*,. D! H! N, n5 x& J, \* }" z% l; C
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。. U* \8 R7 E) ^* w
[*,[font=宋体,同理第二点也一样。
0 R; e5 i" W. _ q" Q[*,
4 s; `$ p: i0 x[*,2:[font=宋体,安卓生命周期0 z' N" d" N$ `, b1 e7 r+ M2 k
[*,[font=宋体,默认的安卓生命周期为点击应用图标) B* Q2 g$ w4 R6 T$ t) z* Z
[*,OnCreat OnStart OnResume3 F& B! Q$ t. T* C
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
1 W9 U6 [! c0 e3 @# u6 p3 j[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.% i6 E9 `! y& L' ]5 M* C4 o
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
7 ]2 A0 m/ ?0 w" [, D; y* {: J# B0 |! m[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;: } l9 [7 n! p9 O. C
[*,[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,就可以了不要让他走周期流程' Q. t; {, i! j# T3 b
[*,
0 I( D% q# F" h* _9 h6 ]9 D! Q[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏
+ G# ], H$ G6 ^' P[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
; R: X4 m+ E8 T[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
. x _) E# L' r. 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,.
3 X' v9 x6 h& S& f( y, J2 e1 Z[*,% B* W# V' d. z, {
[*,[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,具体写法0 A/ G# a9 u& U
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加% m* d, x. s4 K' ]
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,. i: K/ F0 H1 g `: B A. x
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,7 r0 Q# } P+ L2 _
[*,android:screenOrientation=[i,"landscape"[/i,>: j& o# V6 F- O' K
[*,
( A" r8 W9 i; N$ S" p" T' J[*,8 y/ N' y/ u7 V! s/ V' e' m
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
- r) e6 v3 }' V: `9 }[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类
- P9 f" } g; m2 h4 G[*,+ c; b% F( I8 Z5 K3 X% R
[*,读权限' e% u% ~2 T$ S n7 T% H
[*,
5 f3 b! |* T0 G# T9 s3 a7 `[*,
2 ~: M, l% e6 d+ w2 f8 |[*,写权限
: \, ]4 ^7 a1 z( W9 R; L T[*,1 Q7 X1 U+ Z9 z
[*,' |0 F4 G" q: j) p" H/ E
[*,电话接收以及监听权限
" `( Z9 M7 }" ]& l4 J ^9 k[*,* q* R* T: m5 X( r
[*,, i7 [ q t; y; ^4 N7 n6 E2 P
[*,短信接收以及监听权限
& @ O8 C. w5 G[*,1 h0 U' R1 R, ?
[*,2 j* Z% T) c" T& ^# b6 Q8 o+ p
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页* t3 e& d+ f: m. ~% I, z) e1 N
[*,0 J& }9 S$ d+ ^: F7 k1 v* H
[*,# w+ ?$ M' h. i f$ M( m' K
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互1 ^; Y% [ ] Q8 w9 U( D) y) S
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
+ d' g5 { I! K9 V2 h[*,[font=宋体,所以需要这种方式.
6 h. t" L4 I0 g[*,[font=宋体,在JAVA[font=宋体,中自定一个类& s7 I3 E% `8 K4 a" {' A
[*,Class MyData1 e# n D$ O8 C- N& J [) C! ^
[*,{5 ]; b% y1 ~/ Q( u
[*,Public:6 V; v& Z' y3 v9 ] F0 |* v( h
[*,Int a;' A% j% X! a. |; S7 x( f5 H& W7 B
[*,Int b;
. e$ S" u4 F7 [! i' O" a[*,Int c;
" p- n/ m) C/ T' m! C$ c[*,……..};& K$ W- v2 z3 j- d) m2 Q% {. A
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
& \8 K" Y2 f6 Q% W3 Q3 i @4 z7 [[*,public static native void GetData (MyData data);6 E8 S; M I" `$ @, Q
[*,JNI[font=宋体,层中声明8 @" z4 |7 u5 }, ~$ f# z
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)# b! n' e8 {- h, p7 J7 n+ a4 ~
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值; s% S# @9 R+ h# @
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");" b6 n; \+ J0 A6 ^ i2 ]& O
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值$ O% o# F! s/ M2 @( l }/ I
[*,env->SetIntField(m_pdata, “a”, 5);+ Y5 J. |% j* U, D5 B- d8 O
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
# d6 \4 l/ c. S- _[*,
1 i' E+ i" |7 M; f) r[*,) t0 V2 I7 e7 {
[*,6:[font=宋体,工程搭建0 A9 u( M B8 U# y+ N6 |6 q
[*,[font=宋体,首先编译引擎代码.5 z+ T, Y8 h. e
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,. b, t, K* ^9 k1 L: d/ l* I
[*,[font=宋体,需要重新 Cmake
* z: K% H& I, _0 j8 X9 t[*,[font=宋体,编译好代码后打开ZSDome9 V! Q ?9 }$ x# V" `- V" f
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
- Y) q3 j" a$ E) Q+ x; e[*,[font=宋体,然后直接直接运行即可.
( G& H* n1 o! [5 S+ N( R' V[*,' \' P9 V; M% Y9 p+ x, n/ F+ v
[*,对应接口
, K' z+ f% |" h! C8 [: d[*,Android, j. K/ e9 y0 W ~
[*,DemoInit----[font=宋体,初始化引擎
_ i$ ~/ q. N! a[*,Render----[font=宋体,渲染主逻辑
$ x! f7 }* ?4 Q' V, t[*,9 y& H" P+ ~( L* ?) C/ M" Z
[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
' f, M' T. R- q* z: s H[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
( k7 z: k3 |' D7 S, D$ e[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
- C" \1 K V2 ~) w9 Z[*,* g- Z9 N, H* l9 F' l; Y
[*,然后使用:: T8 {2 u$ d/ H1 ~' k% u2 p
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()( X; z$ D: q) Y0 h, g- {7 u- \
[/list, [/td][/tr]
8 ^7 c4 w) l( M0 r! h, Y" n0 i' m1 v! V[/table]! @: J1 e7 s2 B6 R" f, W6 K3 J
! V: p0 {, r9 F1 b% \. w; `
/ O" C% \' k/ ^$ s7 f" g# d |