|
[table=98%,
& e; ]( L0 V1 y: J3 R0 b) i& H[tr][td]* K3 ~3 q' {0 S8 y' {1 r
! V3 n) g- f$ \4 R' T1 _[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,9 ]( I+ m$ d' i; o
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
, \/ @! T% \5 Y4 N7 h# G[*,) _) y, r0 P# {! ^- ~7 _" T3 B
[*,多点触控:
1 I! _# l( ^2 S4 w" K[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。1 ?7 T- R/ l& l. \
[*,原理:+ }6 g- A& l) |( N
[*,Int pointCount = event.getPointerCount();5 \4 O6 _5 R: S
[*,获取当前的点击个数。% [- B4 ~) X; ~6 P3 d
[*,ACTION_POINTER_1_DOWN
7 q3 q$ L6 F B! T0 y[*,ACTION_POINTER_2_DOWN, q6 h. E; b0 ^# g+ V0 t
[*,ACTION_POINTER_3_DOWN
$ G7 l1 J1 A+ \$ d: V. j1 V4 {[*,ACTION_POINTER_1_UP
$ L3 C. c6 g4 r8 V; I[*,ACTION_POINTER_2_UP
) A5 e2 }# o% X9 `# B! Y% E[*,ACTION_POINTER_3_UP
Y6 \6 J3 B. r[*,ACTION_POINTER_1_MOVE8 }5 X# M4 |! M) W8 a& V7 n
[*,ACTION_POINTER_2_MOVE3 \5 H7 g* D5 ]+ I+ T
[*,ACTION_POINTER_3_MOVE
/ q4 o$ t9 F& M+ C3 c2 x[*,[font=宋体,获取各个点的事件响应
0 ~# T8 f- n# v7 [; L[*,( [2 `& M* t+ w, |
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
0 ? B: Y( q2 m$ S8 B6 h1 T/ }/ j[*,[font=宋体,同理第二点也一样。- W7 j+ A' P9 J! d
[*,
, z# R$ Y$ q. X# X! v1 u1 y% Z0 d[*,2:[font=宋体,安卓生命周期
$ a/ `, J+ y' p" g: y, i6 o0 R[*,[font=宋体,默认的安卓生命周期为点击应用图标
4 z& {2 e) Y: h# I[*,OnCreat OnStart OnResume9 T" V4 M& O: m8 d
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
; Y9 U- I; D6 _' u[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.8 G- ~+ X8 d- q! v
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
. y4 B0 _; u3 E! L$ O9 P: N[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
+ c3 L( D- w8 _5 K) G[*,[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,就可以了不要让他走周期流程, Q2 }: Z5 }2 V% t( R' f
[*,
R4 _" c$ A" c0 |6 ^9 @[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏7 u* _1 I' Y3 Q) M6 E9 }
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的./ {( ]: W! k7 d
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.1 L; k/ y; C) e2 d* {( g7 v( W, R: J
[*,[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,.6 S5 M* O1 _+ m9 P
[*,6 h) V' a x- o$ c! ~0 }2 {% Z3 ^, Q
[*,[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,具体写法
& Q+ b9 `" |8 C1 Z) q6 A; C/ r[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加1 f$ `: f$ u8 V3 O/ R: x
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,9 S! K2 s5 T% Q! F7 B% l' W
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
% U6 F" ?7 e5 M[*,android:screenOrientation=[i,"landscape"[/i,>
3 T# S$ K: t E2 E0 y, Y0 k[*,. p: y( K% o& L$ Z
[*,; ]* C" r- f1 F% X- Y: J( f/ t
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
4 D( B6 }; [/ V. z F[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类
2 R& M% S7 |0 s" F) x8 G[*,% E8 J4 W' V. }; \3 S
[*,读权限
1 N3 E: Z7 M3 z) H[*,- z: J3 w0 `! r1 a. L* ?
[*,/ S) j; S! W- m: K I1 u D
[*,写权限
' \" D! c' s. \" z1 w5 `3 Z[*,
- C+ P+ f9 t7 o# W[*,/ ~9 o5 t% X. G% B. C
[*,电话接收以及监听权限
4 K: l5 A0 _2 {1 \$ s[*,
1 C5 q6 Z" P% B7 ^8 z[*,6 k' M. m3 o7 ?# T/ b& C
[*,短信接收以及监听权限" ^1 p6 _0 C* L4 V5 P( X: O$ @
[*,0 G% O! D9 D2 B
[*,9 w; A6 c9 ~0 K" ?5 U1 o4 k
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页9 P9 n8 O" a. ?5 T
[*, X+ w$ J- N2 L
[*,
8 ?, M- M% J; Q! m[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
+ J4 h, d6 Z* d[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
! o3 @( F5 b0 H' J% ~& l1 V% ^[*,[font=宋体,所以需要这种方式.
, p! ?5 m" I0 {# [7 s[*,[font=宋体,在JAVA[font=宋体,中自定一个类
# O* N3 I3 t5 Q6 o* _' a- o+ Q+ e[*,Class MyData v4 a, P, t- C4 d. E5 P
[*,{
2 ^* M" J! V3 q# H[*,Public:
# L' a5 u+ E8 |[*,Int a;
) V/ \- |6 m) A: S7 Q; h[*,Int b;0 s7 a, I5 f) e: U& _5 a5 j
[*,Int c;: N b" c+ I6 }7 a$ Z$ g: |9 g
[*,……..};8 ~& Z9 ^- P- d0 L5 o
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明 ?9 \7 }7 w/ y2 |! c9 L! A S
[*,public static native void GetData (MyData data);5 J* N1 x' e' M% y+ `( w
[*,JNI[font=宋体,层中声明
& l" I1 M. o! s, U[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
% I1 R z7 p0 l: V. Z[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值4 ]3 C+ j. P7 q5 t( d
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");! d5 ]% I. O/ E, z0 q) Z
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值% r8 {- G, _/ O) a
[*,env->SetIntField(m_pdata, “a”, 5);* r3 S7 ?4 u# U; q& w+ ?
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.' s7 u& o" \8 k( z2 X
[*,& E6 u0 K1 M; x }9 C* t/ f Q2 g
[*,8 F* z5 a1 ]1 \
[*,6:[font=宋体,工程搭建
% L+ s, L' G; a @[*,[font=宋体,首先编译引擎代码.: Y9 h( C& r7 _
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.8 ]1 ]; U6 B3 ^0 a, S1 E+ Z2 e x" t
[*,[font=宋体,需要重新 Cmake( k7 y$ P0 R; ]# k3 b' b
[*,[font=宋体,编译好代码后打开ZSDome
$ Z8 R' i6 K7 Y# `+ V[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下) q; ]' ]0 u4 c; o- B; o
[*,[font=宋体,然后直接直接运行即可.' v* w/ e+ S1 ~! ^, E, F- S, k
[*,
( g* u! [. ]) o( S4 N; W[*,对应接口9 `( b5 q5 K4 R9 L; ?" ]! X' c+ V
[*,Android' c, G- K1 n' Y4 m4 U, ~. J8 k
[*,DemoInit----[font=宋体,初始化引擎4 o6 N1 n. F H/ V) G" Z' L( K3 a
[*,Render----[font=宋体,渲染主逻辑
+ b- t) e- V: v0 T[*,% Q9 g" ~) ^+ x1 ]4 z% s
[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用4 b7 G9 X) \/ B K+ c
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib( t5 c, x) o7 }. v N k
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a( P+ n* u& v: f' T
[*,+ O: ^9 a* X$ I3 f. _
[*,然后使用:
, C4 y; E/ j# x; Y2 w, \* G[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()
/ A/ \& T& ^( a; C; L) z, N[/list, [/td][/tr]
" {1 H" C9 h' ^7 R+ I# z1 o[/table]
& a9 M9 S- G! q* e; C& ?( X, r% w @
0 w% B/ R& f7 r) H, j$ w2 G. @
|