|
[table=98%,7 o$ K. P7 Q$ M+ I
[tr][td]$ }- r0 R+ Y1 \; T" R
. k a2 q/ b# C5 f+ B ^: q
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
# A9 b* n5 r4 a$ o8 H+ }2 z/ D[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案1 i9 _1 M4 ^1 y/ A9 b( Q9 I
[*,
% x# h( a' f. k; \[*,多点触控:3 |6 Y6 q: `4 g
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
" L; f# @( Y2 V7 b& n4 n+ p9 k' p[*,原理:
: b. o* j6 u Z[*,Int pointCount = event.getPointerCount();
; O: H0 e0 T* L" J" F# s[*,获取当前的点击个数。 E/ ?6 F+ w) ~2 b2 p
[*,ACTION_POINTER_1_DOWN$ W0 C& \; F: S R, _, M
[*,ACTION_POINTER_2_DOWN" i5 g; L4 H E- O
[*,ACTION_POINTER_3_DOWN
$ m1 B- K3 G! p7 ~, r. _! [[*,ACTION_POINTER_1_UP
( a& [1 F& q2 H b3 [' d[*,ACTION_POINTER_2_UP3 i$ _' r9 w1 z
[*,ACTION_POINTER_3_UP
; \: t& j4 L# J# s) E0 e# X$ j, U2 ][*,ACTION_POINTER_1_MOVE
7 |+ c: u6 V5 v4 x6 X; a6 a[*,ACTION_POINTER_2_MOVE
( j A; @9 t6 c- } Z# n& H4 U1 b[*,ACTION_POINTER_3_MOVE: l' U) w& H9 ^" T; W
[*,[font=宋体,获取各个点的事件响应+ U/ G8 r9 x! f% I3 t3 A
[*,
i7 Z! F* _ b; w$ q3 p! E, T[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。9 ` B2 H& o) a
[*,[font=宋体,同理第二点也一样。
6 L$ l) ]+ Y: \( c) `1 V |[*,
7 p- m" j. O% d[*,2:[font=宋体,安卓生命周期- Z5 \8 R9 V. g6 I; F8 h7 Z/ s
[*,[font=宋体,默认的安卓生命周期为点击应用图标2 T0 z% z A* u, \8 _
[*,OnCreat OnStart OnResume0 C# J9 d A8 U
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
, c0 H8 s9 A- {7 L; i[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
6 p. D; o7 o: p$ n1 i; C; ^[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到" Z$ y, t" E0 ] `$ F3 i
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;2 G8 ~8 y q2 W! A
[*,[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,就可以了不要让他走周期流程
7 {9 v- ~7 j. I0 B[*,- N0 \3 R! O" b/ t
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏) w; F/ c! c# O* h$ b7 l+ z ]
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
/ D5 J# `" c7 M0 o+ p4 F[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
4 h1 v( F' G! C, b[*,[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,.
7 Y4 C$ B7 e8 f[*,- `6 N9 E d4 n9 f! p5 ~
[*,[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,具体写法
3 A& N/ {$ h% K9 h[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
( ~( V) s2 l' G8 J" E. W[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,, q2 O8 U3 Z$ N+ m0 {( Z: z
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,, D0 Z( C1 y( H. D s/ [
[*,android:screenOrientation=[i,"landscape"[/i,>& b+ K; v5 W' E I4 x L# l
[*,& |; g. W* \+ z# S
[*,% W; P0 j% n5 k) T
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限! o5 f0 R$ A7 x( Z, J! x2 b( h: A2 S
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类" x; x5 N x4 F( o. D3 M+ G
[*,9 t/ Z& V' l b! \9 u. z
[*,读权限
! T. _# k$ n& M/ Y4 e. U, V[*,
\+ h; [" A4 I0 ~0 T/ f[*,
6 z) X1 J, D' ]( g7 ^ _, A[*,写权限$ s* u |9 a8 c& o4 |: w
[*,
# c9 m9 Y4 h M[*,5 Y9 |7 r4 d$ x' U
[*,电话接收以及监听权限; q! H' D7 e' W
[*,
4 p, O) s" [* ` t& Y[*,6 g3 T3 L0 q/ L) h& y; Q
[*,短信接收以及监听权限
* C i9 b( U5 e7 C0 \) {[*,
- g5 n1 w& x: X1 Z `! P% D[*,
" }9 |* a9 }, l/ x[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页9 N( O5 e0 j/ C5 u' G# d/ \; r* e
[*,5 n: @3 Z+ N+ N, L/ r8 V# P3 q
[*,. x: i% T2 @& Y4 n) r' H
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互 `) S: a1 L9 s( l$ M% O3 h' T0 q1 s. t
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
: I2 E) T. c: d+ K4 O2 H& A. ][*,[font=宋体,所以需要这种方式.+ e U& i6 j1 s4 h. i/ l: w6 {8 B
[*,[font=宋体,在JAVA[font=宋体,中自定一个类+ O; N6 t- x. c+ A
[*,Class MyData" ]$ m3 ~+ j" S/ k& d+ Z
[*,{0 W. R) s/ } a5 W
[*,Public:! u2 Q1 {# I1 l8 d. o1 U
[*,Int a;
( c% C; c1 m6 A0 F[*,Int b;
2 u7 Z5 r1 \" r& u! {; I y[*,Int c;( x# {* b# R# B& c
[*,……..};
' Z8 x7 W, [7 _[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
( {0 ]' ^# D$ i2 `. a2 _# ?2 z[*,public static native void GetData (MyData data);
3 d( `4 I) ]! W, _6 S; f[*,JNI[font=宋体,层中声明
! }) p1 i& C) w2 q% S" |0 l3 H; [8 h, K[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)+ C8 n' y% }% u% P& r
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值7 l8 y. |0 y$ Q' d' j6 x
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");9 H9 f" c7 {! }/ i- K* B
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
* U6 R+ |% z+ I6 E8 G0 U2 M[*,env->SetIntField(m_pdata, “a”, 5);
7 u, L# N3 j. f/ f% ^ N[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.' j1 S; B& n) j7 p/ [
[*,
" x; }2 J$ a) p3 L- G[*,
7 \) B$ A+ L3 ^[*,6:[font=宋体,工程搭建
- G; w# k# G9 B0 }* F[*,[font=宋体,首先编译引擎代码.' q; `' F" P% F7 b# ]
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
5 z" B: v* e% \9 W5 u8 g- J[*,[font=宋体,需要重新 Cmake
% X' q/ c; m! ~7 }! J, F- s[*,[font=宋体,编译好代码后打开ZSDome! W& x# c; o; s$ `8 F
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下$ l H* Y# G+ I) K1 s
[*,[font=宋体,然后直接直接运行即可.
) J7 s% |( c" C2 O/ J1 w7 Z[*,
' V5 ~: N7 |2 e% h; `7 @5 a6 C: y[*,对应接口
0 F) E( \- z( }6 G& P# g3 y[*,Android6 {* I% ?& ]. E' l+ v# ]
[*,DemoInit----[font=宋体,初始化引擎4 r0 Z9 d! v' x& l+ V/ Y
[*,Render----[font=宋体,渲染主逻辑8 y- A. D- g- i+ }+ z4 F
[*,
7 b8 \% h$ J9 c) h[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用6 i6 Q+ r5 a# ^5 f! E
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib8 S1 M7 S8 z* M; `* I. B3 ^
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
. b C m3 }5 q' m1 B7 Y: w: u6 Z[*,5 p7 V* `. y/ f9 p9 d, r
[*,然后使用:
% p! `9 i) ]6 \1 B/ i[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic(); [& v6 X! I$ g5 V3 F# g! @. N M0 O
[/list, [/td][/tr]
* G1 w4 i/ r3 J6 }0 f[/table]
6 a2 ~, @$ O+ {* H- M, R8 N& B+ `2 K1 R: v; O9 a8 X
2 l8 _# i) p. y' p
|