|
[table=98%,
" O3 h' C( o$ Q[tr][td]
7 p; E9 M1 Q+ O! U: y- P7 D2 d: T: f- ?
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,& R7 Y+ G! V& ]( R; H
[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
$ r H) q. U0 f' O[*,
$ @' h7 h0 O) l8 A' d) U. I) N[*,多点触控:
$ R1 e' K4 K2 b) `2 Z7 m, d[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
7 p' ~1 z% l+ S* {) K[*,原理:
" {& D) K8 M3 _( K, }[*,Int pointCount = event.getPointerCount();
) a, {; g. P* m- E[*,获取当前的点击个数。; z, ]( Y+ o5 M2 i3 C" {
[*,ACTION_POINTER_1_DOWN" x2 s# F0 ^+ G' O) m& T* l& M
[*,ACTION_POINTER_2_DOWN6 L7 y5 M4 u9 `! L$ _
[*,ACTION_POINTER_3_DOWN
. m; o0 `+ j& l1 F[*,ACTION_POINTER_1_UP, ~5 t! k7 w F& F
[*,ACTION_POINTER_2_UP& V' g5 m$ d, ?5 j( m' X
[*,ACTION_POINTER_3_UP+ L/ }+ i. z* V& z$ [
[*,ACTION_POINTER_1_MOVE$ R! D% |6 I9 a# A- {" j/ A, m) G
[*,ACTION_POINTER_2_MOVE% R! ]- h0 N# Z1 S
[*,ACTION_POINTER_3_MOVE
6 |) T( }# `8 s; G4 E[*,[font=宋体,获取各个点的事件响应* B, J- v! m% n& V
[*,( l& e" t- U5 z3 H/ W' M+ S/ M
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
1 ], }- e+ C. F; y0 l5 @' w[*,[font=宋体,同理第二点也一样。7 N% |6 N2 h' x2 n( ]0 Z
[*, `& W/ S$ s7 P( h1 K7 B- k
[*,2:[font=宋体,安卓生命周期' C# }/ b* V$ q0 y% e; r/ G* q
[*,[font=宋体,默认的安卓生命周期为点击应用图标
& S ~' A. R a+ u9 p[*,OnCreat OnStart OnResume
" b& n: J& O' `1 `, X[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
; ^# h4 ], d0 ?) u7 N[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
! \( v! V4 t6 @: h6 t[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
- M( w& W* `7 y5 I# R+ d+ T* _[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
' p/ S9 G" L( O% U, ~, }& h[*,[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,就可以了不要让他走周期流程
4 }# V4 O8 l, ^! K5 e3 t! k$ Q[*,, @2 ?4 }+ ]" _
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏9 D5 m# _. I! ?( x& w' Y Q
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.4 M/ C. W4 n) s' N: ? n
[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
+ c) f! d! Z" N! s[*,[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,.$ Q- ^6 p& R, k7 y
[*,
$ I! E8 Q9 U- U6 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,具体写法
. m: E- e/ _1 |5 O& n$ U' @[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
8 [2 ]- w. ~( p* B K9 G8 m[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,
1 @9 n, I1 v9 k3 J3 o[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
8 j9 V$ `4 _8 T& N[*,android:screenOrientation=[i,"landscape"[/i,>
' a' m$ {$ J' J[*,( R$ |" j/ m1 d( C, E
[*,/ _. d( f6 }' Q& I6 k! a
[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
9 [. t( ]+ H- `* F4 g) Z[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类
1 ]. {/ B4 x$ W7 ]; o, `& G2 z[*,
% {! k% `) s- c: x9 B- R0 P[*,读权限
+ |) y% _' T4 R# f[*,
. S- p5 W3 k, k[*,
( L. K/ @$ C- V. a/ R2 c[*,写权限9 W* b+ r1 C2 E
[*,* w9 c d7 K ~' U$ u2 |/ y
[*,. C) v2 ?! a) A7 J4 l
[*,电话接收以及监听权限& K& L5 T, Z: q! V8 n# M% D
[*, G( d+ y% d0 w5 o8 M
[*,
9 h# y* n# H3 i w3 C9 w5 `[*,短信接收以及监听权限
A7 Q p& w+ e[*,
: A) o1 u( r. F[*,' m0 Q8 l* h* k
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页
8 D u* u. V' R# _! N$ L[*,
3 c) |# h+ `6 W% V[*,' |) e4 r8 P0 K J2 ?& T
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互" S$ c+ ~2 B+ j; H
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,." V% Z4 ^1 {( ?& f. j; Z0 ?
[*,[font=宋体,所以需要这种方式.
_' v' o! B2 p6 l# e* |) u[*,[font=宋体,在JAVA[font=宋体,中自定一个类
( T0 R% w% V1 [6 O$ U[*,Class MyData
- n% x% r, E4 E, M) [[*,{$ k) l& ~$ h3 n8 X8 ]
[*,Public: ?9 h* @2 k+ C8 h' L" t
[*,Int a;
|0 L3 ?1 T+ h5 M1 Y2 S9 ~* i[*,Int b;9 k5 t+ D$ i* S- g* ~. D, n! q
[*,Int c;
" i: ]; S6 F' m! P6 ^. r* W: D[*,……..};5 |, r* g! Z# f/ A0 m) S
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
% Y! U% s0 l# u8 e[*,public static native void GetData (MyData data); D5 ~; _. @+ }8 f, b3 o
[*,JNI[font=宋体,层中声明. B) N9 a: Y* W! C
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)1 S9 x" U- C! V
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
: t+ |9 f( _1 m1 o: R4 \* t2 t[*,jfieldID sound = env->GetFieldID(cls, "a", "I");0 a8 A8 \4 T# i) p% c1 v
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值
0 L9 o' l( V2 N[*,env->SetIntField(m_pdata, “a”, 5);
0 S' z3 G1 V4 d, q0 \[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.$ m0 d9 y3 [2 w" B
[*,
. d. C: y* p! Y% s[*,: C+ u8 ]; l# R7 I* S3 A# z/ j1 ?; B% f
[*,6:[font=宋体,工程搭建
. I+ ~7 I" l1 g7 x' L# G3 T4 l[*,[font=宋体,首先编译引擎代码.
/ x6 X/ D8 E% X. x- |: E[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.& }" \6 B4 k4 a) p2 N
[*,[font=宋体,需要重新 Cmake5 e) Y1 \. p7 I* l( s# C
[*,[font=宋体,编译好代码后打开ZSDome9 U; i3 |+ I9 X' O! K. S% b
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
& j3 G$ D* G7 _[*,[font=宋体,然后直接直接运行即可.$ ^7 s* F* c7 U: B, }, A) y( g
[*,
" H% d; }- i3 k/ K[*,对应接口
; s0 s9 [- D8 s7 x1 b0 @+ M[*,Android
4 C S' P2 z$ j) Q, S' a) z1 t[*,DemoInit----[font=宋体,初始化引擎
7 N( U1 S8 B) [2 h7 e[*,Render----[font=宋体,渲染主逻辑8 i u3 k& o& @; B" _3 }+ q, t0 X, Y
[*,! g" G- _5 o* { W/ }2 S1 x
[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用6 n R" z- E- W$ n
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib
Z/ M$ @; {6 P9 `[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
& y- h. P8 N" I3 S- G: K1 }[*,! q6 x+ r. e6 ^$ ^, J
[*,然后使用:- M: E' L' K* S5 E. m
[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()+ p# \0 q' P! R3 o
[/list, [/td][/tr], R* m2 @# i) F9 ^& ?$ U* T
[/table]4 ^2 a, e6 X0 U7 {5 ?. D
& V+ X* [1 p! @' z. C
/ l* z6 P0 Z |# d, T" [ |