|
[table=98%,3 T0 k$ o7 C* P) c t
[tr][td]+ i: {. F& r& u* `
1 K9 l' i; s) l, Z3 z& W e' V
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
4 {+ [/ A* W3 R: w[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案, K# ?1 h+ ^9 }
[*,: J9 g! b8 Z. m9 B6 S
[*,多点触控:% ?, d# Z5 v3 A
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。! q" }' \& n! w8 H8 ?* @
[*,原理:
# i9 l& e3 z9 T* |3 {3 y$ ^+ m[*,Int pointCount = event.getPointerCount();
X2 C: s' m3 Y. f% o, q6 J, B[*,获取当前的点击个数。+ A$ b( {0 Z& U& a6 X; x( b4 U
[*,ACTION_POINTER_1_DOWN- M; Q& `, d# q, ^
[*,ACTION_POINTER_2_DOWN( u, G: H: _- m: W% g
[*,ACTION_POINTER_3_DOWN
# v5 Q: j0 V2 I* B2 Y& y W[*,ACTION_POINTER_1_UP
! i1 I' \+ q- T+ ?! U[*,ACTION_POINTER_2_UP
" _5 _/ i+ }' L/ a[*,ACTION_POINTER_3_UP
' w& W8 O1 y' I9 ]+ N[*,ACTION_POINTER_1_MOVE
+ S1 l R( \0 r* v2 X( c" w: _* X[*,ACTION_POINTER_2_MOVE
, s7 c% y; z, ]- S+ ?; A[*,ACTION_POINTER_3_MOVE! h2 d3 i9 X" u$ \$ l4 U' A
[*,[font=宋体,获取各个点的事件响应% j0 D: C Y& s1 K
[*,
/ O! J+ h" L) c; m* A& z[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
; d9 W; d% k/ a' x, b: X[*,[font=宋体,同理第二点也一样。" H5 i9 l/ D% j' X/ o$ a
[*,
# _, X9 R" Z; X5 s1 l) h4 Q. U[*,2:[font=宋体,安卓生命周期
% ^5 W* e" ?8 W4 ?. H6 N3 s2 R[*,[font=宋体,默认的安卓生命周期为点击应用图标
9 c2 x+ j6 H0 ?9 p9 [3 ~% V: L[*,OnCreat OnStart OnResume6 N! W. ^% d) H1 C# I1 @6 k) [
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
1 L/ `; M; E8 d/ L[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
, z }4 L& w+ q8 ][*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到, e+ |7 h" G$ P: A' g: T
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
. `6 ]( x% n6 t4 ~; }[*,[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,就可以了不要让他走周期流程, J* J6 Z6 x N/ z& q# }3 k5 J& q
[*,+ L4 n/ g0 y) c3 S- W/ a
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏: A5 T) S6 W" o
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.4 j! [7 @. ^5 G5 ^( F' I% b
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
8 ~. d. o9 b. O0 j6 o[*,[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,.2 ~( K0 |& A# Z" |/ m2 O
[*,) f+ D: {2 V2 I: K! f% s* u3 W3 z7 m
[*,[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,具体写法
) I" v8 F4 p) A6 O[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加; D! |9 [2 ?( d
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,% b: B; l5 w& E, L) f
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
) s8 O+ D; Z5 T9 S[*,android:screenOrientation=[i,"landscape"[/i,>/ x4 Y3 P/ F+ f5 _
[*,
1 w! z2 x1 t; D3 k8 P V" L4 p- F; n[*,, s8 R/ u/ K" t. ~( ^
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
2 p7 ~6 N5 |- E[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类
! l5 L2 P! K& c9 A/ K9 v ^/ Y Z: b[*,
& F. t$ J! @# \2 }0 y1 [[*,读权限
0 X, i4 a" G R# M[*,. H$ _* o6 {8 r# [8 _# T+ O
[*,: ^ e1 d3 [% k7 W9 a+ w2 H
[*,写权限3 _& K5 t V- z( D8 K
[*,
9 n; |" v" `' ]- x$ y: z7 h[*,2 V! H/ L- L' g- d( x8 [& ^
[*,电话接收以及监听权限! Q; g, [ S: L
[*,
5 e$ ]$ q3 T1 @) U2 u[*,* s8 Z& l" ^5 T; W9 k- p# v
[*,短信接收以及监听权限) ]$ E: M" t: M
[*,
! T* p4 ?$ v! C, F( i F[*," D6 Y8 O. q/ v7 K$ ^
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
) p/ h- E3 T8 X* I5 _[*,! O6 c4 [# {9 P/ E, j2 s
[*,& Y, h6 [3 j5 V8 K1 u9 Z
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
" n) @% y7 a* J) `' T" R[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.. P( T9 f, v7 H* Y! i5 G
[*,[font=宋体,所以需要这种方式.
# H% V0 _" a0 i8 [. o9 L8 m5 J[*,[font=宋体,在JAVA[font=宋体,中自定一个类
7 ^6 s& I8 S* k' u[*,Class MyData9 F1 a! k& w( K* F ^" \7 @
[*,{. }% X# a0 B/ {3 n1 T. t% A
[*,Public: t9 W3 P- I) `
[*,Int a;- k0 z" D* U, T
[*,Int b;, @3 K- ` q( ^/ V' V0 p
[*,Int c;8 }: w' j7 j: R& g5 w
[*,……..};5 {9 }+ v C: y
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
" o' b w, V! s! p( X; E7 C. J[*,public static native void GetData (MyData data);% Q- j8 A. q2 p' E" P
[*,JNI[font=宋体,层中声明! a6 W* e# N+ |! U
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)) ]! A* ~0 a( h
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
" P* Z" o7 M P1 u7 p- o[*,jfieldID sound = env->GetFieldID(cls, "a", "I");$ z" X: k* y, Q/ v# r0 W- j [1 p
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值5 Z' d& M# J4 l; L
[*,env->SetIntField(m_pdata, “a”, 5);( ^9 e8 m m1 |/ c% {3 V" }
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.# P9 E- r% E2 s# L
[*,
: b$ d/ T* L% M5 M9 Q[*,1 q& ~& C9 d' l b' `7 e' l7 L" q
[*,6:[font=宋体,工程搭建
( T; F( a! B4 z: N[*,[font=宋体,首先编译引擎代码.) }- \* h5 ]( q
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
3 T8 }2 F, b1 z3 t4 ]5 A# Q& |[*,[font=宋体,需要重新 Cmake
# u5 w4 H8 V# ]. a+ a; x) \[*,[font=宋体,编译好代码后打开ZSDome
D7 V% b. L j! ~[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下) m; }) l+ ?8 n3 L+ N" h
[*,[font=宋体,然后直接直接运行即可.9 b2 u1 j) A- a1 T* j2 ^& ?* u' H( }
[*, G! n: @0 S# _; {' |7 l Q Y
[*,对应接口
, ]2 `9 F. k0 \4 G8 }. I" {[*,Android
3 N8 M% O9 {0 o[*,DemoInit----[font=宋体,初始化引擎
1 Z# H# A1 T, A; K! j k[*,Render----[font=宋体,渲染主逻辑
3 j' j7 e8 i1 r8 |# n6 s[*,
# N) |3 v7 ?8 J p[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
1 t, f# x# v6 v5 [/ g3 R[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib- F* D/ p; Q1 [6 h1 h
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a: t5 b: ]7 f+ R9 F' v' U. q
[*,: f# l C" M& ]1 u$ }* O
[*,然后使用:
! M: l/ q8 J0 k% K5 [; p[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()0 U9 t# ^8 R% v7 C6 L% n6 _2 a
[/list, [/td][/tr]
1 ?+ f9 d' \2 o) z3 A[/table]4 u ?* t% t1 v# T
/ @* m$ f& {7 G
Y7 J0 I$ k! O
|