|
[table=98%,
1 J8 t T% @- c! W[tr][td]
" B m3 E7 t! E9 y- `
4 R9 K( W3 X# \4 G' `% u) w[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
1 t1 R- d8 @, O' c9 r7 O" s# m[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案' ]+ L+ O8 s) v2 [% Q
[*,1 L- g# R$ T* B- M& N0 b q9 F
[*,多点触控:
, M0 w% @7 r F& @+ o. B% S" R0 N' B[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。
$ i" F. e3 ]: d" W[*,原理:) V& z9 [2 t3 I0 P; |
[*,Int pointCount = event.getPointerCount();. z0 E% U: Z; E- @
[*,获取当前的点击个数。5 n. Y* }+ X0 P$ `. t; `. r. R
[*,ACTION_POINTER_1_DOWN
, E4 Y5 a6 Q! E[*,ACTION_POINTER_2_DOWN
! d9 H3 k; g' c[*,ACTION_POINTER_3_DOWN3 @& w" `% z$ L
[*,ACTION_POINTER_1_UP- V# F0 S8 E5 N( Q+ W& ^: R$ D( J
[*,ACTION_POINTER_2_UP% n. m% c1 m% e5 s/ J( X) F% K
[*,ACTION_POINTER_3_UP3 P' r0 L. G4 s3 P# t
[*,ACTION_POINTER_1_MOVE6 u/ @4 q U: `& }3 e$ N/ l
[*,ACTION_POINTER_2_MOVE4 I- O: _# U3 h( \8 D& A8 N
[*,ACTION_POINTER_3_MOVE
' p0 E R& T" D, a4 k, T4 P[*,[font=宋体,获取各个点的事件响应
. P. x$ X d6 k1 n' v7 w[*,; e, B9 k& I" t y3 ?% z
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
1 u: l3 m/ Y! v: r[*,[font=宋体,同理第二点也一样。
) F9 C: O" l' @0 l[*,
+ A- u1 B% n) w" Q% O4 k[*,2:[font=宋体,安卓生命周期
2 K! {* X8 { T: E! K- s[*,[font=宋体,默认的安卓生命周期为点击应用图标# X7 U9 E8 D2 P! ~( z
[*,OnCreat OnStart OnResume
$ h: c1 I( Q D5 q. z[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
; F ]% S2 k- h7 M1 W5 C[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.4 u `3 f; S! Y' D* }$ ^/ \ D
[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
, p: T* a9 b5 i4 o) Y- {( O2 f[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;
7 t' N4 v% o- g S[*,[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,就可以了不要让他走周期流程
- k% O5 l4 C0 _- R; `- V, i[*,
# Y9 @4 ~) H `/ ~: y[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏4 @& F' m, i1 X0 D6 _ m) |
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
: |4 E* F. [- B/ S; ?[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.: N6 S- X! A1 U7 P& |
[*,[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,.
% n. h2 X+ p9 \ @[*,
, A6 t' {, m# W% j[*,[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,具体写法
: U2 w2 n, i$ g) v; j0 Z[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
5 H9 H" G. w2 \1 ?" _$ T0 E9 H3 I[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,
. O* X/ k0 L8 ]& O3 A+ b[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,/ J- A" K9 M/ @! w; B
[*,android:screenOrientation=[i,"landscape"[/i,>
! I0 l; E3 W8 f! E[*,' ~6 X+ v6 x+ ?" R7 @& A) x, q3 B
[*,
. }4 d. F/ ?5 j[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
% t0 v+ e2 j- M! O[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类" X; O& r. X; O& ~/ l9 v
[*,
3 A1 Y" P9 ~) t2 J; a[*,读权限
# g5 W6 \! x, ^[*,% B4 d7 V8 N$ U. q* g
[*,
3 @! J( F1 _9 b1 _3 \/ y( I" o[*,写权限4 }7 L z7 l( ^+ E& z" U3 Y) s
[*,
* c& K. I9 H' B( q. B[*,5 Q9 B0 n7 v0 o4 U! y: S0 ~) K
[*,电话接收以及监听权限
, `: }3 B$ F6 [% G; I[*,
+ } Z2 d4 l" @/ x S" I, {7 R6 h/ _[*,7 D; V/ B6 n% T6 @7 [
[*,短信接收以及监听权限
G3 f9 @: @0 [4 p& G- M4 ^3 G" ]$ b[*,7 h; y# c. k& O) |: G' o7 m
[*,
6 x' `1 `# x+ P% M' G* e[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页# S% o# l" ]2 n6 D; D( Z
[*,3 s( @5 D! A& w; S, O' B1 @" C6 m
[*,6 n9 U' G/ V7 q7 P- S/ c$ I' ]6 x
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互! Z+ O5 Z" ^5 r# a
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
; I0 o+ G; _ n3 ^3 z6 M# [[*,[font=宋体,所以需要这种方式.
2 X1 F* k# {# V+ p+ E/ s[*,[font=宋体,在JAVA[font=宋体,中自定一个类
' \) j. Y+ O# p; M5 ~" D/ E[*,Class MyData
3 W( l5 P! x/ C8 G[*,{9 U* B7 B% {3 g: U# O2 @9 o
[*,Public: Z; G2 `. W( a& x) [+ g
[*,Int a;
+ b) v) ]& a$ z5 B[*,Int b;. ?2 B0 n/ f7 P% p
[*,Int c;7 U6 n" f1 H$ u# A0 ^; f% a
[*,……..};
# |) y( ?. M* K, v[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明
. q/ z9 |5 D: B& H5 K" \. T8 C[*,public static native void GetData (MyData data);
/ K1 e0 k \/ ~ ]$ F2 {. A[*,JNI[font=宋体,层中声明
. `0 u- z0 w. F! q- w2 L[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
0 y, C) a4 E! n; p[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值+ ]" [' ~6 i) |4 ?6 y
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");
! P' [" R2 [% r0 @4 d$ m[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值6 n- O N: k, b! q0 Q
[*,env->SetIntField(m_pdata, “a”, 5);
" z4 B* s# E) c( w- L[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
1 ~9 C0 I6 b" \# @[*,% s- i: |, ?2 P
[*,
4 H6 f# O7 L m! |: J# q8 F[*,6:[font=宋体,工程搭建
3 g/ B% Y8 Z) L" P[*,[font=宋体,首先编译引擎代码.
7 g$ O* E i% @6 m[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.
& T! m/ b( j) V( v5 U. Y# h[*,[font=宋体,需要重新 Cmake- K2 G$ Y2 U( n6 u4 P
[*,[font=宋体,编译好代码后打开ZSDome/ e; S; o7 @' W' x7 k- j% E
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下
* I, A& I% r6 W' _[*,[font=宋体,然后直接直接运行即可.
2 _1 W$ q7 E3 @[*,
6 E2 S% d6 e3 t5 }! @% V[*,对应接口
; i3 @5 p8 O$ _4 Y) ?1 [[*,Android) _8 ]5 R+ u$ |( t# N
[*,DemoInit----[font=宋体,初始化引擎
* m6 N" V2 E) z. _* E* Z% g. z0 R[*,Render----[font=宋体,渲染主逻辑
) \/ R V; q" f- k O3 I% V: B; g) L[*,
. S' E, s' \' n G" }[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用, i3 O1 r3 B8 i0 k4 C
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib/ r; o1 O7 P, ]( n0 a. q% t5 g' u
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a# h' K# u' I! P) k' \
[*,
- Q4 m3 Z2 e8 ~4 f% k: ~[*,然后使用:
5 m0 Z+ S1 I" _$ l$ e[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()/ b0 z$ a* y3 f6 W* o# d) x/ s" {
[/list, [/td][/tr]
S- n/ o" h8 c[/table]
1 N* R( o# [! n9 s, Z! ~9 u! n }& z
" `7 s! H9 K2 E
|