您的位置:首页 > 移动开发 > Android开发

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