[table=98%,
! V( N/ x/ N, i J0 H. X9 ?- O[tr][td]7 e8 m9 h4 Z: K; X
2 m% m; N, b6 U- j[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,8 n+ ~6 H/ Y- I
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案6 i1 w/ o/ P8 i6 X6 W
[*,
! ]; C- F! i$ [! Y" z[*,多点触控:
' z' `4 L# S# r) \3 G1 L7 y' @) k0 a[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
: T' l6 F9 `" F0 |: w[*,原理:- t/ {, W: I! r6 w- B- [7 q
[*,Int pointCount = event.getPointerCount();
: V* o" W# A1 ?! q[*,获取当前的点击个数。
* ]+ Q' R2 \( D& i[*,ACTION_POINTER_1_DOWN
( i% c# b/ k7 O0 u+ v0 p[*,ACTION_POINTER_2_DOWN
& V$ M) N5 Q% ][*,ACTION_POINTER_3_DOWN
/ z, ~5 L. |, H8 Y[*,ACTION_POINTER_1_UP1 j$ b( p: Y) j X/ c1 H4 E4 f
[*,ACTION_POINTER_2_UP; z7 x6 n! {% I+ ]% _ _7 [
[*,ACTION_POINTER_3_UP- x" P$ Z" T* T3 e" {
[*,ACTION_POINTER_1_MOVE$ m# J2 h" F0 ^4 O0 l# Q
[*,ACTION_POINTER_2_MOVE
% b5 C2 ^% j, K[*,ACTION_POINTER_3_MOVE
$ f' ?" i7 O7 m h' j; a[*,[font=宋体,获取各个点的事件响应 F1 Q* ?, ~! f1 ~0 J
[*,
! m5 w' Y% {/ l3 }* ^1 I[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。+ A8 i, K4 s7 ]) d/ j
[*,[font=宋体,同理第二点也一样。+ s6 b! V9 ]2 V0 x' R+ d5 i; S6 Z
[*,
6 D5 M+ K5 L6 m: V5 P[*,2:[font=宋体,安卓生命周期, u5 u3 j# u) `/ k( s& r+ f! {
[*,[font=宋体,默认的安卓生命周期为点击应用图标- _2 B8 a/ v4 F8 I' `# E m) ?* i
[*,OnCreat OnStart OnResume
) _( z) l# d- D/ c+ p# K& [) {[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory. q# j9 l1 i! ?) X
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
+ Q: P# U% }( o) s[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到) u( w8 h4 \% ]' N, ~% d8 _+ S3 I
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;5 B7 p' s$ x, n; x$ |, d& B% x
[*,[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,就可以了不要让他走周期流程
2 y+ Y6 c; v w+ K[*,
: Z! _# L3 Y) }/ f[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏6 d5 ?2 B2 p/ O/ ~8 S1 G' j
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.5 _2 d$ Q; @8 |
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的. I$ U9 x9 M9 K4 q+ p: n) C2 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,.
4 T5 N5 f) E+ y$ b7 b0 S& D9 b& u[*,5 U% a- d. ?+ v) \8 ]6 H5 } j
[*,[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,具体写法- v& ]9 U% _- t* X7 `5 T# X9 _ }+ J9 i
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
( @$ e/ S+ f2 _& b3 x4 Q[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,, f8 i' _& r" e: k! v
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,5 p; C5 N* K0 |
[*,android:screenOrientation=[i,"landscape"[/i,>
8 l ^# ]9 j/ g& a( a8 V[*,, c9 C" p W: ]
[*,
" e. b; Y" Z$ S2 W[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限, G# k+ u% X& X6 G j$ }9 g$ K
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类
. m* [+ j4 I. a6 |* ?[*,
/ {- P, `0 Q$ H: V, @( R: g[*,读权限
* s0 v: v! G5 t7 S* o[*,
2 k; W+ q$ l5 m[*,& t+ @5 B. y& f1 a$ o! p; A# g+ k
[*,写权限
$ f9 h3 }5 N; H7 T+ a$ p0 F) }, D[*,
% U" x) D* o7 a5 G3 a' H[*,1 }, J. X9 d9 I) X# i: d% Z
[*,电话接收以及监听权限
0 Q0 O% X, J5 g( l! X7 N* ?' G[*,
. k; G) {% N2 y* C: @ s[*,6 T: M0 H: Q1 m$ U, Y7 l: Z) O
[*,短信接收以及监听权限
# e* U7 R! {# V7 d7 f6 y[*,
. J4 z/ Y/ \* L[*,' m* X6 h. K0 J7 @5 z
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页( G, \+ m. t7 j5 C. m4 d& n" F2 ~
[*,
! @* T0 U, ^; z9 b) {5 w7 z% f[*,( d; o, l" U' x. |$ p) c+ p) K! a- v
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
; O# q9 D7 d8 p/ A/ E) D! X[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,. h/ f Y2 [0 A* r% m
[*,[font=宋体,所以需要这种方式.
/ y" Q: p8 _7 u, b[*,[font=宋体,在JAVA[font=宋体,中自定一个类, x' V( ~0 G9 `# m9 A M0 S
[*,Class MyData) S# b% q) P7 L% ]0 p
[*,{
$ J% ]4 D: J- l9 o* A[*,Public:6 t% e# \ j% I5 |! H& v
[*,Int a;) M7 Q' ] E, c9 T+ ^
[*,Int b;
: Z% \6 K: o8 ]7 U" Y[*,Int c;2 L8 B) \( \& _& z; @& Y I
[*,……..};' e4 o$ J9 J4 J% e- X
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
+ e8 F" E# D4 ][*,public static native void GetData (MyData data);
0 l x9 f* B5 d[*,JNI[font=宋体,层中声明
# v) I0 {9 ]' {3 y[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
0 @* x7 \- i) o' k; P[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
. q+ o8 V! b+ B1 P1 M[*,jfieldID sound = env->GetFieldID(cls, "a", "I");6 O* g: K B" T$ J3 j& M$ @+ G
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值8 m. }$ e8 x0 e/ Z
[*,env->SetIntField(m_pdata, “a”, 5);( s3 _. u. ~+ A; k$ q% }3 j3 ]
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.+ H+ d8 D6 i' C" F2 E
[*,
2 Q, E6 Q8 J z% t F[*,
0 s: m/ l( S* w" E9 j[*,6:[font=宋体,工程搭建4 |* Z, u- S. |7 w" W9 N5 y
[*,[font=宋体,首先编译引擎代码.+ a- b- ?8 T k& E. |5 w) y8 v
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.; L& m# B( ^( I& H7 b
[*,[font=宋体,需要重新 Cmake# W/ N' Q/ R( x; \2 N% d
[*,[font=宋体,编译好代码后打开ZSDome
) C. ]4 B4 b* k S9 \- `[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
$ B8 d) u! W$ r! K[*,[font=宋体,然后直接直接运行即可.% R) J0 Q5 q d+ C+ W
[*,# q5 p# k) Y+ Y8 g. w% L
[*,对应接口
- A; n% ] W7 b. W+ P' q" U[*,Android
! [4 g! m7 E2 w( k- Q5 n[*,DemoInit----[font=宋体,初始化引擎
) f9 D/ I! K( K, s+ a6 Q4 E" {[*,Render----[font=宋体,渲染主逻辑& {5 I5 B( i/ _+ N) v/ M; m
[*,. \1 M# y. G' u5 @
[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用4 _1 w( H+ i' }4 F% g& H: ?
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib& s! w* N4 n; l. @( ^
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
! x3 i' k) y' @9 @% W' n4 S[*,4 K7 `# Z/ i; G( u# \& }
[*,然后使用:8 d4 E! _, E& e( S% r2 \4 w
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()
2 Q* b, i; b: ?5 H/ K# I: ?* ][/list, [/td][/tr]; ^: W3 ]3 d' D# L9 B% a
[/table]
" X1 z" R, F$ G- `, \
) j0 P. M# q8 C* A& W w/ u- J! Z% p
|