[table=98%,# `1 T" \! o, Z c
[tr][td]
7 u( t% v/ A1 n" s$ n
- S) B1 }5 E: ~+ O j[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
, C" P h" D6 } b6 C7 r& p4 R[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案2 @) ?) o. I6 `% I( z2 c2 T7 o
[*,
( x! i4 u4 V$ n( J2 U[*,多点触控:3 D1 L! `6 F0 [0 T1 g4 }: N: b
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。3 \/ m9 T' H$ j
[*,原理:
7 A# @1 R# l6 t" Q5 _[*,Int pointCount = event.getPointerCount();
$ B) z7 S# N% ^9 A/ H/ E! D9 g/ H" l[*,获取当前的点击个数。
4 g5 o. E+ J3 P: c, F, o[*,ACTION_POINTER_1_DOWN0 N+ v/ A5 d' S7 s5 S
[*,ACTION_POINTER_2_DOWN" f' g& q' W0 C) @0 W
[*,ACTION_POINTER_3_DOWN" W& s% M5 ~: W2 b
[*,ACTION_POINTER_1_UP- N; h* n* [1 t2 ^ l) g% R$ W
[*,ACTION_POINTER_2_UP
1 x2 @6 O9 k5 P- V/ \7 W[*,ACTION_POINTER_3_UP& R' n: l. K+ X& z: X3 a; n2 B- ^/ T
[*,ACTION_POINTER_1_MOVE
; w6 R7 F$ B' w0 T" n[*,ACTION_POINTER_2_MOVE4 ^/ p$ {8 p- E! {
[*,ACTION_POINTER_3_MOVE
3 V$ a# [0 ~. b$ {8 k[*,[font=宋体,获取各个点的事件响应4 }: u$ ~8 r" `+ X1 x0 v9 b r$ G& Q
[*,
4 l+ A1 Y! `8 l[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
: I. g5 i6 x f[*,[font=宋体,同理第二点也一样。
; [: Q7 T2 T; X# V[*,& i5 u% ~, ~8 J5 J* D
[*,2:[font=宋体,安卓生命周期
( f( y# w$ |2 E( A1 F[*,[font=宋体,默认的安卓生命周期为点击应用图标5 E4 K1 E. D2 N; J, _0 M
[*,OnCreat OnStart OnResume
. A/ H- e) M! L& D. |[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
- l! U" V8 p8 q. C# b( i[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,./ V9 i: l" q$ B5 q0 w
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
, v- N; a1 p2 F9 f[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;2 r1 H( k6 [2 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,就可以了不要让他走周期流程6 x1 l) F" Y% n+ X$ w
[*,
# j- s( T3 `! `3 ]* m8 U- y1 p! n[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏2 G3 m/ _- q0 N. K. c
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
Z9 G4 Z2 _4 `# P8 K& \[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
- l8 D) J$ Q3 y/ ^) F% P[*,[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,./ x6 c" q/ d- {$ D( o8 y5 t' |/ c
[*,
! U5 v# Z0 e( K" A6 W" ?[*,[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,具体写法% ]& B. Y4 H7 E# v3 K- a$ t
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加. f' R$ [( d2 m- |& l9 f
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,
0 J, B8 c% ]+ {, W( U[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,7 x: G* m; v. P8 e6 O" C( O
[*,android:screenOrientation=[i,"landscape"[/i,>
, C0 ^7 [0 [; ^& H[*,
6 N: j3 o, u; f[*,
0 x" A! s7 Q+ J* d% {; l[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限7 R* B7 y) G7 d) ]. q9 K9 [
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类
m8 p( \$ {. Y[*,# b+ i/ _( E& k" L( D4 N
[*,读权限- O2 B. Z" D7 `/ A) h. E
[*,
. a1 i, X+ u) x; F; d# v[*,* T: Y" h* `1 m% r/ ^3 D! _1 ^
[*,写权限: a4 h U/ D* v
[*,* W3 i+ Z& H k/ B7 U) p
[*,
$ x4 F- \8 M! x; Z- t[*,电话接收以及监听权限
) X: B7 [4 A. v+ P[*,
8 ]* _- q$ A0 z# a K[*,
- _ s- h7 `: r[*,短信接收以及监听权限1 N/ G% q0 G4 `3 h- c
[*,5 ?2 q: V4 {: H
[*,+ W8 A' t, h5 R; N5 g: [
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页% ~* h* D/ `" j. l; l
[*,
( P* m4 s3 y- p0 \& a& Z8 D[*,
1 Y }$ X2 o# J) m[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
8 T+ a- _+ b$ G: c2 S6 A[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.7 S& H. ^2 W" j8 X2 V7 u
[*,[font=宋体,所以需要这种方式./ v8 P9 z& O; @5 }& p
[*,[font=宋体,在JAVA[font=宋体,中自定一个类
" n* ~. Y2 _% G# i4 L, z9 m[*,Class MyData% U$ \; w& t1 i6 W5 W
[*,{6 s' r3 v3 ?. l# M
[*,Public:# K z3 h0 K" U4 y( T
[*,Int a;
e9 A7 t* H' x( N/ q[*,Int b;) r5 g, [. w5 k! H& R( F M4 p
[*,Int c;
; v2 x9 |+ Y1 C4 J[*,……..};) A4 q# A I/ C0 F% }5 x
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明5 V# n$ w* s" E
[*,public static native void GetData (MyData data);
9 o# y" y. ^" N# R y7 ~9 {2 q[*,JNI[font=宋体,层中声明
) T7 R V+ g4 L2 |) V[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)& Y) C6 w& r! P* |: C, x3 K- D
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值6 s% a. V8 O+ O# G3 w3 U
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");
3 X) Z; f: O3 p) b( F+ w[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
9 Q' [! S) Q8 k, C7 I[*,env->SetIntField(m_pdata, “a”, 5);
( ?2 f, g+ j k! ~[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,./ K& Q7 r U* f" A# C
[*,. K, l3 y F" K( x: {
[*,
6 ^! Q' T- q t[*,6:[font=宋体,工程搭建
: s) D% b$ x: U% U7 u( Y! k[*,[font=宋体,首先编译引擎代码.
@' L) @, p: n+ q( n: H! s. w[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.# ?$ s! f9 P1 \ V6 S
[*,[font=宋体,需要重新 Cmake
( @2 v W7 d! K2 M' r- |4 M[*,[font=宋体,编译好代码后打开ZSDome6 t# M! r% J- s5 N
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
5 ?* S/ p& R2 n, j* F[*,[font=宋体,然后直接直接运行即可.
- N, Y( y; @4 S2 }+ Q" S: V. I[*,
! w' a W; h# U1 w1 z[*,对应接口* Z, X" a: j% S0 U W1 E' G
[*,Android
- V) U. a }# D5 g4 a[*,DemoInit----[font=宋体,初始化引擎8 J5 M; D3 E3 g, U( S6 m! e/ o/ W# ]+ A7 ~
[*,Render----[font=宋体,渲染主逻辑: h! M+ _: d( f' V1 \ j0 O$ a
[*,3 \4 p3 }: A" c) i' L3 a3 Z& V) D
[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
N( d/ f3 s+ [$ [% e+ l" `[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib' f$ A9 r: j' H6 k! W
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a) N: ?( b4 L; t9 }/ J+ z
[*,
4 p. a8 f8 F. A8 ^& S[*,然后使用:$ _. F1 q; u% Y1 D0 S
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()
: `; f# Y6 f5 m! B[/list, [/td][/tr]
5 F) `4 P. b: z$ w[/table]
' z& [" f! `2 E7 L$ ^. a
7 U8 q( U6 d( f8 h
: j1 s/ C% v4 K1 _! y |