我正在制作一个简单的突破游戏,到目前为止我已经创建了球和玩家。我制作了球,使其移动到您触摸的位置,但我宁愿让它朝我滑动的方向移动。就像这样,玩家随着我的手指移动。这是我的 MainActivity 中的代码:
package com.example.breakout;
import android.os.Bundle;
import android.app.Activity;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class MainActivity extends Activity implements OnTouchListener, OnGestureListener{
BreakoutView bv;
GestureDetector gs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bv = new BreakoutView(this);
setContentView(bv);
bv.setOnTouchListener(this);
gs = new GestureDetector(MainActivity.this, this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
/*if(arg1.getY()<600){
bv.p1.x = arg1.getX();
bv.p1.y = 600;
}*/
return false;
}
@Override
public boolean onTouchEvent(MotionEvent me){
return gs.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
/*if(e2.getX()>e1.getX()){
//Move right
bv.p1.x = e2.getX();
}*/
return false;
}
@Override
public void onLongPress(MotionEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
float arg3) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onShowPress(MotionEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public boolean onSingleTapUp(MotionEvent arg0) {
// TODO Auto-generated method stub
return false;
}
}
所以,我尝试过的两种方法是onTouch和onFling。 onTouch 将我的玩家“传送”到我触摸的地方,这不是我想要的。 onFling 仅在我完成滑动后才移动我的玩家,因此这也不起作用。我的问题是,如何让它在我滑动手指时移动?我使用 onDown 吗?如有任何帮助,我们将不胜感激。
谢谢!
最佳答案
假设您设置了某种游戏循环,其中 UI 会定期更新:
/**
* Onclick event for Touch Screen
*/
@Override
public boolean onTouchEvent(MotionEvent input) {
if (input.getAction() == MotionEvent.ACTION_MOVE) {
float currX = input.getX();
float currY = input.getY();
if (!swiping) {
swiping = true;
swipeStartY = currY;
swipeStartX = currX;
}
if (swiping) {
double newDirection = Math.atan2((currY-ball.getY()),currX-ball.getX());
ball.setDirection(newDirection);
}
} else if (input.getAction() == MotionEvent.ACTION_UP) {
if (swiping) {
swiping = false;
}
}
}
这样,球的方向就会在游戏线程的每次更新时更新,并向您的手指移动(触摸事件 X/Y 位置)。我不确定你是如何设置你的绘图/物理/等的。所以我不能在这里提供有意义的函数调用。如果您需要对其进行修改,使其在抬起手指后沿直线滑动,然后存储初始 X/Y 点(在本例中为 swipeStartX/swipeStartY),并仅在您停止后设置新方向滑动。
编辑:
我应该提到,包含此代码的类定义如下:
public class GameView extends SurfaceView implements SurfaceHolder.Callback {
....
}
关于Java:突破游戏,滑动时移动玩家?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14608277/