|
[table=98%,
# H/ b/ C0 m1 f! `5 P4 y[tr][td]8 m+ r7 M! k3 [6 P# I1 G8 w+ F
1 d, N2 l- T# P9 N8 G3 e9 e
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
8 [# g# R9 `. L7 ~[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
. M0 T& i/ P& z5 I0 ~$ `[*,
N, @& |: e0 Z- @[*,多点触控:! c+ A/ f# c, j( Y! W" O0 [, t- w3 C
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。( Y% f- T' z7 y% w
[*,原理:2 y+ U- Y( [9 \+ g* ?+ Z
[*,Int pointCount = event.getPointerCount();- s) d u0 U% V# l7 v9 ~
[*,获取当前的点击个数。) S( U4 `0 F. p7 L3 S# A
[*,ACTION_POINTER_1_DOWN8 Q; D9 N+ t' k0 r9 P6 _
[*,ACTION_POINTER_2_DOWN/ N# s' f3 p3 q6 X7 |4 E
[*,ACTION_POINTER_3_DOWN
* C# t7 n4 A* \[*,ACTION_POINTER_1_UP( I4 u$ x5 o4 Y- @. m w9 t
[*,ACTION_POINTER_2_UP
% I- G! ]( e0 H$ v% V[*,ACTION_POINTER_3_UP
( c6 A( }3 q/ X6 i[*,ACTION_POINTER_1_MOVE
2 g0 l- t; M/ i9 {2 f[*,ACTION_POINTER_2_MOVE
$ j) H7 @- ^, m% c3 o: I[*,ACTION_POINTER_3_MOVE
$ e* ~' v, M; @[*,[font=宋体,获取各个点的事件响应( O' z; F/ T, ~8 n, C/ x' A0 Q
[*,: u l0 b* v0 o6 x0 l5 C
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。# A6 K& z: ~. Q5 O
[*,[font=宋体,同理第二点也一样。
, O. y+ s) L2 n+ G: w/ v+ y[*,- o+ T/ T4 i5 h7 S. P1 [9 ^
[*,2:[font=宋体,安卓生命周期
" P; Y" i7 y& Q. |0 I4 ^[*,[font=宋体,默认的安卓生命周期为点击应用图标
! A9 U( C9 c1 H) `" k; J+ C[*,OnCreat OnStart OnResume
6 ^) I/ `8 I, v) w! K[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
, H* w( B$ ^' O) p+ c9 z[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
/ u# S; }6 K6 N9 o- P[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到5 M% }1 f6 A1 N# t% g) x. s- c
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
) ]9 t8 z, p( b8 n( ~. O' ~[*,[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,就可以了不要让他走周期流程# S7 v* ^1 G) k7 o+ H3 B
[*,
/ A# P& R( p. M& N, p6 u2 g[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏3 F0 w" g! m7 E( @2 e
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.- N' e% Y9 J( V. l6 A; }
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.$ `% G/ l; i+ s: |: 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,.$ w% b! g1 Q7 S% D: [
[*,
' s0 Y0 _- u' M, Z[*,[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,具体写法
% |4 C6 z, F/ A. ?4 u# ^- v[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加5 _5 ]) k& v# w( ~
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,9 ]% f4 ]3 r% c
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
: N: q5 H! y/ o! i# d[*,android:screenOrientation=[i,"landscape"[/i,>. n+ b8 Z5 Y2 {2 Q- b$ G/ x- _
[*,$ {! D$ L( b- N# C ?
[*,% J. `. t& J0 w! x+ r8 z- z
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
6 G, I/ d) l$ G: f4 O% f& Q[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类
& ~. q$ x( Y3 _7 Z5 `. q' f n[*,
" L& e8 x: X8 J [3 l( V! _[*,读权限$ |8 q& C( O' b0 E
[*,
& o) p& Z# a( ^& i[*,6 ]; I( e! F1 P, p& Z
[*,写权限 e8 t% e* [! }; l9 X% D. y6 p
[*,
1 G( L/ v5 k" i# ]. D* G[*,
& \; q: S8 |" D: }4 r[*,电话接收以及监听权限5 t: D8 X; k9 d2 v9 s8 L
[*,9 o- V; ?( G2 u" P# S" j% w) ^$ U0 R: U
[*,/ N5 J) ~" w1 ~3 w/ l
[*,短信接收以及监听权限$ r6 \0 B. O: C
[*,+ w# P' W$ _& b
[*,
0 c, t) j0 I# X, w5 A. ^[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
% K) t3 N. F. G6 ^& _[*,
: A8 L' u: _, I( [5 Z( y/ p[*,
$ l1 A# w* J8 c {1 g- `5 [[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互" ~* S/ p$ e0 Q1 U0 d* D4 q: S
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
) g3 w. |1 W8 Y[*,[font=宋体,所以需要这种方式.
8 ?6 e* x+ G2 l. s[*,[font=宋体,在JAVA[font=宋体,中自定一个类
" w! J8 W% q" p. B4 ^# A i. d[*,Class MyData
5 [3 T: |& b% ? X[*,{
8 o, r G) R: w4 C[*,Public:
4 d- E7 U+ W+ m& D, B# n[*,Int a;# _+ j2 C% U; [
[*,Int b;8 |$ @% z' q: x* p4 v; E( O: L5 o/ I3 N
[*,Int c;) T F: S1 s& U1 ?8 L# {1 c" \
[*,……..};' B5 `* N. z/ O: h d; {/ @
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
' Q2 B/ h# @5 V; ?2 m[*,public static native void GetData (MyData data);
( g% D2 W, x5 J0 k7 k" _6 x[*,JNI[font=宋体,层中声明6 e+ U. W+ @7 |% V& o
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)7 C! J4 P- |: m2 O F, ^ L( U4 j
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值 U6 X: e u% S8 t
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");) T, i" M" q0 g
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值% O1 [) L3 Z' \; r! F# K! w
[*,env->SetIntField(m_pdata, “a”, 5);, T# y& ]4 o. \0 P- q9 j
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
; A! N" x! n- G* K1 R! m x[*,
$ ^; j4 [6 M- A; a+ G, A x5 A[*,
: d3 x. V* ~5 B3 u. Q; [[*,6:[font=宋体,工程搭建
$ U T# C' K! w1 O1 } H[*,[font=宋体,首先编译引擎代码.
# k0 s7 ^! v6 l. U[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
+ i6 f3 m" i B* t[*,[font=宋体,需要重新 Cmake
% e4 z- C: `# a# ^& i) ^9 c s( x[*,[font=宋体,编译好代码后打开ZSDome
, V* U) v% [. `; l# ~# g" `[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
1 M, F' Q {3 ~/ U[*,[font=宋体,然后直接直接运行即可.; t/ n3 g! r! X( S
[*,* X* \! o; h& I) x( x
[*,对应接口; @: z/ h+ V: @/ g- G
[*,Android" G* R/ Y& J% q. s- ^7 o
[*,DemoInit----[font=宋体,初始化引擎& K9 _4 v* S9 p p6 P |$ ]' j8 L
[*,Render----[font=宋体,渲染主逻辑5 | @. L" V+ z
[*,
6 ^: t$ }- S4 T[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用* y, a. L$ V8 [$ e
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
$ U7 ~$ X/ W) ~7 `1 S[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a! J$ N- w# t! `1 Q Y2 u/ f
[*,
8 i6 f% \4 ^0 \/ |0 m/ a[*,然后使用:0 R! C8 R. e6 h1 D* K
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()8 Q9 p% r; g, d
[/list, [/td][/tr]
( \9 C" Z W9 z( G1 \! z9 [( d[/table]0 p) Q# {) X# D+ X
1 ^8 }6 g1 F/ L2 ^' y: D/ {
5 m/ J: c+ u6 V9 t$ Y
|