Как реализовать Swipe в игре для Андроид без просмотра
Я пытаюсь сделать змею игру на Android, в которой змея движется с жестами салфетки.
Я пробовал много способов сделать это, но ни один из них не похоже на работу для меня. Я не реализовал представление-это будет проблемой?
Это пример, который я попытался реализовать на основе предыдущего вопроса StackOverflow -Android: как обрабатывать справа налево салфетки жесты.
Я создал OnSwipeTouchListener.java как проинструктированный. Однако я столкнулся с небольшой проблемой с использованием.
В GameScreen.java (где все события касания идут), я добавил Это в качестве примера -
onSwipeTouchListener = new OnSwipeTouchListener() {
public void onSwipeTop() {
Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show();
}
public void onSwipeRight() {
Toast.makeText(MyActivity.this, "right", Toast.LENGTH_SHORT).show();
}
public void onSwipeLeft() {
Toast.makeText(MyActivity.this, "left", Toast.LENGTH_SHORT).show();
}
public void onSwipeBottom() {
Toast.makeText(MyActivity.this, "bottom", Toast.LENGTH_SHORT).show();
}
};
imageView.setOnTouchListener(onSwipeTouchListener);
Это вызывает кучу ошибок (в основном с участием imageView), и ни одна из них не может быть решена.
у кого-нибудь есть альтернативная реализация салфетки, специфичная для моего случая?
4 ответов
Если у вас есть доступ к сенсорным событиям, попробуйте это
int len = touchEvents.size();
Graphics g = game.getGraphics();
for (int i = 0; i < len; i++) {
TouchEvent event = touchEvents.get(i);
if (event.type == TouchEvent.TOUCH_DOWN)
{
x1=event.x;
y1=event.y;
}
if (event.type == TouchEvent.TOUCH_UP)
{
x2=event.x;
y2=event.y;
dx=(x2-x1);
dy=(y2-y1);
tu=1;
}
if((tu==1) && (Math.abs(dx)>Math.abs(dy)))
{
if(dx>0)
{
if(!(robot.getSpeedX()<0))
{
robot.stop();
robot.moveRight();
}
}
else
{
if(!(robot.getSpeedX()>0))
{
robot.stop();
robot.moveLeft();
}
}
tu=0;
}
if((tu==1) && (Math.abs(dx)<=Math.abs(dy)))
{
if(dy>0)
{
if(!(robot.getSpeedY()<0))
{
robot.stop();
robot.moveDown();
}
}
else
{
if(!(robot.getSpeedY()>0))
{
robot.stop();
robot.moveUp();
}
}
tu=0;
}
Вы можете сделать это двумя способами:
Вариант 1:
в базовом классе активности вашей игры:
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
try {
float slope = (e1.getY() - e2.getY()) / (e1.getX() - e2.getX());
float angle = (float) Math.atan(slope);
float angleInDegree = (float) Math.toDegrees(angle);
// left to right
if (e1.getX() - e2.getX() > 20 && Math.abs(velocityX) > 20) {
if ((angleInDegree < 45 && angleInDegree > -45)) {
//code for left to right swipe should go here
}
// right to left fling
} else if (e2.getX() - e1.getX() > 20
&& Math.abs(velocityX) > 20) {
if ((angleInDegree < 45 && angleInDegree > -45)) {
//code for right to left swipe should go here
}
}
return true;
} catch (Exception e) {
// nothing
}
return false;
}
}
затем вы можете зарегистрировать любой вид для получения / прослушивания жестов:
final GestureDetector gestureDetector = new GestureDetector(new MyGestureDetector());
gameView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) return false;
return false;
}
});
//the parent layout
findViewById(R.id.parent_layout).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) return false;
return false;
}
});
//an image view
findViewById(R.id.image_view).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) return false;
return false;
}
});
Вариант 2:
Если класс GameScreen напрямую имеет доступ к сенсорным событиям, вы можете прочитать их и реализовать логику действий салфетки. Код, подобный Ответ Мустафы газара.
вы должны опубликовать свой GameScreen как Нана Гарти
если у вас есть доступ к сенсорным данным, Вы можете сделать что-то вроде следующего
private static final int DEFAULT_THRESHOLD = 36;// Better to be something in dps.
... = new View.OnTouchListener() {
int initialX = 0;
int initialY = 0;
final float slop = ViewConfiguration.get(context).getScaledTouchSlop();
public boolean onTouch(final View view, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
initialX = (int) event.getX();
initialY = (int) event.getY();
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
int currentX = (int) event.getX();
int currentY = (int) event.getY();
int offsetX = currentX - initialX;
int offsetY = currentY - initialY;
if (Math.abs(offsetX) > slop) {
if (offsetX > DEFAULT_THRESHOLD) {
// TODO :: Do Right to Left action!
} else if (offsetX < -DEFAULT_THRESHOLD) {
// TODO :: Do Left to Right action!
}
}
if (Math.abs(offsetY) > slop) {
if (offsetY > DEFAULT_THRESHOLD) {
// TODO :: Do Bottom to Top action!
} else if (offsetY < -DEFAULT_THRESHOLD) {
// TODO :: Do Top to Bottom action!
}
}
} else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
// Do nothing!
}
};
хорошая вещь об этой реализации заключается в том, что пользователю не придется снимать руку с экрана, контролируя направление змеи.
поместите супер методы в свой код, например:
public void onSwipeTop() {
super.onSwipeTop();
Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show();
}