[table=98%,
# ]! j f8 F5 ~- U) M2 X[tr][td]
4 L, s; o' d) ]3 T* v$ ^1 y# T4 }; D/ ~; v; a: d' p
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
U/ a) X) V% H7 {' q[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
+ J1 D2 Q3 h9 k0 B- X6 a& C! g[*,
+ o/ G! l" E9 s" D8 f% Q[*,多点触控:
" w/ a; N; t! {" ^4 P[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
. m" h* X9 G# O( v- f' o[*,原理:
! D5 [5 F+ y5 E' N9 B, `+ B" ?! T[*,Int pointCount = event.getPointerCount();
/ O7 A* |3 L5 o1 b5 Y[*,获取当前的点击个数。
; d2 t( _/ o1 c/ Y+ ]7 X[*,ACTION_POINTER_1_DOWN: o5 m; S+ j& A
[*,ACTION_POINTER_2_DOWN2 E3 W$ n$ E( i- V7 m) `+ r
[*,ACTION_POINTER_3_DOWN: \5 g: t& W& g5 V
[*,ACTION_POINTER_1_UP7 n% A% f7 t" Z7 l8 ~
[*,ACTION_POINTER_2_UP
/ [ d! p3 c+ N; d4 E, ?: ?$ o[*,ACTION_POINTER_3_UP
) w7 E5 N0 \2 o: {[*,ACTION_POINTER_1_MOVE
; l8 k9 @+ V2 k) d[*,ACTION_POINTER_2_MOVE: k$ {5 Q4 n" X# U
[*,ACTION_POINTER_3_MOVE
1 W$ x6 }- X2 P$ y[*,[font=宋体,获取各个点的事件响应5 S$ b) U9 W' `3 \8 C- j5 o
[*,. }2 A$ a U- Z3 Z, T
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。' h+ ^# p8 d, w6 j
[*,[font=宋体,同理第二点也一样。
X# J9 a0 h' z3 L5 s[*,
3 M' m7 V$ R, m& {9 O[*,2:[font=宋体,安卓生命周期- A) K9 `& [* j7 l- O; j4 Q
[*,[font=宋体,默认的安卓生命周期为点击应用图标
% C+ t2 Y" T0 E! D[*,OnCreat OnStart OnResume' J& u2 w: I, b4 T, ?& f! N
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory' l+ f- n2 }! Q" L% y ~& `
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.: b% U% d/ Y0 N- S- ~. ^
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到( R3 l! `" A" Q& X" O
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
/ q" k8 p' C$ z' E) @5 \. a* L8 H[*,[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,就可以了不要让他走周期流程
. l ^; U4 c* s: O# a[*,
, p8 r1 t, ?& n: W" u0 e. j g4 u[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏% @6 w2 B+ l) E9 u# y" b# K
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.2 Q* z" o3 i$ Q1 { w0 _( m
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.2 b. U$ n3 f4 y# T
[*,[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,.
1 N- v6 x7 Y( |7 A) S: D" d[*,
+ |% q3 y3 H' z# r[*,[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 U3 u% r6 L2 s
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
( k% A. B$ F* t; y5 w9 x[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,
0 [6 x; @( z. @& |" s" }4 Y[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
: ?: P, u0 H. ~[*,android:screenOrientation=[i,"landscape"[/i,>
- [. ]) F( L% s+ I. n. P[*,
1 q8 g+ r0 L! X. L[*,: N2 K( D' ]1 O, y# B( m
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
, Z) }6 c$ |: E. d[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类- r! M; ~% P+ f/ o) \, ~
[*,
2 X1 j3 E- z/ t5 t* ?8 F& A[*,读权限 T& C9 a* n: d9 d& L( l
[*,
P. s. q# F, f7 E; R' G[*,- b- D; N. Y5 w$ h- @' c
[*,写权限' S/ U+ t- ]6 J% _/ v
[*,6 v- l d+ q5 n6 ]# S
[*, ]. n9 i5 z) U! N8 R! m& I
[*,电话接收以及监听权限1 D4 \; u8 J" U8 L' j, t4 a# y: l
[*,- J; k+ ]5 Y/ t& T% M
[*,
* A+ Z# W+ [+ H+ L8 T& w6 @[*,短信接收以及监听权限$ c* y' g* w- V1 p! F+ `" _9 q
[*," K$ s) r2 a" z5 ?$ a# v
[*,
2 j! D/ T- |7 w4 t" r% a7 k4 g5 _[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页6 E: ?& h9 ^5 O% u
[*,0 A8 @! d) {2 g7 Y7 G! L& f: z
[*,% L& d$ w) z2 ]' [+ `" W
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互& j4 Z7 L- O! Q" @
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
# M, z. }$ j+ S; _' \6 o5 g& z[*,[font=宋体,所以需要这种方式.
2 `, v, v+ c6 S[*,[font=宋体,在JAVA[font=宋体,中自定一个类" l1 g" v6 S; K1 a
[*,Class MyData/ D8 T s" \2 M4 ~4 B, k
[*,{
8 O% E6 z0 n# t3 y: @& S[*,Public:0 |/ c# M8 [! k6 A' M
[*,Int a;
- E; W# @% S8 I/ F[*,Int b;
5 F; z' E7 [' O- d+ {: u% O- n1 l# [' H[*,Int c;+ d/ b& X. r( c# c) b& \' `
[*,……..};
" t5 C- S3 O, e2 z( g5 R[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明3 B$ v \& x% |6 A# F1 v
[*,public static native void GetData (MyData data);' u' f. |* e! q
[*,JNI[font=宋体,层中声明
$ E' d1 ~& g x6 F' F/ Q[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)) f% c4 x. S* I
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
& n$ W+ d1 Y6 w[*,jfieldID sound = env->GetFieldID(cls, "a", "I");& d, R& q' w1 i$ b2 o: l5 ?7 p7 }
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
& K8 }$ v0 Y: `( |3 j[*,env->SetIntField(m_pdata, “a”, 5);
' Z V ^, x4 O7 B# R7 Q1 }# s[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
- w6 n8 F( W* d- |7 s8 _5 R[*,: ?5 r* I- A \
[*," b2 R T8 [& J3 M/ T
[*,6:[font=宋体,工程搭建
0 y e5 ~ @0 b& e5 S[*,[font=宋体,首先编译引擎代码.' u+ w7 C# K* i& x; p$ q8 Q
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.1 D H: v; i! d, P& d- i
[*,[font=宋体,需要重新 Cmake" e9 }5 b* ~, r9 t9 G- n/ r
[*,[font=宋体,编译好代码后打开ZSDome5 Y& @' d3 l' b
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下$ R0 j4 M9 T8 n; _5 i% N
[*,[font=宋体,然后直接直接运行即可." y6 b" i% r' j) o5 P6 C: F
[*,1 O% |9 O1 h- c: {3 ]- P$ ~ k
[*,对应接口
, [; M# ~% _0 L& q9 A1 L[*,Android
, a& `4 [% k5 Y. J& c) w; {( r[*,DemoInit----[font=宋体,初始化引擎
) K n( ?% R: a, }+ E c; o. n[*,Render----[font=宋体,渲染主逻辑
9 A. S0 ?/ t( Y' K% ? Z5 y% H[*,
1 B/ t2 F: t+ u7 [2 y! Z' \[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
9 E+ o/ M# H( P K[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
2 |, F2 o$ s$ z3 U+ l9 ?[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a1 z" \ ^& I# @/ j0 ^2 L6 y
[*,
- j! s2 }4 a3 Q[*,然后使用:6 q( g4 ~+ d* k" j+ z% @" b; Y ~4 ]
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()
% U) D) I+ S% A" w6 L) V8 W& K[/list, [/td][/tr]
p \3 C9 h$ t4 ~0 {[/table]
( [& Z, L/ w9 I1 W l) _8 `9 U4 [& ]: L1 u/ b/ [ _/ i; q/ ^
4 ^/ x! E' C2 b2 ]9 ` |