基本信息介绍:

引擎框架: Quick-Cocos2dx-Community-3.6

测试机型: 魅族MX5

问题简介:

有拖动效果的物件,在拖动的工程中,手指不放,同时点击home键退到后台。

再返回应用,发现onTouchEnded里头有添加精灵的话,会变黑色。

问题排查:

首先排查生命周期。因为属于点击会被打断,会执行onTouchCancelled。所以真机调试发现先执行了onPause事件,再执行了onTouchCancelled。

这2个时间有一定的间隔时间,导致图片没加载进内存,但是缓存存在了。

问题思考:

1.能否调整生命周期

把onPause()打开,会有其他问题。

2.思考把onTouchCancel调用提前

  1. /****************************************************************************
  2. Copyright (c) 2010-2011 cocos2d-x.org
  3.  
  4. http://www.cocos2d-x.org
  5.  
  6. Permission is hereby granted, free of charge, to any person obtaining a copy
  7. of this software and associated documentation files (the "Software"), to deal
  8. in the Software without restriction, including without limitation the rights
  9. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. copies of the Software, and to permit persons to whom the Software is
  11. furnished to do so, subject to the following conditions:
  12.  
  13. The above copyright notice and this permission notice shall be included in
  14. all copies or substantial portions of the Software.
  15.  
  16. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. THE SOFTWARE.
  23. ****************************************************************************/
  24. package org.cocos2dx.lib;
  25.  
  26. import android.content.Context;
  27. import android.opengl.GLSurfaceView;
  28. import android.os.Handler;
  29. import android.os.Message;
  30. import android.util.AttributeSet;
  31. import android.util.Log;
  32. import android.view.KeyEvent;
  33. import android.view.MotionEvent;
  34. import android.view.inputmethod.InputMethodManager;
  35.  
  36. import com.babybus.app.App;
  37. import com.babybus.utils.GameCallbackManager;
  38. import com.babybus.utils.LogUtil;
  39.  
  40. public class Cocos2dxGLSurfaceView extends GLSurfaceView {
  41. // ===========================================================
  42. // Constants
  43. // ===========================================================
  44.  
  45. private static final String TAG = Cocos2dxGLSurfaceView.class.getSimpleName();
  46.  
  47. private final static int HANDLER_OPEN_IME_KEYBOARD = 2;
  48. private final static int HANDLER_CLOSE_IME_KEYBOARD = 3;
  49.  
  50. // ===========================================================
  51. // Fields
  52. // ===========================================================
  53.  
  54. // Static handler -> Potential leak!
  55. private static Handler sHandler;
  56.  
  57. private static Cocos2dxGLSurfaceView mCocos2dxGLSurfaceView;
  58. private static Cocos2dxTextInputWraper sCocos2dxTextInputWraper;
  59.  
  60. private Cocos2dxRenderer mCocos2dxRenderer;
  61. private Cocos2dxEditText mCocos2dxEditText;
  62.  
  63. // 记录当前点击事件的值
  64. private int[] touchIds;
  65. private float[] touchXs;
  66. private float[] touchYs;
  67.  
  68. // ===========================================================
  69. // Constructors
  70. // ===========================================================
  71.  
  72. public Cocos2dxGLSurfaceView(final Context context) {
  73. super(context);
  74.  
  75. this.initView();
  76. }
  77.  
  78. public Cocos2dxGLSurfaceView(final Context context, final AttributeSet attrs) {
  79. super(context, attrs);
  80.  
  81. this.initView();
  82. }
  83.  
  84. protected void initView() {
  85. this.setEGLContextClientVersion(2);
  86. this.setFocusableInTouchMode(true);
  87.  
  88. Cocos2dxGLSurfaceView.mCocos2dxGLSurfaceView = this;
  89. Cocos2dxGLSurfaceView.sCocos2dxTextInputWraper = new Cocos2dxTextInputWraper(this);
  90.  
  91. Cocos2dxGLSurfaceView.sHandler = new Handler() {
  92. @Override
  93. public void handleMessage(final Message msg) {
  94. switch (msg.what) {
  95. case HANDLER_OPEN_IME_KEYBOARD:
  96. if (null != Cocos2dxGLSurfaceView.this.mCocos2dxEditText && Cocos2dxGLSurfaceView.this.mCocos2dxEditText.requestFocus()) {
  97. Cocos2dxGLSurfaceView.this.mCocos2dxEditText.removeTextChangedListener(Cocos2dxGLSurfaceView.sCocos2dxTextInputWraper);
  98. Cocos2dxGLSurfaceView.this.mCocos2dxEditText.setText("");
  99. final String text = (String) msg.obj;
  100. Cocos2dxGLSurfaceView.this.mCocos2dxEditText.append(text);
  101. Cocos2dxGLSurfaceView.sCocos2dxTextInputWraper.setOriginText(text);
  102. Cocos2dxGLSurfaceView.this.mCocos2dxEditText.addTextChangedListener(Cocos2dxGLSurfaceView.sCocos2dxTextInputWraper);
  103. final InputMethodManager imm = (InputMethodManager) Cocos2dxGLSurfaceView.mCocos2dxGLSurfaceView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
  104. imm.showSoftInput(Cocos2dxGLSurfaceView.this.mCocos2dxEditText, 0);
  105. Log.d("GLSurfaceView", "showSoftInput");
  106. }
  107. break;
  108.  
  109. case HANDLER_CLOSE_IME_KEYBOARD:
  110. if (null != Cocos2dxGLSurfaceView.this.mCocos2dxEditText) {
  111. Cocos2dxGLSurfaceView.this.mCocos2dxEditText.removeTextChangedListener(Cocos2dxGLSurfaceView.sCocos2dxTextInputWraper);
  112. final InputMethodManager imm = (InputMethodManager) Cocos2dxGLSurfaceView.mCocos2dxGLSurfaceView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
  113. imm.hideSoftInputFromWindow(Cocos2dxGLSurfaceView.this.mCocos2dxEditText.getWindowToken(), 0);
  114. Cocos2dxGLSurfaceView.this.requestFocus();
  115. Log.d("GLSurfaceView", "HideSoftInput");
  116. }
  117. break;
  118. }
  119. }
  120. };
  121. }
  122.  
  123. // ===========================================================
  124. // Getter & Setter
  125. // ===========================================================
  126.  
  127. public static Cocos2dxGLSurfaceView getInstance() {
  128. return mCocos2dxGLSurfaceView;
  129. }
  130.  
  131. public static void queueAccelerometer(final float x, final float y, final float z, final long timestamp) {
  132. mCocos2dxGLSurfaceView.queueEvent(new Runnable() {
  133. @Override
  134. public void run() {
  135. Cocos2dxAccelerometer.onSensorChanged(x, y, z, timestamp);
  136. }
  137. });
  138. }
  139.  
  140. public void setCocos2dxRenderer(final Cocos2dxRenderer renderer) {
  141. this.mCocos2dxRenderer = renderer;
  142. this.setRenderer(this.mCocos2dxRenderer);
  143. }
  144.  
  145. private String getContentText() {
  146. return this.mCocos2dxRenderer.getContentText();
  147. }
  148.  
  149. public Cocos2dxEditText getCocos2dxEditText() {
  150. return this.mCocos2dxEditText;
  151. }
  152.  
  153. public void setCocos2dxEditText(final Cocos2dxEditText pCocos2dxEditText) {
  154. this.mCocos2dxEditText = pCocos2dxEditText;
  155. if (null != this.mCocos2dxEditText && null != Cocos2dxGLSurfaceView.sCocos2dxTextInputWraper) {
  156. this.mCocos2dxEditText.setOnEditorActionListener(Cocos2dxGLSurfaceView.sCocos2dxTextInputWraper);
  157. this.mCocos2dxEditText.setCocos2dxGLSurfaceView(this);
  158. this.requestFocus();
  159. }
  160. }
  161.  
  162. // ===========================================================
  163. // Methods for/from SuperClass/Interfaces
  164. // ===========================================================
  165.  
  166. @Override
  167. public void onResume() {
  168. this.queueEvent(new Runnable() {
  169. @Override
  170. public void run() {
  171. Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleOnResume();
  172. }
  173. });
  174.  
  175. this.setRenderMode(RENDERMODE_CONTINUOUSLY);
  176. super.onResume();
  177. }
  178.  
  179. @Override
  180. public void onPause() {
  181. this.queueEvent(new Runnable() {
  182. @Override
  183. public void run() {
  184. Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleOnPause();
  185. }
  186. });
  187. this.setRenderMode(RENDERMODE_WHEN_DIRTY);
  188. if(touchIds != null){
  189. this.queueEvent(new Runnable() {
  190. @Override
  191. public void run() {
  192. Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionCancel(touchIds, touchXs, touchYs);
  193. }
  194. });
  195. }
  196. // super.onPause();
  197. }
  198.  
  199. @Override
  200. public boolean onTouchEvent(final MotionEvent pMotionEvent) {
  201.  
  202. if (App.get().isLockGameTouch){
  203. return false;
  204. }
  205. // these data are used in ACTION_MOVE and ACTION_CANCEL
  206. final int pointerNumber = pMotionEvent.getPointerCount();
  207. final int[] ids = new int[pointerNumber];
  208. final float[] xs = new float[pointerNumber];
  209. final float[] ys = new float[pointerNumber];
  210.  
  211. for (int i = 0; i < pointerNumber; i++) {
  212. ids[i] = pMotionEvent.getPointerId(i);
  213. xs[i] = pMotionEvent.getX(i);
  214. ys[i] = pMotionEvent.getY(i);
  215. }
  216.  
  217. switch (pMotionEvent.getAction() & MotionEvent.ACTION_MASK) {
  218. case MotionEvent.ACTION_POINTER_DOWN:
  219. final int indexPointerDown = pMotionEvent.getAction() >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
  220. final int idPointerDown = pMotionEvent.getPointerId(indexPointerDown);
  221. final float xPointerDown = pMotionEvent.getX(indexPointerDown);
  222. final float yPointerDown = pMotionEvent.getY(indexPointerDown);
  223.  
  224. touchIds = ids;
  225. touchXs = xs;
  226. touchYs = ys;
  227.  
  228. this.queueEvent(new Runnable() {
  229. @Override
  230. public void run() {
  231. Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionDown(idPointerDown, xPointerDown, yPointerDown);
  232. }
  233. });
  234. break;
  235.  
  236. case MotionEvent.ACTION_DOWN:
  237. // there are only one finger on the screen
  238. final int idDown = pMotionEvent.getPointerId(0);
  239. final float xDown = xs[0];
  240. final float yDown = ys[0];
  241.  
  242. touchIds = ids;
  243. touchXs = xs;
  244. touchYs = ys;
  245.  
  246. this.queueEvent(new Runnable() {
  247. @Override
  248. public void run() {
  249. Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionDown(idDown, xDown, yDown);
  250. }
  251. });
  252. break;
  253.  
  254. case MotionEvent.ACTION_MOVE:
  255.  
  256. touchIds = ids;
  257. touchXs = xs;
  258. touchYs = ys;
  259.  
  260. this.queueEvent(new Runnable() {
  261. @Override
  262. public void run() {
  263. Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionMove(ids, xs, ys);
  264. }
  265. });
  266. break;
  267.  
  268. case MotionEvent.ACTION_POINTER_UP:
  269. final int indexPointUp = pMotionEvent.getAction() >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
  270. final int idPointerUp = pMotionEvent.getPointerId(indexPointUp);
  271. final float xPointerUp = pMotionEvent.getX(indexPointUp);
  272. final float yPointerUp = pMotionEvent.getY(indexPointUp);
  273.  
  274. touchIds = null;
  275. touchXs = null;
  276. touchYs = null;
  277. this.queueEvent(new Runnable() {
  278. @Override
  279. public void run() {
  280. Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionUp(idPointerUp, xPointerUp, yPointerUp);
  281. }
  282. });
  283. break;
  284.  
  285. case MotionEvent.ACTION_UP:
  286. // there are only one finger on the screen
  287. final int idUp = pMotionEvent.getPointerId(0);
  288. final float xUp = xs[0];
  289. final float yUp = ys[0];
  290. 290 touchIds = null;
  291. touchXs = null;
  292. touchYs = null;
  293. this.queueEvent(new Runnable() {
  294. @Override
  295. public void run() {
  296. Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionUp(idUp, xUp, yUp);
  297. }
  298. });
  299. break;
  300.  
  301. case MotionEvent.ACTION_CANCEL:
  302. touchIds = null;
  303. touchXs = null;
  304. touchYs = null;
  305. this.queueEvent(new Runnable() {
  306. @Override
  307. public void run() {
  308. // Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleActionCancel(ids, xs, ys);
  309. }
  310. });
  311. break;
  312. }
  313.  
  314. /*
  315. if (BuildConfig.DEBUG) {
  316. Cocos2dxGLSurfaceView.dumpMotionEvent(pMotionEvent);
  317. }
  318. */
  319. return true;
  320. }
  321.  
  322. /*
  323. * This function is called before Cocos2dxRenderer.nativeInit(), so the
  324. * width and height is correct.
  325. */
  326. @Override
  327. protected void onSizeChanged(final int pNewSurfaceWidth, final int pNewSurfaceHeight, final int pOldSurfaceWidth, final int pOldSurfaceHeight) {
  328. if(!this.isInEditMode()) {
  329. this.mCocos2dxRenderer.setScreenWidthAndHeight(pNewSurfaceWidth, pNewSurfaceHeight);
  330. String screenSize = ""+pNewSurfaceWidth+"|"+pNewSurfaceHeight;
  331. LogUtil.t("change===test2");
  332. GameCallbackManager.gameCallback("FOLD_SCREEN_CHANGE", "NEW_SCREEN_SIZE", screenSize);
  333. }
  334. }
  335.  
  336. @Override
  337. public boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) {
  338. switch (pKeyCode) {
  339. case KeyEvent.KEYCODE_BACK:
  340. Cocos2dxVideoHelper.mVideoHandler.sendEmptyMessage(Cocos2dxVideoHelper.KeyEventBack);
  341. case KeyEvent.KEYCODE_MENU:
  342. case KeyEvent.KEYCODE_DPAD_LEFT:
  343. case KeyEvent.KEYCODE_DPAD_RIGHT:
  344. case KeyEvent.KEYCODE_DPAD_UP:
  345. case KeyEvent.KEYCODE_DPAD_DOWN:
  346. case KeyEvent.KEYCODE_ENTER:
  347. case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
  348. case KeyEvent.KEYCODE_DPAD_CENTER:
  349. this.queueEvent(new Runnable() {
  350. @Override
  351. public void run() {
  352. Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);
  353. }
  354. });
  355. return true;
  356. default:
  357. return super.onKeyDown(pKeyCode, pKeyEvent);
  358. }
  359. }
  360.  
  361. // ===========================================================
  362. // Methods
  363. // ===========================================================
  364.  
  365. // ===========================================================
  366. // Inner and Anonymous Classes
  367. // ===========================================================
  368.  
  369. public static void openIMEKeyboard() {
  370. final Message msg = new Message();
  371. msg.what = Cocos2dxGLSurfaceView.HANDLER_OPEN_IME_KEYBOARD;
  372. msg.obj = Cocos2dxGLSurfaceView.mCocos2dxGLSurfaceView.getContentText();
  373. Cocos2dxGLSurfaceView.sHandler.sendMessage(msg);
  374. }
  375.  
  376. public static void closeIMEKeyboard() {
  377. final Message msg = new Message();
  378. msg.what = Cocos2dxGLSurfaceView.HANDLER_CLOSE_IME_KEYBOARD;
  379. Cocos2dxGLSurfaceView.sHandler.sendMessage(msg);
  380. }
  381.  
  382. public void insertText(final String pText) {
  383. this.queueEvent(new Runnable() {
  384. @Override
  385. public void run() {
  386. Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleInsertText(pText);
  387. }
  388. });
  389. }
  390.  
  391. public void deleteBackward() {
  392. this.queueEvent(new Runnable() {
  393. @Override
  394. public void run() {
  395. Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleDeleteBackward();
  396. }
  397. });
  398. }
  399.  
  400. private static void dumpMotionEvent(final MotionEvent event) {
  401. final String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
  402. final StringBuilder sb = new StringBuilder();
  403. final int action = event.getAction();
  404. final int actionCode = action & MotionEvent.ACTION_MASK;
  405. sb.append("event ACTION_").append(names[actionCode]);
  406. if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP) {
  407. sb.append("(pid ").append(action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT);
  408. sb.append(")");
  409. }
  410. sb.append("[");
  411. for (int i = 0; i < event.getPointerCount(); i++) {
  412. sb.append("#").append(i);
  413. sb.append("(pid ").append(event.getPointerId(i));
  414. sb.append(")=").append((int) event.getX(i));
  415. sb.append(",").append((int) event.getY(i));
  416. if (i + 1 < event.getPointerCount()) {
  417. sb.append(";");
  418. }
  419. }
  420. sb.append("]");
  421. Log.d(Cocos2dxGLSurfaceView.TAG, sb.toString());
  422. }
  423. }

