我有一个扩展SurfaceView的类。到目前为止,我的代码让玩家跟随我的手指,但它也允许玩家"传送"到手指所在的任何地方,我不希望这样。
@Override
public boolean onTouchEvent(MotionEvent event) {
pointerX = (int)event.getX();
pointerY = (int)event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (!player.getPlaying()) {
player.setPlaying(true);
}
if (!player.playerAlive) {
if ((pointerX >= rescaleX(600) && pointerX <= rescaleX(842)) && (pointerY >= rescaleY(900) && pointerY <= rescaleY(1142))) {
//newGame();
player.setX(600);
player.setY(900);
}
}
if (player.playerAlive) {
// player.move(true);
}
break;
case MotionEvent.ACTION_MOVE:
if (!player.getPlaying()){
player.setPlaying(true);
player.move(true);
} else {
player.move(true);
}
break;
case MotionEvent.ACTION_UP:
//player.move(true);
if (!player.playerAlive) {
if ((pointerX >= rescaleX(600) && pointerX <= rescaleX(842)) && (pointerY >= rescaleY(900) && pointerY <= rescaleY(1142))) {
newGame();
player.setX(600);
player.setY(900);
}
}
break;
}
return true;
//return super.onTouchEvent(event);
}
以下是播放器类中的move()方法:
public void move(boolean b) {
if(b){
if((GamePanel.pointerX * GamePanel.WIDTH / MainActivity.dispX) - 141 >= 1380 - getWidth()){setX(1380-getWidth());}
if((GamePanel.pointerY * GamePanel.HEIGHT / MainActivity.dispY) - 141 >= 1880 - getHeight()){setY(1880 - getHeight());}
setX((int) ((GamePanel.pointerX * GamePanel.WIDTH / MainActivity.dispX) - 141));
setY((int) ((GamePanel.pointerY * GamePanel.HEIGHT / MainActivity.dispY) - 141));
}
不要"直接"将手指输入转换为移动事物的"逻辑"。
您应该让onTouchEvent
方法读取手指按压位置的X和Y值,然后将其传递给某些逻辑。然后,该逻辑应该决定是否应该将该信息传递给新方法moveCharacterTo(x,y)
我上面提到的"逻辑"可能是几件事,你可以使用策略模式来决定应该使用什么"策略/策略(算法)"来处理屏幕。或者,你可以只使用一个带有方法的类来比较触摸事件,看看它们是否"接近"角色,然后做出相应的反应。