gpt4 book ai didi

java - ACTION_UP 不起作用,但 ACTION_DOWN 工作正常

转载 作者:行者123 更新时间:2023-12-02 04:28:58 25 4
gpt4 key购买 nike

我一直在(慢慢地)学习如何使用 Java 和 Android Studio 编写 Android 游戏。我的主要学习来源是遵循 Kilobolt Tutorial Website 上的教程。 。我发现这些非常有帮助,但因为它们是关于 Eclipse 的 Android ADT 的教程,而且已经有 3 年历史了,所以我必须在每个部分进行大量学习才能学习 Android Studio(一个巨大的过程)。

我发现本教程的逻辑大部分都很扎实。我的问题是,在Kilobolt提供的框架的SingleTouchHandler类中,ACTION_UP似乎不起作用。这是输入类:

public interface Input {

public static class TouchEvent {
public static final int TOUCH_DOWN = 0;
public static final int TOUCH_UP = 1;
public static final int TOUCH_DRAGGED = 2;
public static final int TOUCH_HOLD = 3;

public int type;
public int x, y;
public int pointer;

}

public boolean isTouchDown(int pointer);

public int getTouchX(int pointer);

public int getTouchY(int pointer);

public List<TouchEvent> getTouchEvents();

}

这是它的实现:

public class SingleTouchHandler implements TouchHandler {
boolean isTouched;
int touchX;
int touchY;
Pool<TouchEvent> touchEventPool;
List<TouchEvent> touchEvents = new ArrayList<TouchEvent>();
List<TouchEvent> touchEventsBuffer = new ArrayList<TouchEvent>();
float scaleX;
float scaleY;

public SingleTouchHandler(View view, float scaleX, float scaleY) {
PoolObjectFactory<TouchEvent> factory = new PoolObjectFactory<TouchEvent>() {
@Override
public TouchEvent createObject() {
return new TouchEvent();
}
};
touchEventPool = new Pool<TouchEvent>(factory, 100);
view.setOnTouchListener(this);

this.scaleX = scaleX;
this.scaleY = scaleY;
}

@Override
public boolean onTouch(View v, MotionEvent event) {
synchronized(this) {
TouchEvent touchEvent = touchEventPool.newObject();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touchEvent.type = TouchEvent.TOUCH_DOWN;
isTouched = true;
break;
case MotionEvent.ACTION_MOVE:
touchEvent.type = TouchEvent.TOUCH_DRAGGED;
isTouched = true;
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
touchEvent.type = TouchEvent.TOUCH_UP;
isTouched = false;
break;
}

touchEvent.x = touchX = (int)(event.getX() * scaleX);
touchEvent.y = touchY = (int)(event.getY() * scaleY);
touchEventsBuffer.add(touchEvent);

return true;
}
}

@Override
public boolean isTouchDown(int pointer) {
synchronized(this) {
if(pointer == 0)
return isTouched;
else
return false;
}
}

@Override
public int getTouchX(int pointer) {
synchronized(this) {
return touchX;
}
}

@Override
public int getTouchY(int pointer) {
synchronized(this) {
return touchY;
}
}

@Override
public List<TouchEvent> getTouchEvents() {
synchronized(this) {
int len = touchEvents.size();
for( int i = 0; i < len; i++ )
touchEventPool.free(touchEvents.get(i));
touchEvents.clear();
touchEvents.addAll(touchEventsBuffer);
touchEventsBuffer.clear();
return touchEvents;
}
}
}

同样,这些是由 Kilobolt 的好人 James Cho 提供的框架,如果需要,可以在 Kilobolt 网站上轻松获得。

在我的实现中:TOUCH_DOWN(用于表示任何 ACTION_DOWN 用法的变量)工作正常。但是,TOUCH_UP(对于 ACTION_UP)根本不起作用。这是我在游戏更新功能中使用的代码块:

    int len = touchEvents.size();
for (int i = 0; i < len; i++) {
TouchEvent event = (TouchEvent) touchEvents.get(i);
if (event.type == TouchEvent.TOUCH_DOWN) {



}

if (event.type == TouchEvent.TOUCH_UP) {
if (inBounds(event, 190, 350, 100, 100)) {

game.setScreen(new Menu(game));
}
}
}

在我上面的代码中,当触摸离开屏幕时,TOUCH_UP 应该允许我的游戏状态更改为菜单屏幕。然而,什么也没有发生。

如果我将 game.setScreen(new Menu(game)); 放在 if 语句中:

if (event.type == TouchEvent.TOUCH_DOWN) 它工作正常。

这是代码中的错误还是我对 ACTION_UP 和其他操作的工作方式有误解?我使用 Samsung Galaxy S5 进行测试。

感谢您的帮助。学习 Android Studio 和游戏开发是一个艰巨的过程,但我肯定会变得更好。

最佳答案

您可能在 ACTION_DOWN 上返回 false

ACTION_UP 仅当您在 ACTION_DOWN 事件上返回 true 时才起作用。

关于java - ACTION_UP 不起作用,但 ACTION_DOWN 工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31754663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com