|
[table=98%,
' W6 C, g( ~; O! I: v[tr][td]* n7 V* R* k2 ~% c' i% f$ H# L
6 Z2 H" Q1 e3 h1 k6 Q5 p- O# Y' b[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
) w9 F: e$ v$ U/ o' G/ p4 _# f C& }) x[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案- G: a0 m' D2 K
[*,( r# ^- g2 o: [3 B3 d
[*,多点触控:+ `- l: t" y( p/ z8 g; J( k
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
: W R( D6 K0 c# G* O: I[*,原理:
Y' C C/ ^: x- w' t; @$ s[*,Int pointCount = event.getPointerCount();* X1 q6 S! z R. H: k( k! r* F
[*,获取当前的点击个数。
3 C! m' h6 u Z2 Q0 k9 M7 J[*,ACTION_POINTER_1_DOWN
4 i K/ T8 j! l7 o6 H: J[*,ACTION_POINTER_2_DOWN
" ?8 u2 {0 U( ~4 V7 W# W[*,ACTION_POINTER_3_DOWN7 X2 E3 I3 b* p0 F9 \' L
[*,ACTION_POINTER_1_UP2 F8 v: W; G' o% H
[*,ACTION_POINTER_2_UP
' O& C4 g- V% T' w9 D- q9 j[*,ACTION_POINTER_3_UP
( [0 X) y$ y) A[*,ACTION_POINTER_1_MOVE* F, ?: ~* K$ w" N9 c
[*,ACTION_POINTER_2_MOVE4 }" J+ K7 l$ a, t
[*,ACTION_POINTER_3_MOVE
1 W1 y( ~' `) C4 d' r& N[*,[font=宋体,获取各个点的事件响应
4 F7 g: i: D5 d+ O* A: d; M9 D# f[*,
8 j! r: b5 M1 i3 ~0 |0 j[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。5 C. |. w* P" X! K
[*,[font=宋体,同理第二点也一样。0 E: n R+ G7 q; ^( a) d
[*,5 J% ^4 i. c/ f
[*,2:[font=宋体,安卓生命周期
# E( ^, o, S1 G8 T; [[*,[font=宋体,默认的安卓生命周期为点击应用图标' A9 w" v. { t- X% T! R7 M
[*,OnCreat OnStart OnResume
, H! ]& o* A; t' e/ Q- a. Z$ h[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory0 G2 _1 g* e/ e8 g: s- v
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
' s) d# c) a1 s& Y[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到4 U7 v9 ]6 C8 U6 q0 m V
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;" q: [ I( T! n" K# k0 G
[*,[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,就可以了不要让他走周期流程$ v9 [% _# v7 D# r1 K% Q
[*,
+ v8 v) V% {, y8 N6 y, ?% D[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏
) M* b, C6 g2 _2 ~- j: y[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
+ B7 ~% j$ {. U[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
9 z; Q* ^+ v2 r+ t/ ]5 \. e[*,[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,.
u# O2 ^& U+ L1 p[*,
7 l" t5 ?6 ~3 G4 c @[*,[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,具体写法, J+ a7 p+ G. J# Y3 t* M
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加. U5 l5 w' m/ |4 q% d
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,
& @7 p) Y9 b1 R1 f: c, r[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,+ {6 A$ Q! H: h: d( A. j, \2 Y
[*,android:screenOrientation=[i,"landscape"[/i,># U- O8 X- w2 o6 D* P
[*,$ z6 S5 R, q7 d1 _2 _7 H
[*,( [) \/ m0 ]; E$ {8 O3 v+ R2 @4 Q
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
; N! a& f- t8 v z) u[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类
: a+ S8 Q6 U+ |) O0 P8 R& }[*,: z4 C$ n& `- q" M, V e- ~
[*,读权限( j! ?: ~0 \- C/ a) N s6 M
[*,2 U6 |6 \8 a g8 ]0 |
[*,. U( K: }! p% s7 W( U t* M* Y
[*,写权限
4 S2 a |4 R. i( `7 i" X[*,
; z* g5 \6 R" K! P8 _. X: f' @1 `[*,
% n9 d3 q/ y- h) X[*,电话接收以及监听权限$ R$ I/ [$ \$ R
[*,
8 q/ R! v: C3 W% @, o- D ~[*,1 v8 Y3 W; X# d; D% g
[*,短信接收以及监听权限
4 ^ f) _5 n p; X6 p/ w[*,
3 k( y8 B4 ~* m4 ~% ~[*,
$ z& K% n- @, d8 e. \[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
' q) L. S! Q9 U* @7 c[*,0 A7 o$ y3 G+ q7 }( a
[*,) Y: N: _7 I) X' I
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
" V# Y' U2 o1 u9 p# W" t[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
0 t. a" u: ~1 A9 G0 O- r: g[*,[font=宋体,所以需要这种方式.; N w" y' V [, Y8 u" ?
[*,[font=宋体,在JAVA[font=宋体,中自定一个类
" N- t/ W" z4 L5 T, S4 o[*,Class MyData
* C' e9 v: y& c: X3 _[*,{
3 w- l& o4 N7 d: ~, S7 T) [* a[*,Public:
9 O" Z( u% t4 }; S- v[*,Int a;# f; k2 [9 a6 H5 z( L
[*,Int b;) |! O0 C0 k8 A5 n5 r! }9 \3 P
[*,Int c;) ?; n( e! V, l" P) S
[*,……..};; |0 d% t( | ]! |
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
2 G, B) q6 ^1 D6 q( T7 a3 E[*,public static native void GetData (MyData data);
2 D! }( B, n+ ^) o( ~[*,JNI[font=宋体,层中声明
& j# h* d9 @9 Z/ Q4 W' ^[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)0 ?" ~# I) U! f; x! F
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值0 I+ i+ N$ [) j k% z% L" {
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");3 B' D* x" }& Z' r! P q
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值! Y/ v2 b5 o: T, O1 N5 T) j; ]
[*,env->SetIntField(m_pdata, “a”, 5);
! E# Z/ d( m6 r' q6 U. o[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,./ i3 B# ^& n* B! g0 t b/ [
[*,* {/ H* J9 R2 E/ O* |3 h
[*,
p+ o: E o: L% \+ O4 p% H# p+ \[*,6:[font=宋体,工程搭建
& n5 Y. L D' k) U: M[*,[font=宋体,首先编译引擎代码.
3 d; |: M& u, x[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.- ?' ]" Q. c8 P; ~
[*,[font=宋体,需要重新 Cmake; s+ P9 I& @8 D8 ]
[*,[font=宋体,编译好代码后打开ZSDome' s& q A: f8 j G$ e0 [0 W! |
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下/ F h6 B1 K0 L& X% \
[*,[font=宋体,然后直接直接运行即可.$ U; L* u) m: D" U4 r$ w
[*,; F5 Q' F6 F) c# ^! o. s( i
[*,对应接口5 E: f1 C- g8 `, [
[*,Android9 f7 C" y O: \) Q7 e. y
[*,DemoInit----[font=宋体,初始化引擎# L% ~5 q8 X) d
[*,Render----[font=宋体,渲染主逻辑
; P% q" D) S0 M3 P[*,
/ S/ s0 ?7 _' ?% Q- h1 A+ e[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
; N* ]$ A; v6 s. a# U, x[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib# t7 I$ R# {% p- E( M2 ?
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a/ O% }; k# O, w+ B( B. ?# q
[*,
2 p, i7 o! j: K. {[*,然后使用:: q; V: T0 Q c$ m) W
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()2 \& `( y/ C s5 E
[/list, [/td][/tr]
8 O- f# F0 x7 c( j# I5 x" H$ t7 C0 \[/table]. L$ Q( \/ o# ?1 d- P9 O
- \+ }) ?3 p. m, L; c
% l* n5 S: M7 a) M |