|
[table=98%,$ n& L5 \$ S7 n# V, E
[tr][td]
) g! |# T9 [! l+ m7 y! ?" Q* }8 e: h- C$ W
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
# C0 F/ Y2 b( j4 q, t: c1 h& s[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案; c- L7 p: j9 k' p# C" p
[*,
$ {! E( }: d5 @7 S' C[*,多点触控:
1 K0 N' H- T8 ^1 D: N- \2 z[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。9 T( \8 r! k! }( Y
[*,原理:: H* Q, Y- ?7 k& g+ B% q
[*,Int pointCount = event.getPointerCount();" k! K$ Z" H9 U# U6 A5 F
[*,获取当前的点击个数。" I+ j1 ]: W, A& ?) J3 r$ A
[*,ACTION_POINTER_1_DOWN
5 k8 L: D* f# v3 Y# F' z" p3 X[*,ACTION_POINTER_2_DOWN
+ F/ X; O4 w6 }/ c3 s[*,ACTION_POINTER_3_DOWN; H- q7 q! b* b, O& F
[*,ACTION_POINTER_1_UP" g$ f0 p# _! o h' f- @7 t+ \( u
[*,ACTION_POINTER_2_UP& V h/ `; G6 V* l$ ]. x3 j4 N* y% o
[*,ACTION_POINTER_3_UP, u+ [8 x+ v5 h2 J) p
[*,ACTION_POINTER_1_MOVE! A5 S' e$ i. Q0 b9 z
[*,ACTION_POINTER_2_MOVE
- R7 `% X& v) s3 X4 ^+ n- `3 ?[*,ACTION_POINTER_3_MOVE% O' l- P) n+ L8 z
[*,[font=宋体,获取各个点的事件响应
* m$ y) M7 G* v: p, j' W+ z7 U[*,# n( c( |8 _' D" ~* A/ g
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。; y2 u2 N, W( O: f. `7 z
[*,[font=宋体,同理第二点也一样。% L" o) _3 J" _
[*,
% m& w& G9 `% H' q[*,2:[font=宋体,安卓生命周期- J0 T9 ~! z! K& O, N
[*,[font=宋体,默认的安卓生命周期为点击应用图标3 S6 r% ]! }9 Y
[*,OnCreat OnStart OnResume
6 l- H* x, M4 P( Q/ g4 Q[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
7 Z! a: S/ P0 L5 |) k" {[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.6 I8 S3 I6 b4 P/ f8 a2 P5 s
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
! Q C) M0 x+ N3 R[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
5 q# f3 S) w9 F1 q4 W- E[*,[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,就可以了不要让他走周期流程 Y& S8 e- N. q+ L/ w
[*,9 m- v8 p6 d6 h1 k8 |
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏5 l9 A) v, Z8 J) A
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.+ O' r8 }1 M! \2 N' m' n4 {0 O/ `
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.. `" ]# g8 _! N$ n1 @# Z4 b- N
[*,[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, |+ r, J3 U8 S9 L[*,# d% \: L% D/ V4 \
[*,[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,具体写法" }9 L. z. |- Q3 a$ r: D; f' J! E
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加& f$ l6 S, ?/ W) y" \
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,; k! m4 h/ p7 C Q4 t9 s
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,0 x# v& L+ e) j3 \% Y! o
[*,android:screenOrientation=[i,"landscape"[/i,>
$ g2 ^3 ?9 a6 L[*,
: l0 _* ^- y5 A1 W[*,
( y. X: _6 k, w8 {[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
. m1 K; b( g/ }3 T% h1 I0 K/ m[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类9 Q2 Z# {1 I' Y* s" g0 N
[*,! ?. I6 Y8 V, ]3 F( h
[*,读权限
$ `. Q& x- I2 N- {7 u; p[*,5 [4 M @( I9 k
[*,
' p$ w( H( d1 _+ l& ]$ y[*,写权限
* }4 I, s |0 c/ {[*,
, y! ?- q4 X. p. Z ^/ K& h[*,% d5 `2 Q; D* T
[*,电话接收以及监听权限2 E. C# Y3 H! W5 y* S C0 G" ]
[*,
7 e; C$ c9 g- Q1 D# c! A[*,
1 A' X' ~5 b, t" w7 i. ^5 W[*,短信接收以及监听权限& F% q+ u& {0 e; h! e k7 b
[*,
# N8 k3 D3 C5 O& q[*,
1 l1 D5 B6 n/ |[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
% I8 X, n; r/ v[*,! d7 f4 F0 f/ s2 y* Z
[*,
1 E7 Y- r$ R0 f7 u4 I[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
2 V/ W( {% Q+ w[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
9 Q6 J) ?* e- x4 D: H[*,[font=宋体,所以需要这种方式.
2 D+ O8 E3 h& q[*,[font=宋体,在JAVA[font=宋体,中自定一个类! A, B2 U3 w' s( ]8 \# @9 M! }7 G
[*,Class MyData
3 R0 q F/ `% B k% v[*,{
E% j2 N/ e1 p) {7 v- f5 C[*,Public:5 [5 R# F8 D, R9 h+ @: {0 o
[*,Int a;% v4 R$ E$ c7 \* Q5 B, K- s8 f
[*,Int b;2 d( ?: d% q S9 Z1 d9 G3 E5 L5 z
[*,Int c;
+ `; O0 y/ V4 {1 n; G- V% S[*,……..};( v' n+ u3 d' e* t6 n& a
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明* M. {, l, x; |4 l1 b
[*,public static native void GetData (MyData data);
: l9 @) T9 [5 q* w0 [; b" X1 d L[*,JNI[font=宋体,层中声明
8 N6 ^; L9 ~# {[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)# @ b+ L5 W0 f
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
/ K9 @+ l/ z9 V; K3 p[*,jfieldID sound = env->GetFieldID(cls, "a", "I");: F$ E+ C( x: v S) o4 O+ q
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
1 o# J5 e/ O, c: m[*,env->SetIntField(m_pdata, “a”, 5);# H4 }$ f9 r+ ^! N, @3 u+ U) `& ~
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.* F" C: v7 P5 p% D
[*,
+ {2 ]. b m8 W* O, a; w[*,
1 O3 g- V t; e: X; c& l5 q' m, u9 Y[*,6:[font=宋体,工程搭建# m+ A( F; B) c$ b6 `" p: A2 O
[*,[font=宋体,首先编译引擎代码.. O% m! ]: _# Y5 R
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.+ q2 q- K' D. n3 X: T. ]
[*,[font=宋体,需要重新 Cmake3 ]& U O+ Q6 ~" D" G
[*,[font=宋体,编译好代码后打开ZSDome
4 ?5 r' B$ v( H, c' S4 x9 `. _# t* N[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下 t# e. I1 J4 y/ i6 l4 y
[*,[font=宋体,然后直接直接运行即可.+ x" j) e& m/ F
[*,
% w7 [- z. w8 x6 G/ B* m[*,对应接口
+ k; Y$ f7 A$ h) T9 f9 A, Y[*,Android. u0 M: D# |6 a: j3 k- j/ S {
[*,DemoInit----[font=宋体,初始化引擎
# x: L. O: U, A3 B[*,Render----[font=宋体,渲染主逻辑, x+ S# @$ \1 X' ^! |; X
[*,
8 p- S& X2 o8 y4 C) h9 T9 l[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用0 R# ^5 k5 C J) x! S) {' ]
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib+ a" R" d7 `1 _4 f! k2 S/ ]
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
; w( p( C x/ c& F) V v, }[*,
+ I* D: j- e% Z, l7 f; H[*,然后使用:: o/ G- H- F9 W! s" X3 x. {* E
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()7 g. K# z4 O6 Y. F" r
[/list, [/td][/tr]3 ^* Y+ ~. G8 W) R; B) v
[/table]
# }. |, a. i) B' Q8 c- ^: c& g% X" p# p
6 r L+ A# W; p j, Z
|