|
[table=98%,
9 x' r7 S" q( S% o6 A[tr][td]$ y7 q, Z0 S" o7 ?9 C1 P
/ H/ l* o* |4 n5 t% u8 U5 ?
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,0 C- _7 D/ m& r8 Z7 {5 {
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
$ A& z; ~" h7 M/ W[*,4 C8 W6 G2 J5 U6 ?+ u4 q7 @
[*,多点触控:
+ F V- y! [/ [" j* ~) s I; F[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
% M# E( l$ O0 x[*,原理:
. e/ M& { j" J# R[*,Int pointCount = event.getPointerCount();
* R. `1 P; z6 D R2 }# @[*,获取当前的点击个数。
: p4 b$ D2 C; t) \ Z7 Q[*,ACTION_POINTER_1_DOWN
* i7 T: L$ F$ t2 c) H& j[*,ACTION_POINTER_2_DOWN
. K! ~0 ]6 k) s4 [1 p0 H: c4 a[*,ACTION_POINTER_3_DOWN0 [" V( F. g8 }9 l
[*,ACTION_POINTER_1_UP+ a# F4 a/ b( f2 x c
[*,ACTION_POINTER_2_UP; o: z' t/ U- T+ W. ~
[*,ACTION_POINTER_3_UP
5 a2 h& \, ^" B) c0 n[*,ACTION_POINTER_1_MOVE
: P$ J0 A0 }3 l$ d: j[*,ACTION_POINTER_2_MOVE# Q) L3 N3 v/ G8 ~+ k
[*,ACTION_POINTER_3_MOVE' X$ D* k+ D" p7 ]& O1 E. O
[*,[font=宋体,获取各个点的事件响应9 V$ f- ~; B( K. I
[*,; I; a- ~8 Y/ f2 t( B* e, G5 `, G
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
) U: r1 i5 t0 P4 ?0 j[*,[font=宋体,同理第二点也一样。
1 e: i0 P2 J) y7 Q& \' c0 K/ {[*,- s% c- p$ h3 b) M# R( G
[*,2:[font=宋体,安卓生命周期
: S/ K5 f1 \5 E1 z! b; w. ~$ K/ T1 x[*,[font=宋体,默认的安卓生命周期为点击应用图标: Q) p! ^! t* y3 t: ]4 p
[*,OnCreat OnStart OnResume
) R' T) b" f7 c: A' l[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
! s# {; n" I% K$ [" ~) `[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
0 X$ J- I& N9 Q7 a+ }& |3 Q- N1 p[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
" W- B4 J# q g1 u z* l7 @' q[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
4 L3 S, r- t$ c/ P[*,[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,就可以了不要让他走周期流程
$ {0 K \. w7 }5 x H) K2 ?* H. d[*,! s0 c6 t4 N+ n0 p8 p
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏
+ A7 v! o9 L, J/ P7 Z% b[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
) \, v% A% w. X& T1 ]5 B2 ^[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.- \0 m7 F" b& H/ ]# S1 ~4 y
[*,[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,. E2 Z' ^" p- O
[*,: f! e' T' ^) M8 g5 M! a1 K+ b
[*,[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,具体写法
8 V0 Y: o1 r& o6 r8 R# f[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加/ Z; l: [- P9 L3 N: Y
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,
8 Q8 P/ `% ^; n& r* D1 A( U[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
, i# t1 i% K0 t9 S: ]& F& A6 u[*,android:screenOrientation=[i,"landscape"[/i,>5 \7 A3 r( n# g* B
[*,
5 k4 P1 _, M+ `0 r! o[*,
: U- z+ \' Q- m) O[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限7 w4 z6 _& r. R0 o$ ^
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类$ Z/ |) n5 x" ^2 q8 P
[*,
+ n5 F3 J: U: ^5 j/ z0 w. F[*,读权限. k0 ^# {: M1 p
[*,
. I ^7 U( D) N, y4 }[*,
6 U& c$ w; s# c4 t. K$ C[*,写权限
. s) P# t P4 O' J5 n[*,0 L$ R9 r7 E9 t. a. t
[*,
3 v) Z" J8 r+ K( F% _[*,电话接收以及监听权限
5 U) ~1 s& {* q' M. G$ e) G[*,/ ~/ O2 w8 R% V8 V6 O; `) S
[*,' K8 G# Z6 m- ~: k: p6 M$ n4 W" D
[*,短信接收以及监听权限
3 N2 @# l7 T# d4 S C5 _4 U: R% ?[*,
, q6 h! S8 O3 u# O4 D9 h5 {9 B[*,) q( e+ v+ k' r6 C
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页" }5 V6 b7 x2 H
[*,
8 X% }5 @! @7 V7 m[*,6 V3 d$ g! |( S- O* O
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互! r2 E5 u$ A9 N( U: i7 }
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
( y' J& ~9 |; ?3 m3 u[*,[font=宋体,所以需要这种方式.
4 X5 \& ?4 p% q: n# k[*,[font=宋体,在JAVA[font=宋体,中自定一个类
( ^* y6 [" C+ s[*,Class MyData; D! {' g' a& f( L6 o
[*,{ c/ p3 f1 R. ^8 D$ W
[*,Public:5 i4 j. V* D2 D+ f( C" G
[*,Int a;, h; C. o* w& M9 \$ [2 O: p
[*,Int b;
+ {" ^7 Z. |: t2 Z" k* [8 ~2 {: {# A[*,Int c;, I" `3 Q9 r& G# C* R: ]3 o
[*,……..};
* l6 h l+ L7 W[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
6 E) E3 V6 S- y[*,public static native void GetData (MyData data);
2 \. ?: I+ \6 e; h0 u[*,JNI[font=宋体,层中声明
0 j% J2 C- y0 ?[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
/ f% H7 c) s, y0 @[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
\, {' t0 G6 A1 j& r[*,jfieldID sound = env->GetFieldID(cls, "a", "I");
$ r" u E8 n3 E1 q' b[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
/ F9 E3 y8 J* T) i1 J[*,env->SetIntField(m_pdata, “a”, 5);
0 M' Y3 @; m) o; P. H" y[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,./ e. r% {! Z. g) F# a0 U
[*,
d9 d B7 l' G0 @ e[*,! ?4 E9 Y' M; o: g+ X3 }4 u0 P4 J
[*,6:[font=宋体,工程搭建
8 v; b5 v8 }; f# p: U[*,[font=宋体,首先编译引擎代码.9 |& h9 ^) }) {) m. Y3 C
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.. h' m1 g X/ V" d1 ?( w
[*,[font=宋体,需要重新 Cmake; F2 w8 K4 M4 G& L$ m9 ^
[*,[font=宋体,编译好代码后打开ZSDome8 X. T, i5 K0 ]( G
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
2 X$ \ P2 k5 b) _2 q! ][*,[font=宋体,然后直接直接运行即可.
- }1 b2 l$ v( w) n7 g/ J; a[*," i& A+ \+ ]) C- z) N: D- S, k" G
[*,对应接口
/ ~* C" u5 \' F6 s[*,Android
" k/ @: D- a+ _[*,DemoInit----[font=宋体,初始化引擎; p$ H% E8 h1 i# O, [8 p8 H
[*,Render----[font=宋体,渲染主逻辑
- F h9 R- z; A[*,
0 f# |( Q- A& c! D[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用* a6 R4 R5 d7 l0 v" F
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
; Z- ]) D \8 M7 r* R[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a6 F6 ]% {: J- P1 L
[*,/ f2 }- b n8 k, C3 P* a+ z# |. ]
[*,然后使用:" n0 |" H# N. M& \: L! @
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic(); b2 L [* n5 A! {* K
[/list, [/td][/tr]
- X+ ~5 Q- J+ V+ B+ }: R4 L$ t[/table]
6 d9 {: C1 r* B2 g( A" y& q* d1 N* h- G
) x L+ T& E4 i2 Z/ r( ]
|