[color=#939ead,[list,
" A" z7 I2 i2 r/ E1 i[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案+ h; L$ H# a' C9 t* p2 K1 m
[*,: G2 M! B- _- t4 W
[*,多点触控:
# u: A# x* V, T' y[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
, }) r; m% E0 n[*,原理:! g7 M5 s3 u: k; f/ U
[*,Int pointCount = event.getPointerCount();7 [9 @# p1 L" Y( @7 a0 P: w
[*,获取当前的点击个数。% l; H! ]2 }7 ]
[*,ACTION_POINTER_1_DOWN
6 f! d* ]+ _, R[*,ACTION_POINTER_2_DOWN4 k& j: e0 W. L# J1 Z9 r
[*,ACTION_POINTER_3_DOWN
j G& K: b; D) v/ n% z7 N[*,ACTION_POINTER_1_UP
# M8 I4 m5 ]' L8 t: G% R$ O[*,ACTION_POINTER_2_UP
5 F3 T9 L0 G# Q& L6 D. F- c[*,ACTION_POINTER_3_UP
9 E) y5 _1 b# b. t- ~, v1 t[*,ACTION_POINTER_1_MOVE
: A) H4 t' }4 |. I, N( {, Z2 e+ A5 {[*,ACTION_POINTER_2_MOVE! _$ z! d4 c) k# V! i1 h6 ^4 ]) J
[*,ACTION_POINTER_3_MOVE
$ z' i3 R1 Y5 w0 |; @[*,[font=宋体,获取各个点的事件响应, [' T/ B! W- u4 W
[*,7 g& |4 R' v% E" v: E
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。# f, o( w. B- s5 {1 c8 P. d% T
[*,[font=宋体,同理第二点也一样。- M, E: H5 N% ~1 P
[*,: W# q- b2 I9 C' {7 B( t$ |9 N
[*,2:[font=宋体,安卓生命周期
: c9 `1 z! P$ }' _, m; q6 f6 [5 [1 f[*,[font=宋体,默认的安卓生命周期为点击应用图标
! |) j7 y/ Q+ K7 w[*,OnCreat OnStart OnResume
3 o3 B' l! o# q! t[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
. o) w* Z. q4 g4 s' {[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
/ Q, Q& ^$ P; f7 g6 `3 C0 g[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到; V p+ l: l1 ]) W: {, \( [
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
5 e, J4 _4 B4 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,就可以了不要让他走周期流程
. \* x# h( r) a* s* n* p[*,
- i9 f' o; J" P" m- c[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏. A: u# T1 `' J! E
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.9 ~7 k' C+ e1 @) S5 V
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.( |8 p0 z4 W V4 C4 t9 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,.
, r- e- h$ v* I- c[*,
& t' |7 ^/ t" f5 [& v5 ][*,[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,具体写法
; [0 Y' J3 B. |# E Z[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
% K3 k% Q U, C2 k( F[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,$ [+ f( W- ?) X4 }$ X
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,4 L" K8 i& Z' ^' m$ p
[*,android:screenOrientation=[i,"landscape"[/i,>$ ~' a# d6 ?8 E) ~! y
[*,5 E; Z8 r9 K, C
[*,- T) P9 }: B4 f9 j: [' Z
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
/ y* f, o* o F2 v' N[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类
% X( y0 d8 P. f. j& f; z[*,
0 p4 G! k7 B. }2 M8 f/ X3 ~* D" }6 O[*,读权限
% m d/ \5 _9 d) b. a* ]6 F' m5 @[*,
$ U) E5 ^8 p. z" t& d/ x[*,
3 A. D; P V& z, P1 ]3 g[*,写权限0 d$ }. w6 Z! U: O
[*,
- E3 q3 t- [- V: m* G7 P[*,
% P. m! ~5 D( x" y[*,电话接收以及监听权限
; O7 k; w# I7 G2 f[*,# n2 l) r4 ?/ I- p8 P. Q
[*,* S! `: [% M; x8 ?
[*,短信接收以及监听权限4 Y8 z- K4 `; {# p9 ^0 T) B# ?0 @2 F7 K
[*,
# j0 T' B, `. c[*,
; K0 C1 H4 J# ~+ F; \[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页; Z, S9 |9 ?0 a
[*,
' \+ O1 ]6 a: f c6 p) [% Y[*,
L, ^* M% z2 C5 J[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
S6 X. Y9 e9 R# w[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
1 t1 A- {1 C" T0 ^' |6 E[*,[font=宋体,所以需要这种方式.4 Z8 H6 ?' b; x1 l& w) R: u: M
[*,[font=宋体,在JAVA[font=宋体,中自定一个类
# Q, d/ l0 N' l7 e6 @2 N4 W[*,Class MyData3 ^$ V* o+ D( P2 h) K2 p
[*,{
1 z+ ^ ]' Z z! T2 ?% Q[*,Public:
3 }/ \8 W0 F( n" s8 K( z# f6 Y! L[*,Int a;8 y x7 v) n6 F
[*,Int b;
- F" f! P; c' }3 j4 g& |: D5 A[*,Int c;
Q3 |: B9 P/ V2 }9 Z% ][*,……..};& S" J$ V! \& |2 p3 T' Y
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
9 ]- A1 I( R! p0 x[*,public static native void GetData (MyData data);
P# {& o& Y& F* J% o; G[*,JNI[font=宋体,层中声明4 T0 U7 l2 |, e; }
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
4 v* n2 F" w- h, U[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
/ Y% j1 x. |0 X7 F# Y[*,jfieldID sound = env->GetFieldID(cls, "a", "I");* H0 |7 |, V) ]5 N% x
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值. e7 x n! k8 x
[*,env->SetIntField(m_pdata, “a”, 5);
$ b" d, C, N; d# Y2 t5 S. u6 {[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
/ b8 i4 Z9 |% f' Z4 @% h5 c2 O7 }! y[*,4 N; O( j# ~; O7 M7 [
[*,, w1 i2 t$ N2 u& E& B4 \; p5 q
[*,6:[font=宋体,工程搭建
- d( Q8 t% T$ y5 x$ X$ i( c5 l[*,[font=宋体,首先编译引擎代码.
& T% r: F9 M5 [3 O( @- f3 P. r$ H* g[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.0 T( Q9 v7 J& `$ i- c: t6 x( ^
[*,[font=宋体,需要重新 Cmake
! s3 x, c9 E( q- `7 N' G# h[*,[font=宋体,编译好代码后打开ZSDome
6 ~0 E+ U% D# P6 r) d$ G5 w[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下" J% B% a! W) x$ A. d
[*,[font=宋体,然后直接直接运行即可.
' K! W- O3 D3 A1 W$ z! h2 h7 g[*,! R. H$ c3 U/ \+ G3 g3 `
[*,对应接口# T3 u" j9 M% D
[*,Android( g6 `* u' @# N$ E6 r8 |/ X' Z( [
[*,DemoInit----[font=宋体,初始化引擎3 @% j! }. d5 q3 ^! H; Z7 v
[*,Render----[font=宋体,渲染主逻辑
& y1 S9 J9 i9 ^[*,
+ z& V$ j* p& D; V- Q8 r+ ^[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用6 t* w; i+ _2 \7 G4 W( F; c4 y+ q
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
- o5 N5 i" P2 @ v8 A- U. R2 Q[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
' m* ], G% f% q7 E+ U[*,+ ~ u. g5 m% M% w$ C) ]
[*,然后使用:5 a& n* v R u0 p5 S+ m+ H
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic(), e( a4 k8 ?5 H+ v( R
[/list,
[/td][/tr]