|
[table=98%,- H0 S q+ R4 r
[tr][td]
* Y( ^- C; m! C( o C; M
4 f6 o4 |; b5 q/ l, B2 y[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,6 ?6 C* \; ~0 ^- i k6 T
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案! \' v$ s$ x# T# N
[*,
6 ] ~; o$ ?0 i w1 ^2 l2 R[*,多点触控:$ k0 L* ~0 D3 |
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
- Z7 @6 U# f2 ~ H4 e[*,原理:
G) p( K9 k9 a[*,Int pointCount = event.getPointerCount();8 E, u" H& \2 v1 N; n" {
[*,获取当前的点击个数。, H2 `8 p, ~5 |" `- l8 H2 T9 f- _
[*,ACTION_POINTER_1_DOWN
' Z9 X6 W5 Y: f) S[*,ACTION_POINTER_2_DOWN
. d }7 k- G; X( O4 J/ v[*,ACTION_POINTER_3_DOWN! L! U# m: `+ N. `3 m0 v
[*,ACTION_POINTER_1_UP
! F- ~6 i' p. Y/ P6 r) a* Y[*,ACTION_POINTER_2_UP
: K( K" U6 W) U E3 S# z4 m[*,ACTION_POINTER_3_UP! k- `; |& M m- C2 `
[*,ACTION_POINTER_1_MOVE- \3 C9 P. y- D& p+ c
[*,ACTION_POINTER_2_MOVE3 F* [, ~$ m' @6 A
[*,ACTION_POINTER_3_MOVE8 i9 ~0 m7 I F. ~
[*,[font=宋体,获取各个点的事件响应1 z; ~$ a' s* [$ C
[*,. L' K0 D* m# t) U' V3 j; r
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。6 {/ F4 q: K( M
[*,[font=宋体,同理第二点也一样。
) o: o$ o: N, V( O2 }' X[*,
: {! N/ X( c: ]$ Z0 I" m9 m* z[*,2:[font=宋体,安卓生命周期
. T$ x' d4 p6 s[*,[font=宋体,默认的安卓生命周期为点击应用图标6 z- [; v% u8 M3 C; }
[*,OnCreat OnStart OnResume
" g+ A9 ]8 _. C% z; z7 A4 I8 T* S G[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
2 G5 B- Q2 n+ u) d( A[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.7 y) B: M, F; e K8 \" J- M Z8 e: R
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到, D) [) u( o0 A, p! i1 f
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
# X2 M: I2 Q) W8 g4 g I[*,[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,就可以了不要让他走周期流程
{0 e1 F3 e" f" o+ K B g[*,- e4 u7 o# m# t& f; j- D
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏- F0 V" s# n1 k" m, ?* w9 H% G
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
0 L, \: x; Y( B8 e8 v/ j[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.0 j3 k# e7 C0 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,.; [$ Z! \: @1 z
[*,7 k i, ?3 q% T. B9 l
[*,[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,具体写法
' Z l7 K' L( l+ c/ B[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
) M6 y1 U8 b1 q( S8 B7 F[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,. Y7 Y! D, {" C0 @$ Z5 n# y
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
* }' [$ X# t4 D+ M% Q3 j- F( n[*,android:screenOrientation=[i,"landscape"[/i,>' F" E9 }( I/ i3 k
[*,5 H+ H: z1 G6 K1 S
[*,
9 D& V( t% o) `) K3 I/ a[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
0 x3 v+ {( j% |% [' |+ ?[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类& z2 S+ w% k# v0 y7 l6 L& A
[*,' r+ e2 O7 N6 {" S( K% X8 y9 Y( F
[*,读权限
. C5 V0 c5 R* I[*,% x+ S1 t0 m" E1 d
[*,
9 C; ?5 ]) y& A; G! ?* w R- o[*,写权限7 ^3 v6 X0 Y ~; h9 l! S
[*,1 L9 M; r/ @: G3 p3 T$ ^% L
[*,
' ~. Y- m: N" q' r& y[*,电话接收以及监听权限
: F+ O3 V3 S1 q& A# r[*,! L5 C& D% ^1 {7 {: D' g5 @
[*,
5 M1 E4 g8 V1 |( p0 c[*,短信接收以及监听权限
# U! I* W* W \9 j* [3 u3 E1 \) t[*,0 Y, J/ r/ X# ~& K, \5 ?2 q7 N
[*,4 @9 }6 w: @7 u2 K3 M3 |
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
1 n: @3 _* _/ m5 q$ l7 P[*,
7 M4 O" p2 X3 P, F5 x: u# |6 O; t[*,6 }) F& }1 B4 p4 _& k6 \7 i
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互0 j3 P# b! e n: {
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
* _0 S! u3 z2 j& @- o[*,[font=宋体,所以需要这种方式.$ x; C" Z. _1 C2 v" D# k
[*,[font=宋体,在JAVA[font=宋体,中自定一个类% R% ?! N ` a* x! M, u
[*,Class MyData. _# V$ Q: z" i( Q( Y. c$ W) E; G# C
[*,{2 C4 M, \8 Y% G W* ~. T( J/ R) |
[*,Public:2 c: x; A& I# p' `+ W$ A8 H' ~
[*,Int a;
& s; M s# Y- u" r: \: S! T[*,Int b;4 ^- R4 M K' d" W
[*,Int c;( U9 O/ B5 ~. O5 K3 d) ]
[*,……..};( d3 y1 i+ R4 A0 _ I) [% F& r4 L
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明$ d2 I$ X# s! f+ u
[*,public static native void GetData (MyData data);
& g3 ]( Q, }3 W[*,JNI[font=宋体,层中声明
5 d2 D: {% s5 L# C( b[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
! t$ f! |- s# l! @& c5 p[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值: n! S3 V N0 \2 I
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");
6 C# g# x3 |: u: c. F[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
* O6 M; \& B* t2 }[*,env->SetIntField(m_pdata, “a”, 5);
! |8 J* B7 u+ |5 N+ K[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
& x6 e8 M0 T1 T% F3 [[*,: r6 f G7 y$ ]' R
[*,2 U5 z7 [. t# Z. f
[*,6:[font=宋体,工程搭建
7 t3 o, Y% B$ @5 ]# f[*,[font=宋体,首先编译引擎代码.& F2 Q9 @; V. o9 e0 ]9 f Q
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
+ m' f( Y0 Q& @! D" U. I; V7 D[*,[font=宋体,需要重新 Cmake
& E. X: {# P$ N+ Q[*,[font=宋体,编译好代码后打开ZSDome4 d6 x4 i9 N8 C1 X3 Y2 B- p
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
. \+ w) d) k w1 |, R[*,[font=宋体,然后直接直接运行即可.( K" n7 Y' t1 S$ ~* A) \: d8 i
[*,) S9 g6 z/ }* w4 t! S% D8 G1 o5 @, \
[*,对应接口* B+ r+ ` j0 F% ^1 O
[*,Android
3 V5 b+ e/ z1 S+ B0 C4 X+ }( H[*,DemoInit----[font=宋体,初始化引擎
: l9 p0 c8 D" ~( o4 [5 ?3 O8 T[*,Render----[font=宋体,渲染主逻辑
; B0 f; p$ |/ H* d[*,
F+ m5 W' v4 a H[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
1 B" `! b% x3 x) X[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
7 P% Q5 A4 {; X' O) T' I% P1 i[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a0 W' G! G9 W; h) k+ i6 l! u1 n* R
[*," g0 W7 L& A5 P6 V. C" m" z: G9 A% Y
[*,然后使用:7 D* T3 R, W. ?" ~4 r1 \9 s" e! E( ]7 N
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()7 N9 V8 R- A7 Z8 X5 B( S! Z" G$ {
[/list, [/td][/tr]
+ N4 y# i4 }4 v( |! c; Q[/table]
# k4 N) u+ J( t* i8 R3 Q- b& Q) m2 O; e- ^' G c2 s# R# e4 r
/ u6 G0 G- C# e* n+ P; E; d |