经过试验,下面一种完美解决问题。

[COCOS2DX-LUA]0-006.cocos2dx中关于拖动屏幕物件,同时点击home键,返回后页面变黑的问题。的更多相关文章

  1. Cocos2dx+lua合适还是Cocos2dx+js合适?

    问题: 开发cocos2dx手游Cocos2dx+lua合适还是Cocos2dx+js合适 百牛信息技术bainiu.ltd整理发布于博客园 回答: 作者:廖宇雷链接:https://www.zhih ...

  2. cocos2d-x 3.0 在C++中调用lua函数

    代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 在上篇的基础上进行扩充. 写lua函数 local function process_packet(user_d ...

  3. cocos2d-x 3.0 在C++中调用lua函数(2)

    个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下: #ifndef __CC_LUA_STACKEX_H_ #define ...

  4. 解决 cocos2dx iOS/mac 设置纹理寻址模式后纹理变黑的问题

    sprite:getTexture():setTexParameters(gl.LINEAR,gl.LINEAR,gl.REPEAT,gl.REPEAT) 在安卓设备上,设置了纹理自定义寻址模式,纹理 ...

  5. 微信中使用popup等弹窗组件时点击输入框input键盘弹起导致IOS中按钮无效处理办法

    因为在IOS微信中在弹窗中使用input使键盘弹起,使弹窗的位置上移,当键盘关闭时页面还在上面,弹窗位移量也在上面,只有下拉才能回到原位,这样弹窗也消失了.我的处理办法就是在键盘弹起和消失的时候,让页 ...

  6. cocos2dx 3.0 scrollview 在android下面背景變綠色了

    在windows上面跑的是OK的,  在android下面跑的時候就變成這樣子了:

  7. 2、Cocos2dx 3.0游戏开发找小三之引擎简单介绍

    尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 引擎简单介绍 Cocos2d-x 的 ...

  8. cocos2d-x lua 内存回收

    使用cocos2d-x lua架构,游戏中存在两种内存回收方式. 1.cocos2d-x 本身内存回收 PS:假设在lua在创建一个类,继承cocos2d-x的一个类A,则该A也遵循cocos2d-x ...

  9. 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已 ...

随机推荐

  1. 数据可视化之powerBI入门(六)PowerQuery:横向/纵向追加数据

    https://zhuanlan.zhihu.com/p/64148432 上一篇文章都是在原表数据基础上的分分合合,但做数据分析的时候还经常需要在原有数据的基础上增加一些辅助数据,比如加入新列.新行 ...

  2. 数据可视化之DAX篇(二十三)ALLEXCEPT应用示例:更灵活的累计求和

    https://zhuanlan.zhihu.com/p/67441847 累计求和问题,之前已经介绍过(有了这几个公式,你也可以快速搞定累计求和),主要是基于比较简单的情形,针对所有的数据进行累计求 ...

  3. Angular 懒加载找不到模块问题解决方法

    问题: 懒加载无法找到模块 解决办法: 在app-routing.module.ts中引入该模块

  4. Vue小功能-视频播放之video.js

        最近在练手一个小项目,想给首页增加一个视频介绍(如下图).涉及到了vue视频播放的功能,所以在网上了解了一下.     相关的插件是Video.js,官网讲解比较详细,我罗列出来,可以根据自己 ...

  5. socket采用epoll编程demo

    epoll工作流程 首先,需要调用epoll_create创建epoll: 此后我们就可以进行socket/bind/listen: 然后调用epoll_ctl进行注册: 接下来,就可以通过一个whi ...

  6. nginx: command not found

    nginx 正常启动,可以访问服务器地址:welcome to nginx 使用nginx -t 等命令时 报错:nginx: command not found 这是环境变量未配置 配置环境变量 v ...

  7. 性能测试必备知识(2)- 查看 Linux 的 CPU 相关信息

    做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 查看系统 CPU 信息 cat /proc/ ...

  8. RocketMQ在面试中那些常见问题及答案+汇总

    0.汇总 RocketMQ入门到入土(一)新手也能看懂的原理和实战! RocketMQ入门到入土(二)事务消息&顺序消息 从入门到入土(三)RocketMQ 怎么保证的消息不丢失? Rocke ...

  9. 《Python测试开发技术栈—巴哥职场进化记》—前言

    写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...

  10. Oracle忘记用户名和密码以及管理员用户新增修改删除用户

    Oracle忘记密码: 1.以管理员身份登录,打开dos窗口,输入 sqlplus / as sysdba 回车 2.查看当前用户和状态 select username, account_status ...