[table=98%,% g" C' `3 h: E
[tr][td]" T/ Q L- g$ {" ~8 L/ b- R; ?
3 R/ |! @7 }$ f$ x6 p2 l
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
7 Z d* W+ n8 A P# D+ H[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案8 W2 j& p. x% ]- H
[*,
o: a; G6 _ J" q7 g4 w/ L[*,多点触控:
3 X- P' P. o/ `2 ?4 p4 h[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
2 ~. P0 z0 W q1 d) o[*,原理:) P8 k4 d$ f4 \
[*,Int pointCount = event.getPointerCount();
8 R2 ^7 }- b' v2 e6 E2 S[*,获取当前的点击个数。, l1 _4 x% o) h7 V I( t. h
[*,ACTION_POINTER_1_DOWN
4 i5 W2 q7 P, b d& o3 g! X6 z[*,ACTION_POINTER_2_DOWN# Q7 L' o3 Z: k; k
[*,ACTION_POINTER_3_DOWN8 G) K# U4 j; l7 K# e! k% ?) t4 }
[*,ACTION_POINTER_1_UP4 W' z/ D# k% j3 [; ]/ [" X9 T: @
[*,ACTION_POINTER_2_UP
: T4 T. X3 c8 i2 O" V[*,ACTION_POINTER_3_UP
! }! \& `, r A ?[*,ACTION_POINTER_1_MOVE
7 o/ O; [# K9 z" j- ~[*,ACTION_POINTER_2_MOVE
* R4 V7 D- ]5 ~* E2 @ Z8 z, o[*,ACTION_POINTER_3_MOVE
6 i3 K! `/ `$ G3 G[*,[font=宋体,获取各个点的事件响应
( j" S1 d- k+ t. r4 ?[*,( N2 O) U: v9 a9 G0 U
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
( o+ t8 k1 }- E, l8 z% s[*,[font=宋体,同理第二点也一样。 {0 M' o( X( b4 k1 H! `) T
[*,
( H0 | ]" s- s! ~2 w[*,2:[font=宋体,安卓生命周期
/ g5 x* }4 i7 ^$ C& Z+ J" E[*,[font=宋体,默认的安卓生命周期为点击应用图标
$ `5 v; }$ r/ _7 E7 }" U[*,OnCreat OnStart OnResume& r* P0 s; {) A( l- M
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory0 q1 z1 m& N. f
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
1 c: M; C5 ~7 y5 t D# c" O9 z[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到5 Z1 Q9 t( D2 e& l
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
5 L' ]. x p4 F; [ b[*,[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,就可以了不要让他走周期流程# Z0 o- Y! _' r$ A, ]) |7 B2 L
[*,
8 q2 B8 h8 B ]% z[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏
" ]9 f& N1 x' G7 y: s% H[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
0 {5 h& K0 I p1 S: g" t[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.# S* b7 |% Y- X0 F' C9 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,.: o. @: D0 O9 E4 m
[*,, Q! m, D- V) }. R* l
[*,[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,具体写法 g* i& x% C1 w2 w) I8 d
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
6 X* h, U0 P) I. J( j[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,- W, d% G- s% g
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
% s% L" |5 T0 e% Y[*,android:screenOrientation=[i,"landscape"[/i,>
9 I; L( r: K) L( R[*,
9 c+ B3 S0 W# u$ E4 o$ _& n[*,
) ^3 O! W+ @$ ^1 J D n( I[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
7 O$ s0 h, T3 {& i1 m/ o. k; ^[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类7 @3 w L' a6 G- J( c C( a7 R0 n
[*,' `% y" r& m* Z: f" Z+ B
[*,读权限
& v2 ~ p4 t5 z! z% Y8 b; c[*,3 j9 {9 v) y Y$ r" q$ f9 x9 C
[*,
- k" B. V p# m[*,写权限# L" v# ]4 H5 f$ z) @0 y
[*,
C; A M/ i' q7 ` M% B[*,; `' q a2 f) T, ]9 I
[*,电话接收以及监听权限* U4 P1 K$ w8 L$ N* D+ h4 P
[*,
& k# C# ~0 D6 v[*,, G; k, Z) N* l& ]8 k
[*,短信接收以及监听权限2 r3 Z/ k& y% c
[*,
& y* t$ _1 R6 w4 H* ][*,$ U; I# m: H6 J; q( L& M- g1 h
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页: K4 p! i; n: ]- I/ V& n
[*,
! T6 n# G# x6 D' Q" G' m$ C[*,
, d3 Y6 I! B, F9 J[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互; P5 l/ u5 P" c! i8 r
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.: h4 Z) r- c( E `$ e" a, U
[*,[font=宋体,所以需要这种方式.7 r" C' Z) W! q, w d+ K
[*,[font=宋体,在JAVA[font=宋体,中自定一个类0 T e4 H& x9 u* H. l3 K
[*,Class MyData
/ E9 I m; i3 l2 ?' v$ R; W[*,{: N* A1 d9 p; R) x
[*,Public:
9 V1 t, D L) i2 W% P; s7 B[*,Int a;
$ G* N) K$ k# U+ h[*,Int b;
" A7 l8 R. C$ k/ ]( E2 u f6 D0 }8 A[*,Int c;
* R- a7 Z/ w. z7 o/ y[*,……..};
' Y+ Q# E2 _3 |3 Y, |[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
! U- Q% C4 L# O/ E- u" a* L[*,public static native void GetData (MyData data);
& `0 A2 I' N, y: [$ t[*,JNI[font=宋体,层中声明( a1 Z& A) ]8 s' D# ?. l5 ^
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
, [0 a# H& t, B- R' |' X[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值7 S6 f) V0 d8 A1 W3 B# ^
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");$ G! {( [5 J7 g$ S
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值; ~2 G9 [9 I0 n. `& _
[*,env->SetIntField(m_pdata, “a”, 5);
5 g4 d& q& p: l: ~( w# L O% A[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
! W* U3 n! d) c0 M1 ]. ?[*,
( b. m$ V# y0 Z u4 q" P* Y- E[*,
3 {: \) |" e" w[*,6:[font=宋体,工程搭建
; t) F6 m# d7 |, l+ o' i9 C[*,[font=宋体,首先编译引擎代码.
1 A+ a4 D; f- C4 [/ C[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
" z5 j/ J8 {& i. d+ _8 ]$ \[*,[font=宋体,需要重新 Cmake. l" c" Q) P$ C
[*,[font=宋体,编译好代码后打开ZSDome# F8 N( j+ j: S
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
' j' P* C8 J0 E8 \. |[*,[font=宋体,然后直接直接运行即可.! P, b: C; J! j8 Z
[*,
/ l ^0 H0 |. p1 Y$ V$ C[*,对应接口; @0 K9 ?% [; @ v# Z3 m2 q
[*,Android
% R' R5 a' \" E# b$ E6 X[*,DemoInit----[font=宋体,初始化引擎1 S$ Q5 ~( ~+ E8 M X9 c( X! ?6 V3 o
[*,Render----[font=宋体,渲染主逻辑- K; M7 Y! L2 o {! p2 M5 ^# ?6 ^
[*,2 x2 k% [4 i! s9 M( ]6 A
[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用, V3 A2 z% |( V" P9 P
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
% L A; h; i) z. R6 c1 p[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a7 x; e- }' G& A, P2 X, ?/ v
[*,3 B' R7 z' Y/ _ i
[*,然后使用:
: \1 ~. T" K1 ~+ t( E! O[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()6 Q' z5 Y2 m, l( n. O, I
[/list, [/td][/tr]1 l+ i" c( `7 I
[/table]; G9 R, E4 p' Q P: I
, e. F7 `6 b6 Z+ ] b$ F" A! S' U/ L( b
|