|
[table=98%,( j. f9 P7 j1 R D* l) j
[tr][td]
: C7 S1 M% H( G' L7 x6 }/ t' l9 t
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list, |. J2 }& \: ~: u% q
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
}' v/ [5 d5 G- y[*,
& L8 u5 b6 l# N[*,多点触控:
: H0 C4 C m7 F1 a& z: a- \" }5 j[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。: d' T" N8 y9 v& ^2 m, W+ p) K
[*,原理:2 U$ `& o# n$ j* ^9 }4 W. T
[*,Int pointCount = event.getPointerCount();2 ]2 i! h; ]1 X! @5 H2 k# K( o
[*,获取当前的点击个数。$ _% I* T! E( T% Q) _& v& D$ x
[*,ACTION_POINTER_1_DOWN( @4 W: v, N" K
[*,ACTION_POINTER_2_DOWN _( h! K9 R1 Z1 g7 s: z4 M1 X
[*,ACTION_POINTER_3_DOWN$ z' ^5 T n( w0 c3 p
[*,ACTION_POINTER_1_UP
1 c; Q7 B2 c3 ~. F" z" h[*,ACTION_POINTER_2_UP
( R( q8 O5 n* X) ]8 {[*,ACTION_POINTER_3_UP. o9 ~6 v" e6 u+ Y8 J
[*,ACTION_POINTER_1_MOVE6 i8 K; n& y8 Z& u/ N0 @: ^- l
[*,ACTION_POINTER_2_MOVE; M$ l- J0 V: d
[*,ACTION_POINTER_3_MOVE0 w0 o0 r2 f2 C$ M; S! Q- U
[*,[font=宋体,获取各个点的事件响应
+ K7 }6 m8 k! u* g, o% y, y[*,+ @0 j J2 R. ~) W$ S- i6 z
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。( |; _- M: v. x% C+ T+ ]% x
[*,[font=宋体,同理第二点也一样。
3 |2 a) g! q t. l( Y[*,* ] k8 m" [# U& }
[*,2:[font=宋体,安卓生命周期! f7 i$ ~! o( _, O
[*,[font=宋体,默认的安卓生命周期为点击应用图标( N" x# M Z( U. f2 v4 }6 _
[*,OnCreat OnStart OnResume
7 b+ ^( v: A; G) L; A$ `8 W9 X[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory) O8 e% k2 N- F* S" X. B1 V( m) K
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.7 w& J Z) E; E' e- E/ b0 }* P
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到7 C( i% c: j& R; ?5 S7 q
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;* O% A, b2 u+ F0 T' @' K. J' q
[*,[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,就可以了不要让他走周期流程6 r( N9 x& h& h' J7 M0 z- G
[*,; v0 S) S7 [# k8 i
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏4 x) l0 A: ~9 b! x2 D
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的., h1 e: [& `9 W! T
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.: `! x: V2 O- r0 c" I
[*,[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,.4 G, Z2 y/ O2 D8 f; l
[*,! L. `9 m# ~0 W+ O
[*,[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,具体写法
- W4 F1 f/ S T7 i9 E& h[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加+ I. K$ o$ I! l2 ]$ N' f1 C
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,
8 z' |2 y1 ~6 z6 e" B+ R3 x[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,* `1 w3 G2 T# r, i" U! i5 A% ?6 @
[*,android:screenOrientation=[i,"landscape"[/i,>
% p3 i/ r& }. L: K1 t) M[*,5 H" J% w5 k% z: x4 U* e
[*,
# Q/ O c1 U! X; Z% e6 ~* k% K[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限* N, ?6 o2 S5 U4 i( I0 x
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类/ ?0 ?0 s% ^- V$ @; e
[*,& p0 v. c: m$ n( O% C
[*,读权限$ C+ E- d$ b$ C5 h8 {2 T- W. f; z
[*,3 q2 O' m H- Z; [- {5 j& l
[*,$ N( r, F* _; D9 e8 D4 p# P$ B
[*,写权限
9 a6 b) q/ i' t1 X7 P; q9 E1 Y[*,
% n5 k2 Q. o$ J/ ]- }2 q s[*,0 {* j$ k3 P- g3 q S, O5 |& E8 K) ?
[*,电话接收以及监听权限
3 n, [8 y7 c" |! J& {( T1 \# g[*,$ u0 I5 D0 T8 D+ d8 R, t N
[*,
' p$ {; {* P: Y[*,短信接收以及监听权限/ V5 ^3 i: @$ E$ c5 o+ c
[*,7 O. _3 q5 D: i1 X1 j8 X
[*,
0 r& L; o {! I2 m4 }# v- f, |, }[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
/ _7 N$ F4 J7 j/ S% \/ ?[*,
3 D$ h7 ?+ t2 P# t[*,; ~) R; [0 J7 ^/ X
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互6 G A4 l. _% e( p1 c
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.4 n5 k6 r5 ?3 @# E" f
[*,[font=宋体,所以需要这种方式.
/ r) ~3 q) _* Y5 r' B: |[*,[font=宋体,在JAVA[font=宋体,中自定一个类# U1 n+ s7 z! t
[*,Class MyData
4 j" d; Z8 s J* m[*,{
, d0 I2 j' W3 N% i[*,Public:+ H# T/ _" H4 {# {7 p
[*,Int a;
$ |4 l1 F7 c/ ^. ~) }[*,Int b;
! z7 E3 n9 l2 i1 v% b7 J[*,Int c;
, o2 o* a( x7 h' f5 ]8 B[*,……..};. X3 N* w P8 }8 b, p
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
. j' H" F* B5 w5 [; K( p[*,public static native void GetData (MyData data);
3 j2 ^; H. N; k! p[*,JNI[font=宋体,层中声明6 Z$ J! j1 v8 G$ k/ B: T8 [! z
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
- N! ]( p. m8 N[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
* J6 q- P2 r& J P& `. q[*,jfieldID sound = env->GetFieldID(cls, "a", "I");
. ?, l5 l9 t0 U[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值3 Q5 n5 V0 n {: x/ |1 _) N
[*,env->SetIntField(m_pdata, “a”, 5);+ u$ _5 \- a2 d; S( z
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
" w6 g7 U( H; c# ^, U9 J8 b[*,
! e7 ]& @& k( R7 R[*,, ~5 c1 T( s3 e" O8 z- M0 U
[*,6:[font=宋体,工程搭建$ r% q5 R1 {, o, F f- h
[*,[font=宋体,首先编译引擎代码.$ w. M8 Q, o" u/ z
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
& j1 [+ m- z; F: Q6 T& ]: ^& P[*,[font=宋体,需要重新 Cmake9 V9 u# F* K5 [8 N7 n9 Q7 G4 A1 S
[*,[font=宋体,编译好代码后打开ZSDome
; l9 S1 r" Q9 n8 y7 A[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
: T/ Y, }- |1 e& m3 I* |[*,[font=宋体,然后直接直接运行即可.
' O' i) w6 W. Z5 t9 a9 _8 x[*,% u2 G U' g3 @1 w: x5 x
[*,对应接口
% `2 r* ^* m: h0 r. e[*,Android
: K3 K; t- Z4 D[*,DemoInit----[font=宋体,初始化引擎
/ `& [# |0 r) c! G/ F[*,Render----[font=宋体,渲染主逻辑
+ f$ [9 C! H4 C, }* i" r[*," ~% x, K0 M' x* J3 N2 ~
[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用! q; Y# H# Z1 ^
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib1 U: W2 q/ F3 N' P: T5 e$ c
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a/ H* w3 @0 x" d3 W% j& b! W
[*,# D. S, j. @% \2 d% E- V( z; V
[*,然后使用:
' o3 R Y4 w8 H2 e[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()3 g; u1 {9 I6 M
[/list, [/td][/tr]! W6 V6 F: Q% }
[/table]
: Q* o+ I$ P1 E+ _" E
& a9 l( \' ? M0 v7 ^ [
7 Y5 H0 ]5 }, M8 v& j/ F |