|
[table=98%,
* S7 n ?; F* q( k7 N0 `( B[tr][td]/ R, q1 s- C& L0 ~9 B' U
+ F% ]8 K* Q2 m7 |3 ^
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,9 M$ V t T7 t% y) s
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
5 b- e3 g4 |3 R" J- u[*,
. O# A) q8 F" O( t% N% s[*,多点触控:
7 r5 I- v/ Y: c3 }0 h[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
5 _1 t Q/ f' W9 g[*,原理:* x. N: U9 {" q5 r* A( g( L
[*,Int pointCount = event.getPointerCount();5 t$ D7 p5 i6 `$ W$ E% k/ \- Y
[*,获取当前的点击个数。
- d: ]+ O2 v& J' Y( O[*,ACTION_POINTER_1_DOWN
* P! a) h- \4 a5 Y" ?4 t[*,ACTION_POINTER_2_DOWN9 Q6 j" I6 p7 ]" s" k P" D( X# K
[*,ACTION_POINTER_3_DOWN* k$ ?" y3 B0 U
[*,ACTION_POINTER_1_UP2 r c- C6 B9 U7 @" X- J
[*,ACTION_POINTER_2_UP! [- G$ ^) X6 w g
[*,ACTION_POINTER_3_UP
4 f. ]+ |. I3 I9 q* @) t) t6 h[*,ACTION_POINTER_1_MOVE" L' K: U% `' }) J3 F ?; o; n! @7 s+ m
[*,ACTION_POINTER_2_MOVE
4 D% l4 W! { ?& C2 e7 t% S, m[*,ACTION_POINTER_3_MOVE' H0 [; w5 r, h
[*,[font=宋体,获取各个点的事件响应 Y: N8 l- G# t% H! E
[*,& }, r, a* M" R! g( ]' @
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。) U+ r: K5 g) r T0 p: H
[*,[font=宋体,同理第二点也一样。+ F' ~' X5 `" d* @2 O
[*,
5 o; Z1 N$ J; r5 @; i8 ][*,2:[font=宋体,安卓生命周期
3 |4 ^) F% s1 L4 D# l- E[*,[font=宋体,默认的安卓生命周期为点击应用图标
- _$ _3 l; G, C, n+ C) I- r[*,OnCreat OnStart OnResume {6 x! Q" W4 a2 b! d6 m9 c1 t
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory2 l( O$ I/ I0 [
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.% O' R/ v! u k7 r) \
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到" R, s: t6 A( A- i
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
Y! [: t% V* j$ K4 G2 H2 d; R' |) _[*,[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,就可以了不要让他走周期流程
, Z5 ]# y. v x: D6 g9 a: y[*,4 |4 y+ n/ T' {( X# |7 e
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏
8 ^1 }( s `8 L# h' p I s0 G5 Y* Y+ g[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.2 T9 N' A* l, q
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.% s, j- e; k& m& m+ d+ h
[*,[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,.
3 S, r* E0 K3 e4 o[*,
1 D) i' M8 j7 Y1 T% r2 h[*,[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,具体写法' c2 f# O5 p o& P1 ]+ m
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
% g" ]0 G# l2 ]" L3 \. H/ O# `$ A[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,
9 E+ g1 s8 x3 N+ ][*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,( B2 m9 C" J0 a6 }* \
[*,android:screenOrientation=[i,"landscape"[/i,># q4 F8 c# t T! d
[*,
D% C$ _- Z" T[*,% o7 F! c/ z" {5 u
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
/ |* G$ `9 N2 l9 n7 N/ G[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类
; e: J+ d$ v. S' {0 W% g[*," B# N s9 a; i/ Q) P8 f# t5 A
[*,读权限- Q; o# M1 D9 j" C. p: N" P( ~- l% @
[*,
: Q$ G! N$ A: |- k. I[*,( w: l) w2 m3 j4 c) ?9 S5 C- k. J9 d
[*,写权限
/ @, ~4 N2 G$ K& G$ }$ ^[*,0 v2 r8 r/ w' [, |& |( u
[*,
$ t5 Q6 t+ @6 e% m0 Y# M; Q5 C[*,电话接收以及监听权限
; U6 p. P/ ~9 Q B1 T[*,
6 v& b5 I; M- }* E[*,: j8 F/ n& A% ^& `
[*,短信接收以及监听权限; n# v" }7 K( T1 C
[*,
9 j: Z1 c4 K* _$ _[*,
6 [" }+ i0 r u3 j& I8 k[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页0 z" D- k4 w/ J! D, }
[*,
4 {* Z5 v0 t! F[*,0 k# |3 Z( M: i/ }6 T( G
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互% m& e7 Y$ ~9 m' R: g7 I
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.$ b) ^; b" F* l# V+ s$ e
[*,[font=宋体,所以需要这种方式.+ R9 I& B% U7 r1 Q2 x
[*,[font=宋体,在JAVA[font=宋体,中自定一个类- e5 ^0 v. J( R1 Q- t
[*,Class MyData
8 F/ v' l2 j3 l9 c: U[*,{* p% Y$ J1 E+ f9 B1 L
[*,Public:
: `5 y( t; S- P4 z: _8 C1 b[*,Int a;
% @* o, o3 G0 u* ~& ^6 s3 d: B: {[*,Int b;
" c7 U7 v' x! p6 C& G. ^: u[*,Int c; {* `- c+ G o- f
[*,……..};
, @2 G& d' Z3 }1 O1 ?6 m6 J& W[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明' J6 L% I7 u, B5 v/ w
[*,public static native void GetData (MyData data);
0 X5 y2 K% |- `* b8 T0 M2 ^[*,JNI[font=宋体,层中声明9 p; y' b, ?! v& c' w
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
5 c" v0 V+ ^7 Y% B+ D" ][*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值: J- G3 D# P* p
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");9 y' @. c2 a9 {9 n
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值0 \2 Y9 Y8 V+ w( p7 p1 J: b5 ^2 X
[*,env->SetIntField(m_pdata, “a”, 5);
- v/ o1 F3 F- O6 n: Y+ d6 X[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
& t0 R0 j |4 M# O) A[*,
* X, D5 q$ e! H$ k3 r[*,
6 ~( _7 b4 h; |% n) C6 ~[*,6:[font=宋体,工程搭建2 t7 n7 p7 U/ t- w9 x2 d! E
[*,[font=宋体,首先编译引擎代码.( n/ Q/ V2 D! p3 @9 @3 P* h0 U2 H
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
5 j' S" z( j+ {) H5 V8 M[*,[font=宋体,需要重新 Cmake
% r/ o, L4 ^2 L3 z[*,[font=宋体,编译好代码后打开ZSDome
J# @+ `" C; D* h9 K! ]4 P[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下# O3 G6 ]/ e: S
[*,[font=宋体,然后直接直接运行即可.
- h8 |' e7 U* L' t; H[*,
9 _8 |& n6 D- l. {9 P* n- W$ I: a[*,对应接口
/ E& o% E* \: F$ s; J/ n6 A# M[*,Android/ C( B; }5 Q) e
[*,DemoInit----[font=宋体,初始化引擎7 ~. j: c2 e* w! S0 {; N
[*,Render----[font=宋体,渲染主逻辑% s) j- N3 D2 r* I% O' |, j& N0 z
[*,. J% L Z% q( q5 s: D3 y8 v3 h4 b
[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
# V; C# c! v: v+ {[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib8 D% s* j6 X: D h
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a) R! U: w6 W( x/ G
[*,# I6 ?. Z( `% k3 f
[*,然后使用:' o# D; g; L# l) N$ x3 A8 n& J
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()
' @2 }! `& l, l: S[/list, [/td][/tr]
# `* Y. n9 Y/ q5 Y4 g# |$ s[/table]
n1 W# C% ^" R' M z2 \8 r- z' R- [$ C
! L; l0 w" s4 E5 S% @; w) c3 |
|