|
[table=98%,
, M' |! }2 V$ [, J) S[tr][td]
) y: L+ T, o: @% `6 r2 j: V* x- Q! j" w) \( {& M2 |
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
6 _3 l5 i7 H3 `5 R( V[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案' g3 a; U5 a& W5 q1 r6 S( G, F
[*,. _! t* `, q( _: j
[*,多点触控:1 }/ `# u* N. n" u Z5 r/ _- r$ r
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。6 t3 \- R- j/ X' d
[*,原理:
7 j, }6 j# n) f5 T& [+ ^) g) `7 p[*,Int pointCount = event.getPointerCount();; m" I" D6 H6 x' \# X5 m7 `- w! H
[*,获取当前的点击个数。
. L% u H, L1 A6 ?; o2 u& L[*,ACTION_POINTER_1_DOWN- { P, b( d! ]. X, z/ {5 [; \3 H
[*,ACTION_POINTER_2_DOWN( m. ~8 P7 I7 b& c" ^( m
[*,ACTION_POINTER_3_DOWN
( |( S$ K* J; y5 a[*,ACTION_POINTER_1_UP* k9 M& a( P2 e. Y9 F
[*,ACTION_POINTER_2_UP
- f% G- q4 Q3 O+ Q* W[*,ACTION_POINTER_3_UP! Y3 s5 D7 Q$ r7 c) f6 W& F1 |
[*,ACTION_POINTER_1_MOVE0 {9 [1 f) ~) K. g1 z! ~- W* b' ]
[*,ACTION_POINTER_2_MOVE
6 k: W' }+ _- N" H5 j9 W* G) \: W[*,ACTION_POINTER_3_MOVE! @. V5 q1 x: x3 \* f
[*,[font=宋体,获取各个点的事件响应0 `9 H B t' s) T
[*,5 c0 d1 p' x4 q6 g% y
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
- {8 Z- r3 r' \" }& ^/ ?, f& h[*,[font=宋体,同理第二点也一样。- \( o3 C9 @& D: ~, p: e* w
[*,' Q+ T* _/ x- j5 \. L0 ?1 k' I1 k
[*,2:[font=宋体,安卓生命周期
5 W' Y) |' u# }. }) V" @4 y% L[*,[font=宋体,默认的安卓生命周期为点击应用图标3 Y' q0 j9 K! p' T% @# e5 @
[*,OnCreat OnStart OnResume2 v& C' ]; K0 o' }1 i, ~+ `+ g
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
0 e- u, a V: n3 i0 |: A; @. r[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
3 K7 A. J2 q+ z6 G8 c" V[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到! A1 F4 \% ?& Y$ C& `
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;" U1 H: A/ {9 R, z
[*,[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,就可以了不要让他走周期流程. ?8 @$ h! \# G0 [
[*,$ j8 R& q5 Z7 Z: u- {) |& N
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏
+ _* e' X3 h7 c" W1 Z5 o7 B7 _[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
- c: l) e4 j6 F: b% `[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
0 e" h- f7 ~2 T; O+ a# [( @[*,[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,.
; \1 [8 {2 U9 e4 J5 h5 w. _0 ]. S[*,
) ]% s9 F9 Z4 l+ N) d& Q8 O+ |[*,[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,具体写法, Z% [2 }1 m& h' l8 k
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
. [7 E. ~( d8 L' f @ l, a[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,1 R+ K, R1 O, ~
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,. A! U% K+ q/ A% g
[*,android:screenOrientation=[i,"landscape"[/i,>. X3 K9 W# J$ o/ B4 s$ ]2 b. F- A
[*," O! a. p9 G: W" |! U
[*, H) ~( F6 K" t5 Z
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限; ]) b) e! u2 Y1 @1 |' V
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类( W- k6 ], w7 Q- _, E/ X! a1 `
[*,
1 _2 K% y: I% f$ `- n) g: v[*,读权限' T) L4 I% p% }3 p
[*,8 d0 X5 k6 B. n
[*,4 w, h: t0 l8 b* s: q) A. j; g9 Z
[*,写权限! `: p% g; b3 l9 R) b- g
[*,* W% f. f. R4 y' o; g
[*,: d1 r, ]8 u0 i J2 g% c9 R9 o
[*,电话接收以及监听权限 X5 v- A1 R P. v* _
[*,
2 g% g- u7 c0 T: M1 q3 M[*,
3 d. Q; h% W; o1 v* g0 |[*,短信接收以及监听权限
) x; B$ z6 o$ t[*,) X- @" _/ H) o
[*,
0 n0 R2 G6 Q; }; g, ]/ T# `9 p[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页. T: o; W3 J& A& v& y) |' H9 ]
[*,
; L$ V% F& }: z% \9 V+ O; \[*,
8 x! h- L( Y- @+ H e$ S[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
; v& l, I1 Z) }# G8 M8 i[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
; F2 G( l3 C* d; C' y[*,[font=宋体,所以需要这种方式.; M& K c2 J9 g( }! Q- U9 j
[*,[font=宋体,在JAVA[font=宋体,中自定一个类
7 f- x7 m d# ^[*,Class MyData
: _. ]/ G5 Q; i# D, o[*,{
" X) w5 V/ e7 Z% ?' J a[*,Public:
$ |& V% l+ r r[*,Int a;% _8 P4 a# f* n2 W- P; C8 i7 V0 {
[*,Int b;1 ]; ^8 g e+ P, e7 X& M! S" w6 @- _0 ?
[*,Int c;
/ U" ]9 J7 |* k[*,……..};
f$ x0 @9 i' D% l" Q" T3 J[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
% L5 z; {$ v: J; E J[*,public static native void GetData (MyData data);
0 P7 U1 e7 k4 {- N( N0 b% c4 N[*,JNI[font=宋体,层中声明7 U j2 d" k! }; b9 {9 @
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)0 F: W: _- s$ n. ?6 V; s
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值2 W( X( i, c- o2 L& h& _
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");# ~; V% f( Q6 ~& ?
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
+ O$ l/ l2 J. }* Q1 c[*,env->SetIntField(m_pdata, “a”, 5); e& |5 M( j3 z7 a$ N+ l1 w
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
( x2 ^; g( @7 Q- g# M[*,/ }/ P4 v: P4 i& O- o/ h7 r1 C. X
[*,! l+ z) u6 h1 _; X
[*,6:[font=宋体,工程搭建
5 ]$ |" x& y+ F6 Y; u) W8 A7 Z[*,[font=宋体,首先编译引擎代码.
. e$ \: T5 m: d9 P4 T) W[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.# H" r- s8 }. N1 M$ L9 v0 Q1 q) [5 i
[*,[font=宋体,需要重新 Cmake9 U; v+ J3 u2 `) k1 O% _& Z
[*,[font=宋体,编译好代码后打开ZSDome% b; B! J ^- V l! K- n3 y4 ]
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下! M8 \; N. M3 f7 [# t5 F# ]( R3 [
[*,[font=宋体,然后直接直接运行即可.
* p/ o9 n, `. V+ [7 D[*,
: o1 y( Y+ v( Y, `! t9 W4 v! d[*,对应接口' r z2 d2 @+ U, k
[*,Android
+ h* R( | f$ L0 v[*,DemoInit----[font=宋体,初始化引擎
?3 l1 L% B: V) u[*,Render----[font=宋体,渲染主逻辑% m' [' T) L1 R) Q, V- T& c
[*,: r3 g3 B4 A( [ w8 x+ `
[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
9 d" I5 O& P. e0 p6 z3 D: @( d[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
* z. @1 O! ]: ^8 }[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a, i8 n; a$ V- F l7 w8 e
[*,& o9 W% }8 d/ _* K3 X
[*,然后使用:
8 ?* v% k) e# D3 s1 t4 B[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()
. T9 n7 h7 n5 m; _9 b0 H& x2 A/ H' O6 c[/list, [/td][/tr]
9 X) `2 ?( e; `- D5 l; M8 _[/table]! E U- k8 I r) i, i7 W
+ v3 p6 P" r1 w% ?" u+ Z
8 v0 T5 {4 _6 k/ G4 t5 l |