Я учился (медленно), как программировать игры для Android, используя Java и Android Studio. Моим основным источником обучения были учебные пособия, расположенные на учебном веб-сайте Kilobolt. . Я нашел их чрезвычайно полезными, но поскольку они представляют собой учебные пособия по Android ADT для Eclipse, и им уже 3 года, мне пришлось много учиться в каждом разделе, чтобы изучить Android Studio (огромный процесс).
Я обнаружил, что в основном логика в учебнике была надежной. Моя проблема в том, что в классе SingleTouchHandler платформы, предоставляемой Kilobolt, 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, и при желании она легко доступна на веб-сайте 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 и разработка игр было чертовски сложным процессом, но я определенно становлюсь лучше.