[table=98%,9 Z7 W8 x2 A9 p. ~( X7 i, f
[tr][td]6 z( x& Q$ w. w; N( C" O
+ s* `! G+ [3 ~, X[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
+ A9 E, M5 S: S/ o8 t7 W' X[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
! ]2 }$ a8 E9 U' n3 k[*,
; m" R* H1 U: U _0 N[*,多点触控:; }) |7 v) x8 X
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。+ ^! V6 `2 m( V6 d9 ~
[*,原理:
, p! d3 D2 E& \3 J* }) A- I3 P[*,Int pointCount = event.getPointerCount();4 i6 A/ ^4 n# e$ e0 H9 } X
[*,获取当前的点击个数。1 L' N; o$ n9 w. x
[*,ACTION_POINTER_1_DOWN
7 j' G$ ]8 B4 |- ^; e[*,ACTION_POINTER_2_DOWN# \& M' N: T* v$ j
[*,ACTION_POINTER_3_DOWN
0 m7 I# o6 T1 ]2 M[*,ACTION_POINTER_1_UP% e8 r( U7 q5 R! q0 y5 e( x
[*,ACTION_POINTER_2_UP& g& ^2 Z; L6 ]! x f" } H$ v
[*,ACTION_POINTER_3_UP$ F" b/ n- t* E/ l5 Y( O5 _1 L
[*,ACTION_POINTER_1_MOVE7 |+ K- S1 O: T5 Z4 S3 o7 o- \
[*,ACTION_POINTER_2_MOVE, j) k5 z7 m) s8 I; o! m! L
[*,ACTION_POINTER_3_MOVE' W9 O, V6 a2 c1 @" {" W2 m
[*,[font=宋体,获取各个点的事件响应( G6 b9 S( h- d; t* }5 ?1 u
[*,9 E0 A7 ~( l1 c3 q6 K! y: \3 t4 R% v
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
5 d& M( q% f- @! F$ S[*,[font=宋体,同理第二点也一样。% B: Y8 \0 i, a8 C! k; D; ^; O& Z+ I
[*,
* L, O5 o; ^9 p6 u& O[*,2:[font=宋体,安卓生命周期
7 {: Y+ D9 Y; w[*,[font=宋体,默认的安卓生命周期为点击应用图标
, I3 h4 O5 C& I8 C! v/ @2 {[*,OnCreat OnStart OnResume
8 j% S. }2 r& b, D% A[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory+ j: d& y3 K- K. [, g
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.2 I4 b" R8 y2 L# D3 r1 d* {
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到) { t! N. K8 F4 I# t
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;5 Q+ J, }* U/ N. ?( ?- 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,就可以了不要让他走周期流程9 A G; Q7 A+ r, a$ `
[*,, \6 _: b! u3 |
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏
0 D4 e0 I- Y! z1 a! g: s[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
( y7 |5 p& [( d4 z; h1 u[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
5 L0 J0 j5 ?8 w[*,[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,.: M( H7 f1 @3 q8 z, l, l# |
[*,
8 O& y! S4 U4 k6 ~[*,[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,具体写法+ @/ R( q8 m% ~/ C4 i0 s! X1 p
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加. c* k5 ]& F( t' l! n& s
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,4 s& x$ X! r. ^3 x* [1 v
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,9 d! F. w& `! o' D f& g
[*,android:screenOrientation=[i,"landscape"[/i,>4 C% C! R* M, R$ a/ n
[*,
: o1 X' X* L) O& g1 x' `[*,
# Z% }0 K6 O3 P* {[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
# y* H' Z: W+ @' m5 q3 ]0 a; X" S[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类+ s# o& z; @. R+ A+ W5 f2 J
[*,+ C* g" G, _4 K; S, ?
[*,读权限3 I3 L' D4 F4 L# u5 Z
[*,
3 g f) B5 h4 B( R[*,9 b: r' Q1 Z- z( T5 z4 Z0 u& Z
[*,写权限8 i! j, `. ~/ f/ r/ x+ d
[*,
- n( Y% D5 g9 v* G: c[*,
, `. i3 ^+ }: z8 y. |[*,电话接收以及监听权限
3 K |) @: d/ \3 P; [5 \[*,: B# W& Y5 Q' {( I C
[*,) ` v& G% i( M9 a+ ^& B3 y9 b8 q
[*,短信接收以及监听权限
( u4 a5 C8 W: A' { e* b0 u[*,
" X, ~" {# s$ Y# p0 D6 F[*,8 C! l5 h {' Y! T$ a+ A5 H
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
W" v' M1 l! h1 r$ S( l& ?[*,
O/ P/ n! _6 d7 G) l[*,
7 x# H3 \: e& d* {[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互8 f4 i% ]0 l: E9 B) ?2 F, T1 y
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
9 f( j8 h S* d" t. |2 f6 r[*,[font=宋体,所以需要这种方式.
: }1 z6 ?0 A1 ]/ \. v" n[*,[font=宋体,在JAVA[font=宋体,中自定一个类! |0 d3 p0 T. f5 Z
[*,Class MyData8 O! ^ e$ |. A1 f
[*,{
% B3 A/ O' p6 e/ |" d[*,Public:# ~; Q8 D7 n( t8 a& ]' o$ V" d0 X
[*,Int a;+ q( g$ p! X i1 t4 m
[*,Int b;0 ]9 p. f3 f$ Y9 O, A: N/ q
[*,Int c;
( t, L! v9 ~+ ^ A. D8 Z' H[*,……..};
* ]* v% J8 v7 j+ R' c* }3 ~8 F# g[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
- s0 ~' h& Q" o! d4 C" e w) g' D[*,public static native void GetData (MyData data);
9 X: e& h/ S; [3 p4 `[*,JNI[font=宋体,层中声明7 N+ D8 \* X( f3 v1 _6 j
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
" h5 a6 H: k. s. t[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值3 k& h+ S1 ~2 t7 C; C7 M2 a
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");
a# O. ~3 |0 b' y[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
1 N) F- { Z5 _ I4 @5 A' S6 {" Z[*,env->SetIntField(m_pdata, “a”, 5);6 Y: _/ |) |* U
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
0 ]7 d2 L0 h. z8 r$ [0 N: ?7 C: j# L[*,
; i) P; N9 j) P) u) ~[*,$ `) u1 v2 U9 B$ K8 i# N
[*,6:[font=宋体,工程搭建
& w3 D2 d O0 @% B1 z1 J[*,[font=宋体,首先编译引擎代码.* T ~& Z# s& G. ^
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
0 @7 W! f) e5 H* S3 e5 j u# |5 f1 h[*,[font=宋体,需要重新 Cmake$ k$ D& d! Z7 ?: G" F3 P# @5 h
[*,[font=宋体,编译好代码后打开ZSDome9 I+ o5 ?1 p% I
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
* X% T' \6 d5 }/ N3 G I7 b- T. r0 E; m[*,[font=宋体,然后直接直接运行即可.
3 W3 M1 ?* i8 u/ F: k/ }[*,
+ H7 J* U5 E* m8 I3 t& i, a[*,对应接口
* w5 }0 E% l, L9 w+ s, z[*,Android5 i7 j& u2 c) |/ v. U; P9 G7 U
[*,DemoInit----[font=宋体,初始化引擎
+ V* t6 e7 i0 t# J[*,Render----[font=宋体,渲染主逻辑
% w8 L% [' Y6 d% q[*,# P3 G8 o8 D9 q: ]* J
[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
2 [. f1 t$ ^$ `- {; A3 {- q[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib$ X4 Y$ x' M+ p* ^" [
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a1 @) L7 X) x% K( l- X: G
[*," u' ~& ]( T: ~1 o
[*,然后使用:/ D t7 ~9 {( G H% F( B
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic() @1 D) s& `! O( Z
[/list, [/td][/tr]
# k: F6 B' q9 p- U# J2 d- W# Q1 Y0 W! w9 g[/table]
+ |9 e: K4 n( }4 v
, M) N5 ?" G1 z% c1 L( s
2 Q1 g( }: l7 I) G |