|
[table=98%,
& r$ i: @- J: v, B' W[tr][td]
9 `1 O8 H% b8 [" {" _- z* K k+ h) z" Q4 C, P; Y7 L: D
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
6 z7 P3 g7 q" {[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案% n6 c4 F% q g5 ]
[*,
) H) ^7 s8 Q- R! p6 b( v6 F% B[*,多点触控:8 A: G" a( K1 h1 r1 u1 u; D0 U6 A
[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。7 B- `, D# r* s$ E3 t" s0 O
[*,原理:
3 a) R4 @( C* K! z3 O& D- Y4 s" ~5 a[*,Int pointCount = event.getPointerCount();7 M0 n8 ]5 |' a* |
[*,获取当前的点击个数。
- }6 R# [; L) V9 L* M[*,ACTION_POINTER_1_DOWN0 K5 m. D" U+ `( c5 z+ I& |
[*,ACTION_POINTER_2_DOWN
9 D6 L6 r a8 ?8 f2 }, F[*,ACTION_POINTER_3_DOWN& d% s) o m* N8 F) v2 Q' s5 ?! B
[*,ACTION_POINTER_1_UP7 |6 v/ X: ]# t+ F" B. w
[*,ACTION_POINTER_2_UP% L$ I' x5 @) U/ s& {& W2 A; V! q
[*,ACTION_POINTER_3_UP+ I* b; @% k$ I O' W& O
[*,ACTION_POINTER_1_MOVE
3 T; V. [7 k) G[*,ACTION_POINTER_2_MOVE8 J/ S4 k, y3 i! {
[*,ACTION_POINTER_3_MOVE
, C6 Q+ b$ y+ A% f9 W[*,[font=宋体,获取各个点的事件响应
, C8 p2 @% R# z1 j6 A[*,
9 c% C* v+ I) e6 O[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
, w/ l' @+ P% I$ Q[*,[font=宋体,同理第二点也一样。
' Z0 H6 N# s+ K6 ]" W- a[*,( O% l; X% c, Y/ q1 `# e, S! s
[*,2:[font=宋体,安卓生命周期
: p# H3 m7 U: c[*,[font=宋体,默认的安卓生命周期为点击应用图标. @4 T' _9 B+ j& p& L6 k
[*,OnCreat OnStart OnResume
' t' l5 H7 ~ W* O S) i' r( c" t' h[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
. i1 [/ c4 M8 `' d3 u! K7 I[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
+ w' }6 L: f& J[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到% P3 B- ^) J1 k
[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;% f+ S, l7 P* E9 p- ~5 I
[*,[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,就可以了不要让他走周期流程$ @- c$ c6 v: P0 t9 P6 {
[*,
, t( P! A0 \5 I6 J% d4 Z[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏7 ] f5 N8 {& n4 e. R
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
% l& K) y5 [, e; M, n[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
2 q- y0 w9 X; H- T# m' K4 q[*,[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,.
0 w9 @* H! J. H* h: @, x" f[*,
# D* m( n7 L- 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,具体写法
3 R& u1 t y1 ?. U& A! f& ~5 W- t3 K[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加
& X6 M$ s5 F5 i4 K* K' \" L9 Y[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,5 \! D) s" r' l
[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,- x% N8 I$ w& B. N8 X8 P- z0 y4 r
[*,android:screenOrientation=[i,"landscape"[/i,>
& x+ ]3 m/ {9 d/ y# S[*,5 O" E6 V7 R7 o
[*,
9 i6 n* `: J& T% |; k[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限
1 y: K4 x3 E' M[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类0 e0 J. V: n! L% V+ t
[*,! [6 c: {, ~/ Q, c9 R; A( d1 Z
[*,读权限! D( M4 |$ b" b! P/ j
[*,
0 B& @& Y% K( ~4 R+ d; _- J[*,+ U5 K+ v; s) Q# t
[*,写权限
0 U3 \0 X' ] ~8 a[*,: ?; t% Y8 U2 |+ i
[*,
: T* n* Y: l' H[*,电话接收以及监听权限
/ b1 L2 B c/ ], b- O[*,
. G' j( ]8 @# ~1 z" l7 B: ?[*,; w5 N# ^6 _( ?6 z3 E0 B8 _
[*,短信接收以及监听权限: t0 T. z! B. `0 d5 m7 A
[*,
8 T# n; v& S( h3 ~+ u7 ^9 ]5 W- e( g* c[*,! V8 B7 N$ e% [2 ^, I: \- Z9 M
[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页: s1 J" W' _: \! n3 L9 n
[*,3 ~# \, R" G' g/ z" B4 Q% u/ j
[*,
# Y* M4 T7 x0 K2 S% }7 ^3 W[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互
" T' H d" t+ l1 e# o H/ z" R" A[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.+ \! K4 {, q& S6 M/ r1 @
[*,[font=宋体,所以需要这种方式.
6 t, Y1 U9 k) }: F* Y9 D[*,[font=宋体,在JAVA[font=宋体,中自定一个类1 w; e3 T b' I5 { D; b+ K% u5 z
[*,Class MyData% r- P2 Y" \& \* l8 E& N R
[*,{3 X! K/ p6 f2 y" n' w
[*,Public:
$ B0 y: E) C0 C+ V[*,Int a;
3 a5 M$ F4 Y: k/ Q' g& y9 m[*,Int b;
( p: I2 O* z. N[*,Int c;; o! @2 Q7 P. ?+ ?7 h |5 K
[*,……..};
) x* e4 d" o( I, `[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明# q8 c, A8 D# F4 x4 f6 e
[*,public static native void GetData (MyData data);5 F) p, f. |' L; ]( v
[*,JNI[font=宋体,层中声明
2 h/ e F9 A- n; w& g% I[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)$ F# O1 ` v" F. J( c0 y
[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值, v( C! _ A( @
[*,jfieldID sound = env->GetFieldID(cls, "a", "I");
h0 e' {. N& X; Q% i[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值* L$ _: h. O7 u6 H# M
[*,env->SetIntField(m_pdata, “a”, 5);
j u: z: {* T! F7 r[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
3 E) {) @9 j: Z. J$ b3 E+ L5 Q[*,. J9 m) z- A8 Y1 z$ N- t
[*,
- V! }: F2 c+ v! J3 o[*,6:[font=宋体,工程搭建
( M+ t2 Z- X7 L9 a/ W# A[*,[font=宋体,首先编译引擎代码.
/ t$ b8 G: W! C* |3 r" `! V[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.& z. X+ z* D; o2 H5 H6 {# [
[*,[font=宋体,需要重新 Cmake- Q$ e7 t& Z* T/ y% X- p
[*,[font=宋体,编译好代码后打开ZSDome! o8 S) N: h P3 S4 t# l6 [) {( ~* {
[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下9 Z* R C( U8 Z. x
[*,[font=宋体,然后直接直接运行即可.
! E1 Q" t. w5 R5 _+ w9 `4 F% p$ X[*,
" i' G* u( N& X) x& Q[*,对应接口
* V( f6 D1 v( D* v$ ~- q/ |7 Z% e[*,Android- z( @& a! J0 q& s- ]) \8 J1 ]# f
[*,DemoInit----[font=宋体,初始化引擎
0 C# Y2 F5 n) i5 f5 z0 e[*,Render----[font=宋体,渲染主逻辑4 |1 ?) y- P8 B9 ~5 z% S9 O( Z
[*,
' Q0 ]% N7 f, I4 Q8 b[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用, K2 w1 X& j* c4 M1 h9 V: e* y
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib, Z* c8 x+ M3 A# w7 D+ j" S
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a
+ f/ u r) T& M" g- S$ [* w: z[*,$ z/ X/ o/ q1 Q9 C7 K
[*,然后使用:
2 _. J+ z: c2 L" A[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic()
, Q: ~5 p& ^' f[/list, [/td][/tr]
( m8 G+ _( V# }4 S/ k- o[/table]
; y: B# H0 U& F: v8 a; w
5 K" C1 N, L8 V3 u" e1 N# F4 N* C2 ]( E3 a# n
|