|
[table=98%,
' F8 Y; R: j% `% Y6 k$ E3 _[tr][td]
! d% H) i/ |% a2 C
0 Z; {' @% |3 K+ r1 e x[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
2 `+ K+ z0 E. d$ b[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案; I2 T3 r* H) Z. D$ f. C z
[*,! g5 F; w- r4 G1 d# [$ R8 L) h
[*,多点触控:3 E" L, \. s8 h/ q8 h
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
/ {7 g; R, i6 l3 d6 G9 }( o+ R[*,原理:% {+ e, x* d0 n8 z4 U8 V p. J
[*,Int pointCount = event.getPointerCount();
/ N/ e5 b9 z4 M C7 i: H; }" Y7 h[*,获取当前的点击个数。) _; B8 p7 G) Z5 M1 N7 ~
[*,ACTION_POINTER_1_DOWN8 }$ }: g0 B# J# v! G; R
[*,ACTION_POINTER_2_DOWN8 d4 D8 d9 u( u5 U# u
[*,ACTION_POINTER_3_DOWN3 s3 s" e6 ^8 _9 S0 Q1 B# V) S7 K
[*,ACTION_POINTER_1_UP
$ }( M3 Z! y, }5 W" A[*,ACTION_POINTER_2_UP; F0 h+ S7 i: @+ ]
[*,ACTION_POINTER_3_UP7 q: R" r8 i0 m }0 t9 m/ f
[*,ACTION_POINTER_1_MOVE
s8 C( {9 l; A* j( {' x. a[*,ACTION_POINTER_2_MOVE
! V7 N* g) I5 Y! @6 G[*,ACTION_POINTER_3_MOVE
/ P* c1 }8 l- b! D, I; U+ w[*,[font=宋体,获取各个点的事件响应. L0 V; Q& L, Q+ [
[*,
: v( \3 i; H L- {. c% Z[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。( m& C8 _5 R) i4 O& ]
[*,[font=宋体,同理第二点也一样。/ B4 O' u& e- |$ _4 ^
[*,: }) S( c7 ?8 D, v
[*,2:[font=宋体,安卓生命周期
0 ]4 t/ E. R3 ~; D+ e" h[*,[font=宋体,默认的安卓生命周期为点击应用图标) y4 F- I! ?9 V2 W- \' n
[*,OnCreat OnStart OnResume+ e- y- t& ~1 X( A
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory& r3 \1 [# I- K9 `) I
[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
" j) H$ _( \" Z' B3 U# T9 M! r5 ^[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到! S$ X7 J! Z4 h4 s
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
, Z) ~% `# N. A/ F" w* J7 ] E! e[*,[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,就可以了不要让他走周期流程
: L' J1 [8 N/ W9 Q$ }9 `. p: m( M[*,! M' b4 g/ r% p7 d: P# m
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏- K+ }' O5 M; Q+ G9 U3 R
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.( |& h: }" o* n# p
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
# E4 ]' o# I$ Q. n+ N/ v[*,[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,., I; L3 K& Q a
[*,
- h1 U ^; X ]$ y[*,[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,具体写法
3 S: j% i7 I' [/ b5 _! r[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
' f* J; ^7 N& X7 s& e[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,0 {) s5 R; C* d7 l3 U4 m
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
, |8 {: a. ^5 l[*,android:screenOrientation=[i,"landscape"[/i,>! _; W" R8 H7 i
[*," @8 |7 K' }: k! W% A; {' Z" D
[*,
* O' ]- q# U m$ J[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限- `9 v- v7 f s, f4 h1 V
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类) _# Q, s' e) t! w. I
[*,
/ L5 r* _+ g1 g1 n[*,读权限
) ^8 @4 s! _. R[*,
' p# M/ ^! O$ s9 K. g; K2 |[*,
H3 a. \7 [; S% p3 k) Y[*,写权限* v; {, v/ f4 h
[*,
) U" l8 Q; a3 ^ ^/ Z0 X[*,
& M9 s8 \# \: ][*,电话接收以及监听权限
# z4 z" v" v5 h) a' `0 z: P8 o[*,
+ p; d8 y! ~$ F: J: X- p[*,: L$ A# R+ f: w5 c7 j
[*,短信接收以及监听权限7 ` j+ p" ^ N6 I ~" I
[*,
1 s& B( Y. P$ A2 i, N[*, I4 ^2 x, b$ A( A' f
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
% G2 C. q. p+ |; c2 H3 D[*,$ l, i1 C0 u5 b/ m. n& @) X
[*,; L3 ^% t$ u d. ^
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
. |, m% @3 X8 Z9 G( H[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,./ e" i- w3 T k% K
[*,[font=宋体,所以需要这种方式.
+ d! Q' E9 w5 r( Z9 R3 R[*,[font=宋体,在JAVA[font=宋体,中自定一个类/ {. @; q1 J8 i0 t- ]* m
[*,Class MyData
1 H) o% y$ S2 D' k[*,{1 y7 o ?7 O" H
[*,Public:
/ } B- ~/ X& D0 l: ~[*,Int a;$ s7 |5 l7 `- K6 ]6 H. f5 I6 Z; L
[*,Int b;) X! Y( C7 n& M. D
[*,Int c;$ ^- [' J9 r8 T
[*,……..};. i5 }$ M7 l# b1 U
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明$ d. B/ i/ j3 B7 g9 Q+ ~
[*,public static native void GetData (MyData data);
* H- ~% T" [% g; c' Z( h, U[*,JNI[font=宋体,层中声明% C1 k' v, `* J' {, E
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
! I1 s* b4 y" x% k+ p) N[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
3 [1 b- C9 L6 A6 L9 i[*,jfieldID sound = env->GetFieldID(cls, "a", "I");0 b5 a _/ q. X% a! B' n( Y
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
6 |- \+ n2 n9 v4 e G( d* c5 J[*,env->SetIntField(m_pdata, “a”, 5);
' Z2 n* X! t7 g[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
: G; [. h! ?: G F[*,% R& V0 t0 e0 K, m" ]* j3 ]
[*,- {" [5 v$ P& [3 O( C
[*,6:[font=宋体,工程搭建
, x+ E) G, h9 x m2 |7 n2 B[*,[font=宋体,首先编译引擎代码.
2 }; B/ l, b6 Q" n7 n[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
9 ^7 p' s* Q5 C( `* T0 o* z[*,[font=宋体,需要重新 Cmake- T# U5 d) k, d. q1 X4 V% W% b
[*,[font=宋体,编译好代码后打开ZSDome! q5 x7 i. @ @6 T$ p; E( e
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下0 ~, @6 C3 O* X0 t7 A, B n5 s8 H/ S7 g8 E
[*,[font=宋体,然后直接直接运行即可.1 R* x" E" I4 y& Z
[*,
/ W2 V/ H; i: u4 N( ?( m- T1 B$ O[*,对应接口: y. S+ _& n( d1 U
[*,Android; c4 j5 r/ K W7 A7 L8 H
[*,DemoInit----[font=宋体,初始化引擎6 R' b; ?2 X3 R1 \! X% D0 e
[*,Render----[font=宋体,渲染主逻辑7 H5 Z' e- T% _. o" k5 D1 B; N
[*,8 h. U- _8 _* {: E. I5 @! z2 y
[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用; l6 Q5 o2 f1 A6 G* a3 ~
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib3 \9 ~7 V) d8 U9 d6 a( a. |" G
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
/ X7 P$ r5 A1 ^[*,
" B* s. M) ]$ l, A; ~, v" E[*,然后使用:- s1 P( M# A$ U+ C$ W/ d* Q% V
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()
- F. f4 A6 Z9 ~. J$ q. w[/list, [/td][/tr]# c' m6 ^" Z' m- X6 m/ k
[/table]
$ p4 m/ ^+ g: K) P4 H! ^
, C7 e4 B9 K/ P
5 N/ e& q) z+ i; g# C- |2 e. ] |