|
[table=98%,: ]! k$ d+ ]0 G5 a& N
[tr][td]2 R" R E7 f5 F$ E
0 S! @/ V# G: d# n o* R% u1 W[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,3 n( p6 H8 z' C o N( _
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
$ D3 }; o7 X' Z& d[*,! G8 J! v4 a7 J/ s1 t6 ]
[*,多点触控:! d4 _) N' J+ T% [( W6 Z# D6 k! \
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。/ Z! X7 ^" |# l9 \* L
[*,原理:
: V3 n" y" L: {[*,Int pointCount = event.getPointerCount();
4 \6 l% L% Y6 M% A$ [[*,获取当前的点击个数。* H6 E! q: O( H+ v, X- \
[*,ACTION_POINTER_1_DOWN
- Z- s4 A1 p+ ?, F- a" k[*,ACTION_POINTER_2_DOWN
& w- a# B' j- p( f5 w[*,ACTION_POINTER_3_DOWN
, N. c4 B* D0 P ]1 c5 p4 S8 d[*,ACTION_POINTER_1_UP
. q, u, c6 M" _' `[*,ACTION_POINTER_2_UP
7 H& N& k( [& d, x$ u8 Y[*,ACTION_POINTER_3_UP
2 D; r! T1 N! }# o/ f6 i3 _/ O[*,ACTION_POINTER_1_MOVE
& ? r1 B3 q- p[*,ACTION_POINTER_2_MOVE
0 I+ v9 s- D' B# j8 c[*,ACTION_POINTER_3_MOVE
# S/ y4 w/ B% I Z[*,[font=宋体,获取各个点的事件响应
?( E- U# _9 e6 w[*,
1 m$ a- V) o4 s! x* q2 P[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
% b* K1 T' f% B[*,[font=宋体,同理第二点也一样。
+ w9 P9 F6 X8 f6 Z% D! v[*,3 b- U I. B5 X1 q' q
[*,2:[font=宋体,安卓生命周期5 x# b) v6 y! g! P8 Z* k
[*,[font=宋体,默认的安卓生命周期为点击应用图标
0 s/ @3 K, O r6 l7 Q[*,OnCreat OnStart OnResume; E1 Q) o; V) e
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
1 x3 i- R) @5 a# a[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.- o' ?2 ^" O4 p& W, o) m; [
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到5 K6 g9 U* z, ~1 m# j! e' ~8 s
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
; ^% M: m: U5 ]5 m6 k: M[*,[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,就可以了不要让他走周期流程
( ~. [6 L& x5 |9 E h% V0 _[*,
4 \' H# Q. H; [5 q: m[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏
4 O6 f6 W/ l- }9 H[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.3 y" P, w/ v- e* {% R& m! ~$ N) N
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
, u. v$ e2 {$ b[*,[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,.
8 |1 F2 E6 n4 R2 n: M" a+ V[*,9 |: q8 d9 T* ~0 I
[*,[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,具体写法' T/ B* j6 A. N3 p; L0 x
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
* Y$ a6 [. c$ c4 n' L, Z" w[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,0 f* Q) R9 R: G, ~# o! M
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,+ {% O" o$ h! J- n! X! H! W! r
[*,android:screenOrientation=[i,"landscape"[/i,>
9 ]* T; o9 \" u* C7 q% n9 J* I[*,( {) B6 \. C) k9 c
[*,
& C( |/ P+ C8 m7 c8 t0 W) a[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限/ ~8 j; M i' X/ a; K' U/ I
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类$ M7 E# @5 i7 E9 `0 t
[*,1 h/ Y$ G5 u/ _( }0 R$ O$ M
[*,读权限) s/ X6 P2 O$ g9 ?
[*,
5 U/ }& y) q1 {% _% a- l/ {[*,
. p0 I- C" h) W+ ~5 @& u' {[*,写权限2 [' i5 I0 W% t" y' C. U
[*,
9 m, w- C d9 X/ h/ D5 C% O: ^[*,( F; ~" ~& z# `
[*,电话接收以及监听权限- W/ O8 w8 Z6 e$ h) p
[*,+ K; k/ ~. w$ F; \
[*,
6 G3 o0 m1 t {2 A. I5 k[*,短信接收以及监听权限2 \4 l. m1 O& j# |" \! Y8 X
[*,
9 S* B- v1 _$ _; ?[*,& S1 i, O: [: U* l& X" R# U( i
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
% k; J2 i% q4 ]: J[*,
- n' s& i2 v3 ?; N+ u- K9 q; E M q[*,
. y l, [: O' Y$ d. ?4 m[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
: B& p; o. [/ d A$ }) d, B[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.8 O2 {& h5 F0 |% F# h
[*,[font=宋体,所以需要这种方式.; s6 Q; O0 t0 x2 N h( y1 i$ n
[*,[font=宋体,在JAVA[font=宋体,中自定一个类
& f6 ~2 ^& X6 Z3 ]( ?[*,Class MyData- Z, A( t( E/ T- d; ~
[*,{% k. G1 F' c. k8 H
[*,Public:" l) g8 ^' T3 ]) C& i, t0 s
[*,Int a;
$ f" H/ Q& [4 ]4 A1 U[*,Int b;
+ P2 F2 b$ ~" [5 x; v% ^# s3 F[*,Int c;
' t, k4 v$ Y. o( Z) Y+ S9 L$ w" i[*,……..};
! y$ V" E/ N7 X: G# C0 E[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明1 d& a0 p, A5 _2 N# F0 T" d( T3 R
[*,public static native void GetData (MyData data);
7 F+ H+ x8 Y6 g( y8 D K[*,JNI[font=宋体,层中声明' R/ n/ ]2 y s* m' k3 }! B
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata): L8 h' ~: z( i s1 P* @
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
( G1 y' d# [: t6 o" }; b% ^[*,jfieldID sound = env->GetFieldID(cls, "a", "I");+ j5 E" ]: j1 U- x8 u! p
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
7 Y- ~3 j" x6 a[*,env->SetIntField(m_pdata, “a”, 5);
y) v: K L8 b+ H( r$ l[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
% u( B# x }: |1 f[*,
2 I- F: C( ^" `7 Z. [2 H4 e[*,
& H: w/ F7 X* y& F[*,6:[font=宋体,工程搭建
1 q5 y2 M6 E' m5 H[*,[font=宋体,首先编译引擎代码.$ C7 [7 v8 p9 n0 R# V! k# j
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.* W0 V0 c" T/ b0 \' i) Z
[*,[font=宋体,需要重新 Cmake$ c, M, l2 N V: J6 q! z* ]. `! ]
[*,[font=宋体,编译好代码后打开ZSDome, {% \! y* c: }9 s" m( {/ S
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
& c2 u% o2 `+ Y0 r0 y' i5 n/ C[*,[font=宋体,然后直接直接运行即可.' H) _4 O0 R; W0 m
[*,$ [9 A$ {" |& e9 \; j! D1 Y: p
[*,对应接口
* n. n* ?( E- s6 g" V3 t* x[*,Android1 x, I' O, B/ x# ?" n! n2 R& x
[*,DemoInit----[font=宋体,初始化引擎
* {+ \ t* {. ~( ]5 n% _[*,Render----[font=宋体,渲染主逻辑+ u& D4 A5 X0 O2 b! R* ^
[*,
- V: K, q c* R% a" J4 {( W[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用" g) w$ q' B" ^2 x* O! D
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
' l; k. c4 n8 T$ \[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
0 R% X( a# m* v1 n ?[*,
4 T* m y3 ~; n1 I% r[*,然后使用:( c4 n; o8 q4 x! T. G! ?
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()' d% W a8 T/ w$ V" F
[/list, [/td][/tr]& b, S1 ]5 R. Q- v/ ^
[/table]6 z% E* N" U/ ~/ ^. r
1 v1 {/ D# m4 f* v- m/ m0 K
: T# F) T( b: ]' q+ G: ` |