|
[table=98%,
( {5 f" v" h$ @9 c, S4 V[tr][td]
' J, E* I2 d* b3 G: J* Y1 x0 j$ T- Z7 Y
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,$ f' b$ C7 R+ N$ D i7 {4 | ?3 z
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
8 ]! t4 Z' H! i/ H7 v3 k7 T* M[*,
' L4 @& Z% Y$ T( y[*,多点触控:
' b5 \% W* L) `9 p! K% l( C, i[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
4 y) g1 @# X, H0 i[*,原理:
x9 |5 S0 p) T2 _* H[*,Int pointCount = event.getPointerCount();
$ f5 }8 W0 E# P- X5 \[*,获取当前的点击个数。
4 k- _3 |, S9 F1 a, s[*,ACTION_POINTER_1_DOWN4 L; D! N5 y# ?, E, y/ v
[*,ACTION_POINTER_2_DOWN
6 B8 x9 s7 }4 S$ I[*,ACTION_POINTER_3_DOWN* W9 i% ]5 |) R: J& {5 P+ t, A6 {2 f
[*,ACTION_POINTER_1_UP
" `, o- n$ ], }& X4 L4 B[*,ACTION_POINTER_2_UP) s' G, ]5 |2 n
[*,ACTION_POINTER_3_UP
0 L5 U+ B9 f& k9 U* R3 C, M[*,ACTION_POINTER_1_MOVE2 o4 E. @$ ?- H# A0 F
[*,ACTION_POINTER_2_MOVE
7 `1 |7 W; l% E[*,ACTION_POINTER_3_MOVE O+ P/ S6 i/ L: V/ J- X
[*,[font=宋体,获取各个点的事件响应
/ y: W. s$ h- i: v" r; a0 d[*,4 D \4 ^9 j7 [
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
% N% f+ z; T& g6 D f2 J9 b# I& F" ~0 |3 O[*,[font=宋体,同理第二点也一样。
! y7 u- u' x# ^[*,
* t- i. V4 a8 k$ E. D" U[*,2:[font=宋体,安卓生命周期
! M* q; R& L6 C2 B! y[*,[font=宋体,默认的安卓生命周期为点击应用图标
3 D- X% A( A5 e7 M+ q" l- D3 Z[*,OnCreat OnStart OnResume9 m9 f! Y# g( q; J2 Y
[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
) v7 A! y1 r r5 A[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.0 V/ b2 a3 t5 J( P* f7 c6 ~, Y
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
- v# K2 ^$ w/ M* t) M[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
. K, j5 l W1 d! C" 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,就可以了不要让他走周期流程
! o2 f) k: C' Q8 q[*,
/ S3 S* Y- U% j; R3 I[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏0 n$ z9 t) \/ I( m
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
, u/ w: g, w! h4 y( y6 ]" m, J[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
% {/ @6 u @1 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,.
! L/ t; j0 U! g9 Z# B$ x* q[*,) S s1 E4 h+ l+ ~) n+ v
[*,[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,具体写法8 s) j/ a, H+ ]* X
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加7 U; \+ Z) e6 P+ w. N
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,
9 b$ E6 [0 h0 i1 {: v[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,( M5 N) V& ?0 `) ] v
[*,android:screenOrientation=[i,"landscape"[/i,>
" C, f, V9 k% x" a8 K2 o% P[*,
: P- R3 i; g8 r* y; Z3 ~% V) f. C, c[*,
5 b! p" M, X8 }* P8 l$ m[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限, M, h+ g0 y3 x6 W" n/ r
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类9 z) P, U8 O+ \
[*,
( U( r; U% u# S$ u. d[*,读权限
+ ]1 f- B" `- ~/ ^[*,5 n- \: `, p, h+ N+ ~( k# C6 x; [4 J
[*,3 N6 X; _ m; d* ~- O% c
[*,写权限: x/ D2 @8 a" L4 b/ ?% @& j
[*,
5 D: b. {5 i5 J' U8 H# J6 n8 G J[*,
4 z# p7 s4 g, K$ H: P[*,电话接收以及监听权限: _3 ~5 b$ t8 \2 b
[*,$ s; O; Z+ P. N3 g& g. V
[*,
4 D5 c& E, S9 k- J: q4 {, e[*,短信接收以及监听权限( _# P- ~, t5 V% j6 \/ [
[*, E, I1 f2 l- ^7 m1 v
[*,
- G' F/ \6 I/ O' U) n[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
* G7 {. N4 P/ |; E- P: _8 n' r! m& ~[*,* G( O0 U1 i! [, H" k) w$ S
[*,
) S; h/ H6 K8 v$ c0 b0 P[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互- r% C' l# ?8 h+ i( j/ Y3 D
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
" j4 i/ m8 L" q9 v[*,[font=宋体,所以需要这种方式.6 g: Q, s( C, ]* m7 _- J% v
[*,[font=宋体,在JAVA[font=宋体,中自定一个类
( s' ^9 _& h9 g% E3 B[*,Class MyData4 D- z1 B( U4 \ r: m
[*,{
3 U, J+ E/ s( }! H- L" K[*,Public:4 `. [' i( J* V
[*,Int a;& I* K* Y6 E0 A/ d! c2 i6 x
[*,Int b;6 u A2 ?2 P. C' P$ a7 B$ Z% {6 l
[*,Int c;
/ F. \7 c& \9 M3 }8 A* Z[*,……..};: X3 s& n9 P: F, d6 T7 Q
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
5 X$ f: i- D! A[*,public static native void GetData (MyData data);, ?; m6 @; N: T/ \
[*,JNI[font=宋体,层中声明* o2 O. N" t0 K8 B* b" z
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
j$ Y: T; v! I8 b6 h7 V[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值 R* h \% o5 a' w1 }4 \
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");
2 S+ R+ n' m& D, ?4 _$ Q[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值/ f+ N; X( Z! | J- K0 e
[*,env->SetIntField(m_pdata, “a”, 5);
2 y% i0 ?" P3 ` D9 G- M[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
/ f8 I; G' F& h! t3 \: |[*,& m5 T( b9 Z% h# P
[*,
7 ^# L! S9 b1 r[*,6:[font=宋体,工程搭建6 T6 b) _1 K2 {# n
[*,[font=宋体,首先编译引擎代码.1 d% A; M: n4 n. u) Y3 G
[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
1 k* }0 d/ r* s8 c" e: Q8 C" Z, }[*,[font=宋体,需要重新 Cmake( G' D6 J/ ?3 m: Z% L5 j" }9 R
[*,[font=宋体,编译好代码后打开ZSDome
9 c u8 t* O4 u5 G0 w8 S[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
5 A* l- s! S3 v) I7 `. u% S" |[*,[font=宋体,然后直接直接运行即可.
* h" d) R8 |/ I) Q& N8 p[*,8 F0 _ b) T( e9 X* o5 B9 \
[*,对应接口3 C# `# ~+ M# t& T* N
[*,Android
, z8 S$ G( y# A# b4 X[*,DemoInit----[font=宋体,初始化引擎1 g7 h) ^8 K2 K8 k' {" K" E
[*,Render----[font=宋体,渲染主逻辑
3 e2 i1 S1 g8 r& g) @/ d f) N& Q8 |2 J[*,
" U* r; u5 k' Q/ ^[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用; T+ U; t4 r, H- ~5 O
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
1 |$ r# c2 \5 F" v- f$ ?, E[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
5 h5 i1 q' P( F8 Y; q[*,
: O9 N/ x x! b. u- [: m[*,然后使用:& N7 }; o5 {% N) t% @& I( q
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()6 R# p; M% k, i2 F
[/list, [/td][/tr]/ _0 v7 i5 z& u4 @ _4 @# V
[/table]% J" S3 s% U/ H$ \' P
! e9 f+ _: H: s$ |$ p! ~
: { X- C! p& F$ d |