|
[table=98%,
, E& y4 h* f% T2 u[tr][td]
0 ?: C2 I6 c$ \9 o7 j2 E9 T# f* L7 v7 j# d+ R/ r
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,& u* S7 F k! X/ ~; u. `
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
* w: A: K3 \1 t( N9 U[*,3 N) L, n! ]; \( m1 q/ J2 \4 J
[*,多点触控:
" M& I" v" o, l( r( f[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。( \1 D6 t; X" P/ S; H
[*,原理:1 B# x; @) \- O8 Y. k" D( _+ k. M; E
[*,Int pointCount = event.getPointerCount();
' e' G& ~- y/ ` D8 Y' U[*,获取当前的点击个数。$ ?# d) r$ Q3 k$ @
[*,ACTION_POINTER_1_DOWN
4 d! \: ]( s5 A: R' U+ F% }7 Y[*,ACTION_POINTER_2_DOWN
" V* b# U$ T" C[*,ACTION_POINTER_3_DOWN
: n/ @/ z `* M) H. c- V[*,ACTION_POINTER_1_UP7 W: f7 O1 L; k* Y' A
[*,ACTION_POINTER_2_UP
6 V c* p7 m3 C, }: D% |7 j0 V[*,ACTION_POINTER_3_UP( q* F( e' j5 B% c
[*,ACTION_POINTER_1_MOVE
: E9 f/ [4 e$ C% k9 d* {8 E[*,ACTION_POINTER_2_MOVE
& k6 d" S% A. a& J[*,ACTION_POINTER_3_MOVE
! I7 q! s+ I( ~; h& c[*,[font=宋体,获取各个点的事件响应
+ u; p0 d7 L# u2 k' R. t[*,3 O/ h. \! D) I4 ?; z8 s F, ^
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
$ N- J% S$ R) G4 H( ^7 S" l[*,[font=宋体,同理第二点也一样。
0 u: w( N) E. [[*,
1 v3 V; V+ U/ d: b- | M[*,2:[font=宋体,安卓生命周期5 @9 ?2 S& \" d/ E3 i( Q8 p: g; i
[*,[font=宋体,默认的安卓生命周期为点击应用图标4 q' @0 R! z' L/ l4 v6 i% x, d
[*,OnCreat OnStart OnResume
0 t+ a" k& N, r0 ?[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory5 @$ y, t0 q0 r8 G
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.8 c4 C& a% H# n, z# i5 G: }
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到$ g3 l* a$ F6 H9 a, d: ^0 m0 F
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
1 |% d+ [* \' g# J) V[*,[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,就可以了不要让他走周期流程# t, i7 y$ L F9 l s
[*,
" O3 s+ |9 M: G9 f* b[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏: E) n5 _; x$ `4 {1 a! v
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的." u% Y( r; v# S- R& J
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
s/ O, M! Z0 z& d[*,[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,.
: g: Y& }, Q3 X, E z. i[*,
1 W+ P }3 j8 o, V& }[*,[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,具体写法- L1 o3 ~. R3 r. d- v" F
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加$ b5 t6 h* i7 e& R& F8 K
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,% `- m+ [( \- c# S; @
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,6 S- r+ g* t! C, [6 y: ^* x
[*,android:screenOrientation=[i,"landscape"[/i,>
?* O( S: v7 |$ H4 z4 f[*,$ n6 H# `/ u8 y/ Z; F$ Z3 E; T: E! c
[*,/ d- J: T3 ~' W8 f% B
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限' k8 i/ h& o+ E4 A5 M' E9 P# v
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类% N6 g1 Z$ P! M( W8 S @6 m
[*,5 D# ?+ t: s- K( Q$ P
[*,读权限
, Z. q3 \3 }: Y) x[*,
% o: F, L4 z/ r- ?[*,% i9 z$ r* g, F2 @ W! G2 Q+ e1 s+ H
[*,写权限
3 d; l; y, y0 r! W5 k" V! c[*,
3 ?" _1 Y! G+ P) P9 V[*,+ m! a; p2 I7 B/ _# k) ~
[*,电话接收以及监听权限: U4 @& W6 u5 h" t2 |9 _% j# U
[*,3 @4 k0 M" r! | _% v+ h* ^
[*,7 I4 P4 Z) r) R
[*,短信接收以及监听权限3 h+ J% z+ n" T T
[*,4 b$ i/ w" ]1 A1 i/ K& ?
[*,; W1 X5 j- x' j3 Y% h; V0 j, c
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页9 T9 Y( n0 H7 r, v5 `3 x% B
[*,
1 A9 k. Y7 I6 A5 T[*,+ q6 \$ R/ f) o6 Z: ]- O
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互4 }3 ^: |7 l7 ^: K! N
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.9 q3 H, @1 _/ H; L8 J# J0 J
[*,[font=宋体,所以需要这种方式.( s2 l! `# F- w2 ?6 n* L! D' T2 c$ A
[*,[font=宋体,在JAVA[font=宋体,中自定一个类
% K" M' p; f1 Z& q$ H[*,Class MyData( z H) r. o# a% y$ w
[*,{+ P1 Z3 t K$ o8 {3 b# B1 X0 N$ @, [
[*,Public:
. \# J! p& E2 ?[*,Int a;
/ {9 O4 M) M' j/ R9 |+ g+ Y# v[*,Int b;
. w* f3 h! O+ ?* g2 r1 O[*,Int c;
# \: h5 A6 D: C; u[*,……..};% d+ x! d: E7 ?* \" Q, p% y
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明- m) O" Q- |2 }* ~. o
[*,public static native void GetData (MyData data);! `3 S* B3 e( r; Y7 h
[*,JNI[font=宋体,层中声明; Q/ t/ \% S/ Y: u2 C0 _7 g
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)9 @5 X6 G; d1 d. @* s# B$ Q
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值0 O* k! t2 c4 y( a$ J7 l' }$ k
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");# M/ Y- V3 y' _! E( w$ u: V
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
0 U/ _7 o% r: D. {+ H, [$ _9 ^[*,env->SetIntField(m_pdata, “a”, 5);
# j3 Q0 k- W4 L- A[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.9 Q( G$ n: c2 `& \( D/ W2 c8 D
[*,
8 P! A! g5 g Y, z1 k' |[*,
# I1 x1 [! u, j$ J w3 @6 [[*,6:[font=宋体,工程搭建
) c3 t; m; e) s8 O4 Z5 v[*,[font=宋体,首先编译引擎代码.
/ U" p8 t6 w7 ^9 F8 u[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.* I3 s( L7 r+ w4 @+ {. D4 b
[*,[font=宋体,需要重新 Cmake
# r8 w: J |9 c8 {) q) I f% x[*,[font=宋体,编译好代码后打开ZSDome7 v' v/ k( G$ d! G9 y" N- }
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
' P1 k1 p3 Z! Q& A: N( f/ \[*,[font=宋体,然后直接直接运行即可.$ ^: ~% L- K$ T8 M- V b
[*, W( h6 R" L! F5 F1 [
[*,对应接口
: | c0 a7 m5 [% }8 J[*,Android; ~" _6 k$ g. `! D3 T( l- D
[*,DemoInit----[font=宋体,初始化引擎
$ ` c3 \) t8 ?2 d- v[*,Render----[font=宋体,渲染主逻辑
% _& d5 E" G3 L7 p Z[*," v8 D) a+ Z! a# R5 P. A$ r+ D1 J
[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
0 \& a4 |% G8 c5 `[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
& @) I* o P. I' c/ E* }[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
! y/ c7 [2 y; |8 \9 c; y$ y9 H+ |* J[*,; K% j) v2 h. s
[*,然后使用:0 `' {) _) {3 J
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()6 W. t- x' L+ v1 b% p, n( W
[/list, [/td][/tr]
5 y6 E9 J. M0 j8 `& O) I3 P0 @[/table]/ k2 }$ n/ V+ H; x
' M9 U8 q1 r! w3 R u3 T1 N |4 n/ p/ ~, z" k+ p4 y
|