Java: игра в стиле Breakout, переместить игрока, когда я проведу пальцем?
Я делаю простую игру Breakout, и до сих пор я создал мяч и игрока. Я сделал мяч таким, чтобы он двигался в положение, к которому вы прикоснулись, но я бы предпочел, чтобы он двигался в направлении, в котором я провожу пальцем. Как и в, игрок движется вместе с моим пальцем. Вот код, который я имею в моей 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? Любая помощь приветствуется.
Спасибо!
1 ответ
Предполагая, что у вас настроен игровой цикл, в котором пользовательский интерфейс обновляется через определенные промежутки времени:
/**
* 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 {
....
}