|
[table=98%,9 [- i% Z1 d! }5 D% m6 w
[tr][td]0 {; M# b% B( N' x" O/ r
8 L8 W# @7 a' n7 E8 f. ]
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
: A( A* p0 ] [+ N8 ~# G( m[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
" K( k! }6 I, e8 l, s, I) u! u[*,
5 V9 }" Y, R% t% B/ Y[*,多点触控:& w# K6 k) W6 v4 H8 k( h. Z( G
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。& U1 B' ?( j8 i0 \: y& C) u- O
[*,原理:
9 {3 U1 N, G4 {6 p) A. m[*,Int pointCount = event.getPointerCount();# S! _' m) h" \' p3 O
[*,获取当前的点击个数。, V$ m5 U& c- t0 u( i2 G$ r
[*,ACTION_POINTER_1_DOWN
& p- E9 W# G6 ?[*,ACTION_POINTER_2_DOWN9 |' K' r A* @4 A5 B+ T
[*,ACTION_POINTER_3_DOWN
' j+ \3 M9 F5 p% f3 U* a[*,ACTION_POINTER_1_UP
$ @/ i/ _/ `* d9 r[*,ACTION_POINTER_2_UP; T, S+ D; R5 O8 b- v6 D7 `: D
[*,ACTION_POINTER_3_UP* z9 ~% X7 V+ a) u
[*,ACTION_POINTER_1_MOVE
' }& N0 n4 z9 {4 k/ ?) H: m[*,ACTION_POINTER_2_MOVE
% J! C% W# ?; ?- {2 p[*,ACTION_POINTER_3_MOVE2 d9 k# p4 ^8 [5 ~8 `& ?, V
[*,[font=宋体,获取各个点的事件响应
! i; W2 T% E$ E[*,
+ x5 K7 k: A) f, T* p8 W[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。3 {+ h8 ^5 Z3 m1 D& E2 g I
[*,[font=宋体,同理第二点也一样。
6 M- @0 q' {7 U9 N M[*," \" u3 Y$ M5 b, e
[*,2:[font=宋体,安卓生命周期
$ K, F9 r0 ~- Q2 ?( J. |1 Z[*,[font=宋体,默认的安卓生命周期为点击应用图标. ]% \: f' \$ b
[*,OnCreat OnStart OnResume Q! P; \0 ?1 ~# c+ N" D
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory7 N% s1 j/ P% _
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.2 p$ }# `, T5 ^" w1 |* Q3 M7 |
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
4 K; H- J6 S+ e- _[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
4 f+ H ^) k7 ~6 w7 Y[*,[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,就可以了不要让他走周期流程
1 l/ c4 B+ C9 ~3 R1 o$ g( I[*,
6 @3 B- @+ z+ S+ t' E+ o! u[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏3 [1 q( K) e3 R5 }/ ]
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.9 v J. c' f) t) f" ^& o5 E
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的." }' j- g* X5 G) F% U8 W
[*,[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,.) s! w- Z4 `# j+ [8 K3 o
[*,
, G, a% |) y" U[*,[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,具体写法1 E; u" g* n% v3 E1 O7 q
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加9 |$ a, K( \; X/ s: v' L5 R# ?
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,# A( n' U7 q5 O5 x
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
- F! k. _0 h& ^) ~ K: w/ {[*,android:screenOrientation=[i,"landscape"[/i,>
7 J5 ?, p5 u$ T; ?# G* ]$ C! p[*,
* |" f; T6 X5 U9 e7 Q[*,
, z2 {3 }# E8 ?) I+ B7 Z5 K- G[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
) a' c7 c/ e9 x# q7 j. S[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类1 @2 C4 G/ m# B$ o# {3 F; E( g0 E
[*,
" T/ N1 y! g) t$ u, w9 Q[*,读权限& f# X: F+ s# A0 V6 r0 k
[*,. q/ Z% W$ E( x. u* Z/ t; ^
[*, K3 X& p; U- {2 C/ h& o& X* }- X
[*,写权限
5 A7 t X% l: y[*,
# C( x& Y) @0 E$ |6 M( _- K[*,
1 o* L' E( q8 L. Z5 N[*,电话接收以及监听权限
% I# j1 K( ^+ x! I, s \[*,
0 L b! \. ^ H! p) R* I' T[*,: _; W1 I8 \2 a/ U$ g
[*,短信接收以及监听权限2 X0 x3 u* h9 V4 x- T i- {. a* a
[*,/ r, W6 n: G% y' g, H8 t
[*,
% P4 x5 h3 x4 ?* V# E& t[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
0 i8 K, @' H7 C( G9 d[*,
$ d4 N, e8 L% m; z$ Y+ \[*,
! C5 B1 d: ?, W[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
8 a, K6 x- W' _; B' a7 ^. s! d+ |[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.0 }2 L* d- b6 N; o& v/ A
[*,[font=宋体,所以需要这种方式.
* x1 O" |3 v1 N+ p) N8 p+ w[*,[font=宋体,在JAVA[font=宋体,中自定一个类6 i+ y8 n/ Q" L. [" F: m0 H
[*,Class MyData
1 {3 l- @8 y( Q6 X& m: k[*,{
4 \' @6 L3 K9 X[*,Public:1 p( k% q' H' `5 e) n
[*,Int a;
8 D. o1 ?* U8 Q[*,Int b;; Z1 Q) a8 A; d! f
[*,Int c;
! d0 c/ z5 P- X5 w( K[*,……..};
2 R* N" n% e7 z) r6 i* C5 f[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
, ~2 z: l6 Y. [9 h, c2 p* g- ^% y[*,public static native void GetData (MyData data);
8 t/ t$ W. i" C4 z J! m[*,JNI[font=宋体,层中声明8 R6 A! h. O: u- r+ k
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)" B: |6 D6 a2 F+ [: ^9 c
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值. a* ~* Q, t Z7 D6 d
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");
& w: c9 w8 g+ ~0 a$ Y% l[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值9 ]8 \% x, f9 x4 [' ~/ F6 z# O
[*,env->SetIntField(m_pdata, “a”, 5);0 ~, f% `5 U! u6 ^7 z. o+ m9 A( A' c
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
7 A, S: ]5 S, p. H% y$ A3 s: f[*," ^6 d& M1 o3 G. d# R" t, e- O
[*,% e, f/ \. B, H9 G8 E* R4 d n7 Z
[*,6:[font=宋体,工程搭建
* J0 P4 d2 N& ]' S! W0 z5 n+ O[*,[font=宋体,首先编译引擎代码.
x+ @* Q3 z/ X1 I6 r6 L, e% c% h[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.# D8 C3 r& W. S0 V! n; d
[*,[font=宋体,需要重新 Cmake
) O {' ]" ^* `( }7 K[*,[font=宋体,编译好代码后打开ZSDome
. W2 t, q+ b# H. v[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
9 h1 F0 h K( Y! n' c[*,[font=宋体,然后直接直接运行即可., ~! K5 T5 U7 X3 ]
[*,/ s* c1 `! ^- ^9 l0 c3 Z
[*,对应接口
4 x+ W" f# C U+ n. p2 A! E[*,Android4 M, X& L# I( t; s2 B- p- O( Y
[*,DemoInit----[font=宋体,初始化引擎* c% B1 z2 l2 B m( Z( t
[*,Render----[font=宋体,渲染主逻辑
; q- p6 s. Z5 Z6 B0 }9 |# `[*,
( z+ A5 @6 ]! j/ c) {1 c, {0 h[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用
0 F. c2 Y' [& s. Q[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib& C3 M* E8 D8 n4 j3 Y, g
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a( K _. v& `" g% [; ?3 W
[*,
4 S0 E( Q1 s/ H C# `[*,然后使用:
7 O+ I( K% g! r; e[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()" ~0 \4 b1 C5 \" q5 I6 o
[/list, [/td][/tr] I5 y4 M& r# W U$ o# N- ?) }* `% n
[/table]# T. E, Y, e$ j3 R) v) A
- b+ N0 q6 j% w3 |. Q& Y7 D5 i
|