|
[table=98%,! M, e" v4 x) x, `- w$ L0 T
[tr][td]0 J4 _. _$ y* [4 U# P l
8 C; M; j6 J9 v, {
[color=#939ead,[color=#939ead,架设说明 [color=#939ead,[list,
0 T1 t% h! I7 U5 O/ f[*,1[font=宋体,:安卓开发中所遇到过的一些问题以及解决方案
3 f: U. C5 l6 Y# D& Z3 A0 X3 H) s[*,
5 t7 m$ ?. V4 I& \[*,多点触控:
# ?+ c$ K+ ] l( P: z t4 q[*,[font=宋体,安卓API[font=宋体,默认最高支持[font=Calibri,3[font=宋体,点触摸。! v B. h; N9 F! P4 l
[*,原理:
1 O ?. B& k: Q[*,Int pointCount = event.getPointerCount();, e/ s6 c9 J, n2 h& |
[*,获取当前的点击个数。1 p8 U$ Y; w$ p
[*,ACTION_POINTER_1_DOWN
/ A9 d& U- U+ z+ z0 q! E+ G! A[*,ACTION_POINTER_2_DOWN
& n8 [, o1 [! E3 ` s* q: H+ F[*,ACTION_POINTER_3_DOWN
8 z; {1 m$ p4 c: F8 ]+ t: c; Q[*,ACTION_POINTER_1_UP
- @& b: e* @. n. l) R. S+ E[*,ACTION_POINTER_2_UP5 R8 D1 A! Y7 Y# i# p. t* r8 I# i0 K( M
[*,ACTION_POINTER_3_UP
. L" L2 A2 H0 r/ v; o[*,ACTION_POINTER_1_MOVE
9 @# t- y, g+ g2 h[*,ACTION_POINTER_2_MOVE
" k" B7 A" d! z% y3 u2 y' z* O[*,ACTION_POINTER_3_MOVE
8 Y, Z6 `# e( X* b. u* y[*,[font=宋体,获取各个点的事件响应
& H* L; Q. U% U: X0 f' y' }) A[*,3 y* c) u" [! z4 C
[*,[font=宋体,当玩家点击地一个点时,如果没有抬起操作那么就一直响应第一点操作。
( e8 z5 S/ D6 e, g2 v[*,[font=宋体,同理第二点也一样。# Z. D8 R% Z+ C6 s: G$ G7 z- n3 h
[*,
/ S) W: r- m& f' I; ?% m( ~$ \[*,2:[font=宋体,安卓生命周期
3 o% {! C: R2 x[*,[font=宋体,默认的安卓生命周期为点击应用图标
) d2 k% e- ~9 y; ~8 h) [[*,OnCreat OnStart OnResume
6 j% M7 @- x ` B' i# i' K! G# ?% ~[*,Back[font=宋体,键默认为走[font=Courier New,OnDestory
) @( V' u$ B. s7 f d% s[*,[font=宋体,一般我们会选择屏蔽掉 Back[font=宋体,键[font=Courier New,.
6 c' l, |. I2 Y' l+ @[*,[font=宋体,原因很简单,[font=宋体,在很多手机游戏中假如玩家收到电话事件和短信事件[font=Courier New,,[font=宋体,是会被弹出[font=Courier New,,[font=宋体,游戏进入到
: r- w5 L& \1 q+ n[*,Onpause[font=宋体,然后你点击[font=Courier New,Back[font=宋体,键的时候就会导致Activity[font=宋体,走到了OnDestory;* n5 q# d4 N) E* J
[*,[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,就可以了不要让他走周期流程
* d T; ~; c, r7 w[*,# [8 i. J9 l+ N3 m$ n
[*,3:[font=宋体,[font=宋体,[size=10pt,安卓强制横屏2 p- { t% i5 N9 L
[*,[font=宋体,[font=宋体,[size=10pt,很多游戏中是需要横屏的.
* |3 E5 U5 i: Q; W8 m$ d& @[*,[font=宋体,[font=宋体,[size=10pt,在代码中添加强制横屏这种做法是不行的.
' J; R# R8 B+ u3 z0 k+ C[*,[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,.
( b# g! m5 t9 Y% w% b[*,9 W: Z2 u* R0 g* y, D
[*,[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 f- M! \6 o' u6 V1 j+ @# @7 B
[*,[font=宋体,[font=宋体,[size=10pt,在XML [font=宋体,[font=宋体,[size=10pt,中添加' r- ?; \9 R/ a4 U
[*,android:configChanges=[i,"orientation|keyboardHidden"[/i,
. b" w b) D% h[*,android:theme=[i,"@android:style/Theme.NoTitleBar.Fullscreen"[/i,
" m% x+ w4 @( n- ]/ m( K[*,android:screenOrientation=[i,"landscape"[/i,>4 r. k( s: N: R
[*,7 Z/ Y- R1 f# m$ l& d+ G. I4 u
[*,
6 S0 b( o2 t/ }& K+ J: f3 e[*,4:[font=宋体,[font=宋体,[size=10pt,读写权限以及其他权限0 R! t1 y" e% y" q1 \2 ^
[*,[font=宋体,[font=宋体,[size=10pt,安卓中的读写SDK[font=宋体,[font=宋体,[size=10pt,里面的内容是需要添加权限的具体的常用权限以下归类3 {7 B3 m5 O' b5 h/ E, e# V; l
[*,8 N% _( s* M& R5 q" s5 I
[*,读权限
" S) F3 G c) X[*,
1 L+ v) j! ~7 S% K[*,
; |# ?7 }, ]' v, l6 J, H8 D[*,写权限6 Y8 r+ I: ^: ^' A9 ^' |7 x$ ^) B
[*,( c* r* T% r; `; s# X8 P. g7 [
[*,
: v6 w" ^: S) Q8 \: C1 X$ O, P3 a[*,电话接收以及监听权限
# l8 X- e- Y& B! M X6 O. {" M[*,
+ f3 z U, \3 x$ n5 X[*,$ B6 C6 Y+ u' u
[*,短信接收以及监听权限# g! ?% q* R* Y0 y4 A
[*,
' z# n' {/ y. L6 n% l- |) N[*,
9 R, N; I/ {. |[*,[font=宋体,网页事件,[font=宋体,用与在游戏中打开网页4 O' @& r/ {& K7 i2 ]" H
[*,
0 U6 ?3 P* f9 Y5 A3 ~' q[*,( J8 s) f* }! H4 t6 R; I( O8 \
[*,5:JAVA[font=宋体,层自定义类和[font=Calibri,JNI[font=宋体,层交互2 f* V- \5 v+ L
[*,[font=宋体,有的时候JAVA[font=宋体,层需要传很多参数给[font=Calibri,JNI[font=宋体,如果参数太多会导致代码太多维护麻烦[font=Calibri,.
* p8 W+ x+ S" s6 |( {[*,[font=宋体,所以需要这种方式." z, M" D, R+ y \
[*,[font=宋体,在JAVA[font=宋体,中自定一个类
. m4 E; H9 x# `: k3 N B[*,Class MyData% S1 Y. p X3 L" i
[*,{
1 R, T( |6 F6 D m3 U[*,Public:! c0 b5 x+ ?, |% Z" x* v' V
[*,Int a;7 z( P# I* `2 q6 O. B) w( G
[*,Int b;' ~( [1 q. a( m* d% Z
[*,Int c;
: e# K6 I& n6 c8 P9 f[*,……..};7 u% a% \% p2 ]# n# D
[*,JAVA[font=宋体,层中[font=Calibri,native[font=宋体,函数申明! |# O [) I( J2 x
[*,public static native void GetData (MyData data);
0 l; N( u. [2 D: u' {[*,JNI[font=宋体,层中声明4 @' ]0 a" _, ?' ]' P" S
[*,JNIEXPORT void JNICALL Java_com_perfect_zsdemo_LordJNILib_ GetData(JNIEnv *env, jobject obj,jobject m_pdata)
# G& N8 S$ t6 g" v7 ?[*,//[font=宋体,获取[font=Calibri,a[font=宋体,在[font=Calibri,JAVA[font=宋体,中的赋值
. C, n! R# u/ y$ a1 M[*,jfieldID sound = env->GetFieldID(cls, "a", "I");% w* k1 P; U7 n h( u% I
[*,//C[font=宋体,层给 [font=Calibri,JAVA[font=宋体,层赋值- M) T% c& v' H. g$ T9 _% c
[*,env->SetIntField(m_pdata, “a”, 5);0 [/ J# y/ I/ P p% a
[*,[font=宋体,注意第二个参数要对应JAVA[font=宋体,类定义时的声明不能搞错[font=Calibri,,[font=宋体,否则就会挂掉[font=Calibri,.
9 K; [' \( k+ X$ p+ K2 M[*,
9 d! \' P! s8 t' _8 a[*,- k6 `" m0 @9 R3 S$ k8 P
[*,6:[font=宋体,工程搭建# m* j5 n: H3 @/ _$ |+ R, t
[*,[font=宋体,首先编译引擎代码.
) A% Z5 i' R1 ~" t* d[*,[font=宋体,代码中新添加了GameClient[font=宋体,目录[font=Calibri,.' U0 b% ]) m) K2 J" V: e: I9 o* D
[*,[font=宋体,需要重新 Cmake
! V2 e# s8 E# c v/ M; S[*,[font=宋体,编译好代码后打开ZSDome
9 P/ l; H1 K8 e. |3 a. Y[*,[font=宋体,将GameClient[font=宋体,目录中的[font=Calibri,JNI [font=宋体,拷贝到[font=Calibri,ZSDome[font=宋体,工程目录下$ J, | w7 O5 e9 r ]6 n) H8 u
[*,[font=宋体,然后直接直接运行即可.
3 p: s; }, e8 a, o8 N: h[*,
2 }9 M* _% W( {7 [' W" [8 J[*,对应接口& e$ D$ \- _4 z
[*,Android
3 r5 D4 g+ c& {* z9 R) g[*,DemoInit----[font=宋体,初始化引擎2 m: \1 T4 F3 Z) t( O+ r
[*,Render----[font=宋体,渲染主逻辑1 _0 ]. O9 X: N- \, U
[*,
3 T- F: u" P9 v! C5 @# @( x[*,7[font=宋体,:[font=Courier New,BBZS[font=宋体,客户端的使用6 G. {) k$ k$ T0 X: n/ \
[*,[font=宋体,首先CMAKE GameClient[font=宋体,,完了之后,如果是[font=Courier New,windows[font=宋体,平台,会成[font=Courier New,libLordGameClient.lib& r, W+ R" N i3 M
[*,[font=宋体,如果是android[font=宋体,或者[font=Courier New,ios[font=宋体,,会生成[font=Courier New,libLordGameClient.a/ {4 g/ ~5 k I0 P. [4 L3 T
[*,+ b: J3 ]; |$ G( v2 z! w/ i8 q
[*,然后使用:
! i& S _# c' C) c2 S& u[*,[font=宋体,游戏主逻辑在Game[font=宋体,里面,提供初始化接口[font=Courier New,init()[font=宋体,,消息响应接口[font=Courier New,MsgOneHandle[font=宋体,和[font=Courier New,MsgTwoHandle[font=宋体,,主渲染和处理接口[font=Courier New,Logic(). U! d% k9 X0 o% F
[/list, [/td][/tr]# N) g" w* Y! e, `+ @
[/table] c$ y7 R' K C$ m! Y5 }6 [
! A9 n Y+ K/ Q4 N& S
6 ~: ?7 |5 @+ ]& O |