android 2D游戏开发,引擎设计(六) 画面平移晃动与平移边界问题
2013-05-31 14:26
731 查看
舞台绘画时屏幕监听事件加入同步机制
绘制时代码
监听事件代码
关于平移的算法如上图
绘制的时候进行偏移例如一个点
synchronized (stage.getSynLock())
绘制时代码
// 绘制舞台上场景中所有的图层和所有的精灵 try { //绘制时 平移不晃动 synchronized (stage.getSynLock()) { stage.draw(gameCanvas, stage); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
监听事件代码
/**屏幕触摸监听*/ public boolean onTouch(View view, MotionEvent e) { // 绘制时 同步坐标系 使绘制平移不晃动 synchronized (stage.getSynLock()) { //....平移精灵坐标 } }
关于平移的算法如上图
public class GameStageTouchListen implements OnTouchListener { /**舞台**/ private GameStage stage; /**手势**/ private GestureDetector mGestureDetector; /** * 需要获得舞台的引用 * @param gameStage */ public GameStageTouchListen(GameStage gameStage) { super(); this.stage = gameStage; mGestureDetector = new GestureDetector(stage, mOnGestureListener); } /**屏幕上被按下坐标X*/ private float down_x; /**屏幕上被按下坐标Y*/ private float down_y; /**屏幕上手势滑动的当前坐标X*/ private float move_x; /**屏幕上手势滑动的当前坐标Y*/ private float move_y; /**屏幕上点击弹起的坐标X*/ private float up_x; /**屏幕上点击弹起的坐标Y*/ private float up_y; /**记录当前从点击开始偏移的坐标X*/ public float shift_x; /**记录当前从点击开始偏移的坐标Y*/ public float shift_y; /**记录上一次偏移的坐标X*/ public float last_shift_x; /**记录上一次偏移的坐标Y*/ public float last_shift_y; /**获得当前从点击开始偏移的坐标X*/ public float getShift_x() { return shift_x; } /**获得当前从点击开始偏移的坐标Y*/ public float getShift_y() { return shift_y; } /**屏幕触摸监听*/ public boolean onTouch(View view, MotionEvent e) { // 绘制时 同步坐标系 使绘制平移不晃动 synchronized (stage.getSynLock()) { //获得可以向右偏移的最大值 int rectSizeX = stage.getConfig().getStageMaxWidth() - stage.getConfig().getScreenWidth(); //获得可以向下偏移的最大值 int rectSizeY = stage.getConfig().getStageMaxHeight() - stage.getConfig().getScreenHeight(); switch (e.getAction()) { case MotionEvent.ACTION_DOWN: //如果是按下 记录按下的 x y坐标 down_x = e.getX(); down_y = e.getY(); break; case MotionEvent.ACTION_MOVE: //记录当前移动的X Y坐标 move_x = e.getX(); move_y = e.getY(); //计算当前移动的X Y坐标与按下的位置偏移计算 shift_x = move_x - down_x; shift_y = move_y - down_y; System.out.println("已经移动了:" + (last_shift_x + shift_x) + " 边界:" + rectSizeX); //如果向左超出 以X轴为例 为了锁定不超左边 偏移值last_shift_x+shift_x=0 ; //所以last_shift_x = -shift_x; if (last_shift_x + shift_x > 0) last_shift_x = -shift_x; if (last_shift_y + shift_y > 0) last_shift_y = -shift_y; //如果背景比手机屏幕还小 if (rectSizeX < 0) { //锁定左边界 last_shift_x = -shift_x; //如果超出右边界 } else if (-(last_shift_x + shift_x) > rectSizeX) { //锁定右边界 shift_x = 0; last_shift_x = -rectSizeX; } if (rectSizeY < 0) { last_shift_y = -shift_y; } else if (-(last_shift_y + shift_y) > rectSizeY) { shift_y = 0; last_shift_y = -rectSizeY; } break; case MotionEvent.ACTION_UP: //记录弹起的X Y坐标 up_x = e.getX(); up_y = e.getY(); //记录每次按下到弹起 后的偏移值 注意+= last_shift_x += up_x - down_x; last_shift_y += up_y - down_y; //锁定 最大右边界 锁定下边界 if (rectSizeX < 0) { last_shift_x = -shift_x; } if (last_shift_x + shift_x > 0) last_shift_x = 0; if (last_shift_y + shift_y > 0) last_shift_y = 0; if (rectSizeX < 0) { last_shift_x = 0; } else if (-(last_shift_x + shift_x) > rectSizeX) last_shift_x = -rectSizeX; if (rectSizeY < 0) { last_shift_y = 0; } else if (-(last_shift_y + shift_y) > rectSizeY) last_shift_y = -rectSizeY; shift_x = 0; shift_y = 0; break; default: break; } return mGestureDetector.onTouchEvent(e) || true; } } private OnGestureListener mOnGestureListener = new OnGestureListener() { public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub // Toast.makeText(context,""+e.getX()+" "+e.getY(),3).show(); return false; } public boolean onFling(MotionEvent arg0, MotionEvent e, float arg2, float arg3) { // TODO Auto-generated method stub // Toast.makeText(context,""+e.getX()+" "+e.getY(),3).show(); return false; } public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } public boolean onScroll(MotionEvent arg0, MotionEvent e, float arg2, float arg3) { // TODO Auto-generated method stub return false; } public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } }; }
绘制的时候进行偏移例如一个点
public void drawPoint(double x,double y,Paint paint){ canvas.drawPoint((float)setTranslateX(x),(float)setTranslateY(y),paint); } public float setTranslateX(double x) { return (float) (x + screenTouch.shift_x + screenTouch.last_shift_x); } public float setTranslateY(double y) { return (float) (y + screenTouch.shift_y + screenTouch.last_shift_y); }
相关文章推荐
- android 2D游戏开发,引擎设计(四) 造型类Model的设计。简单进度条
- android 2D游戏开发,引擎设计(五) 扮演者追加扮演者BUG ConcurrentModificationException
- android 2D游戏开发,引擎设计(二)脚本思考
- android 2D游戏开发,引擎设计(一) 基本构思
- android 2D游戏开发,引擎设计(三) 实验脚本编写与纸娃娃系统
- Android游戏开发中使用Libgdx引擎遇到的问题及解决办法汇总
- cocos2d-x(quick--cocos2d-x)引擎开发的游戏在android平台上,锁屏,按HOME键,重反游戏后黑屏问题
- 十五开源的Android(2D或3D)Android开发游戏引擎
- 【读书笔记《Android游戏编程之从零开始》】8.Android 游戏开发常用的系统控件(系统控件常见问题)
- Android 2D游戏引擎AndEngine配置环境
- 【Android2D游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
- Android 3D游戏开发(高级篇)——Opengl ES游戏引擎实现(送源代码)
- android 2D 游戏的开发的方法
- Android/Ophone平台2D游戏引擎实现系列文章 推荐
- Android学习 游戏开发之打地鼠(一,需求分析与设计)
- Android游戏开发学习之引擎用法实例详解
- Android游戏开发引擎libGDX系列教程(一) -- 初识libGDX
- Android游戏开发视频教程下载(Android4.3、Cocos2d-x、Untity2D/3D、跨平台引擎技术)
- Android 游戏开发中横竖屏切换问题