[color=#939ead,[list, C6 h/ Q2 O/ K! D
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案5 l3 O8 A' s- t% t2 d- ` _
[*,, g# e) C) o8 s. f2 V: g7 K* d" Y
[*,多点触控:5 ]2 v9 S' M; ^6 q
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
0 e0 ^" d! `1 @: T$ m[*,原理:
+ n& k: c. ?& R7 n( H0 S( Y$ y[*,Int pointCount = event.getPointerCount();
+ G1 b- t. j% }3 O[*,获取当前的点击个数。
5 o1 D# z( G6 Z3 ~4 P[*,ACTION_POINTER_1_DOWN
" J3 m( ?: N5 B. V1 d[*,ACTION_POINTER_2_DOWN- o+ q! ~; Z1 a! }2 ~9 O3 U$ q3 x
[*,ACTION_POINTER_3_DOWN2 I" l; X, ] j \1 J& Z! s
[*,ACTION_POINTER_1_UP/ _* w9 p( ~2 y! ]/ Z' y1 b1 t
[*,ACTION_POINTER_2_UP! ]3 c7 d0 @* J) _
[*,ACTION_POINTER_3_UP
6 P1 X: q) ~$ d3 l; ?[*,ACTION_POINTER_1_MOVE
& _9 H& r0 [' l. X( ^7 R[*,ACTION_POINTER_2_MOVE
4 T6 P! r0 C. E$ ^" C7 x1 C[*,ACTION_POINTER_3_MOVE
/ B! _) z& R8 s' r/ G" _: X3 Z[*,[font=宋体,获取各个点的事件响应1 A' |& n1 I% ~1 a4 U7 H/ ~& L1 g) n& ?
[*,
) L/ y3 [8 [% R7 l' w) Q5 [+ J[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。' A7 `, ?8 q* G% {$ V: c$ s0 A
[*,[font=宋体,同理第二点也一样。) x) [$ G* u3 Z' b
[*,
2 r }! z+ }& R6 w) E[*,2:[font=宋体,安卓生命周期
2 M; y) K; y x R* C5 j% T+ X, |! _[*,[font=宋体,默认的安卓生命周期为点击应用图标9 |) ` V9 w" n' ^3 H/ ~* {5 O
[*,OnCreat OnStart OnResume
( s! z5 G( f, G; T# J& ?9 w# v[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
& {3 A4 h. `) v. F) C. O9 D[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
% x! T4 t b7 T" S; v c[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
( t9 U$ ]/ E* H' A' o[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;, k/ v8 G4 f1 l! w
[*,[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,就可以了不要让他走周期流程2 j. P( K0 {4 {1 y% J
[*,
1 r" a/ T b0 X6 g: p& n7 e[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏
, S3 y+ x* ^% U- T: g, o# S5 t[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
5 m% d. X5 a* H3 j) x[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
( b* T" O6 g, M[*,[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,.
- _2 Y! x* I% X# _+ n" ]/ X[*,
) A( \8 e4 y' |# }- k5 H0 b( p' d[*,[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,具体写法
6 s4 `6 \. k$ c3 S! R8 _$ Q[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加5 f* s* O& F# I* X2 z
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,3 W* a) N6 K$ `6 p* a$ F
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,: g$ z# ?4 O ]$ F2 E) W
[*,android:screenOrientation=[i,"landscape"[/i,>! o# m- `+ w- p$ B
[*,
" s* t$ ?5 ?" `4 {; ~8 a, g6 E[*,4 A# [/ o$ I4 g6 [
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
. _$ w' M, R7 s5 v* ?) U[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类1 N! h K2 i. q( P+ ?
[*,
3 t1 E7 ]( ~: D7 F; _4 H; s[*,读权限% a/ m) c( o) J0 V$ g
[*,
8 t7 M! ^, u( v[*,1 r5 p4 \5 H, o' o2 u/ y
[*,写权限
: e1 G2 H. G, c[*,, B% \* N) u+ @
[*,2 D" s9 G( z6 \$ l8 a
[*,电话接收以及监听权限3 H0 a4 c- }& N: U
[*,
$ `- u/ V9 k6 C9 t[*,
6 ~' I1 F) D7 t s/ n0 A[*,短信接收以及监听权限
1 T9 }/ W2 A9 j& [ e[*,
7 d4 C( }$ X# E. T U[*,1 V9 W9 c: \# o6 Z+ b1 c* b
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页0 {6 ?& @3 A I
[*,
! q# C7 y( o5 N3 h[*,
. o, Y4 E9 e: G/ U, }) F9 |[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
. x2 ]* x$ r8 u5 ][*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.! b& d1 \. s" ?/ F% i
[*,[font=宋体,所以需要这种方式.' U/ `$ k& T2 O' r0 X/ E2 t
[*,[font=宋体,在JAVA[font=宋体,中自定一个类
6 @9 W1 Q7 j- i[*,Class MyData9 g7 {" ~2 z! F) L& @. o2 a
[*,{
: M. |. t; k& l0 Y: `9 Y* y2 y4 O[*,Public:
6 m, ^6 x% Y4 g6 ][*,Int a;
' v5 h$ M2 U& w1 {[*,Int b;
# r8 g. _+ P K5 C9 \$ I[*,Int c;# M& @+ J' h+ Q9 G
[*,……..}; _( D" R) G- ~; q# s! C& C
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
( X* b% {' d( A1 J[*,public static native void GetData (MyData data);
5 I+ N" T# r% W% w[*,JNI[font=宋体,层中声明4 d+ r' ]7 G6 p/ h3 S3 y
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)5 y6 `. C" d! ]( s4 O1 K1 a6 I& m
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
7 |: b" ~+ ]6 J: H3 e- ?[*,jfieldID sound = env->GetFieldID(cls, "a", "I");
9 e, z1 P" i7 [0 W! Z[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
( k, ]1 O+ w+ P! d. G[*,env->SetIntField(m_pdata, “a”, 5);4 k! Q% [& ~# A6 \. c8 c/ d1 Y7 U: X
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
% q8 x- u _! V# J! Q9 L[*,- m: z9 c5 W4 q# ~8 W0 r3 K0 N
[*,
- O8 q8 D* K( f! t& D+ w( U[*,6:[font=宋体,工程搭建
0 q3 B. \$ W- p% Z% j[*,[font=宋体,首先编译引擎代码.. f( A) X4 n% L0 I, n% Q3 M* k
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
( w2 {7 q" [4 b[*,[font=宋体,需要重新 Cmake
; Q1 g4 X" |" Q; I( C% t I4 L[*,[font=宋体,编译好代码后打开ZSDome
/ I) x4 x3 V1 Z. g- e[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下" P4 }3 A$ K! K: H; k
[*,[font=宋体,然后直接直接运行即可.4 S! I7 d$ P: O7 ?4 Z, @
[*,
9 y+ i8 Y" Q5 z, V. N# r; U[*,对应接口4 n3 V! E5 ^' X" J% V% M0 H \
[*,Android
: b: a2 h( O: V( P6 ?[*,DemoInit----[font=宋体,初始化引擎
& e6 m1 |2 ?- ]3 D) b3 o0 c3 [; g[*,Render----[font=宋体,渲染主逻辑
9 L$ y2 R" [7 w1 }: D, S5 J[*,
. |8 [: G1 N- @" _% a[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
8 ~6 E' Z: U/ H7 ^% E[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib, s+ k( t$ q4 p t
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a" w9 S9 o! ^: f- k$ j
[*,
* Z, ?9 Q% B+ S3 T7 L[*,然后使用:
8 H! M! \2 x* C4 ^6 ]$ ^) y[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()& f1 l# H7 ~% C# {0 I1 j9 r
[/list,
[/td][/tr]