Я делаю простую игру, в которой игрок рисует фигуры на экране. Точки пути хранятся в массиве и нарисованы в классе GameLoop. Я почти закончил, но теперь я понимаю, что я должен был сделать игру с мульти сенсорным входом, чтобы позволить двум игрокам рисовать фигуры в одно и то же время!Не знаете, как обращаться с несколькими касаниями
Я знаю, что мне нужно использовать event.Action_Down
для первого пальца и event.Action_Pointer_Down
для следующего пальца, но как мне обрабатывать точки всех фигур и рисунок пути? Могу ли я использовать один массив, или мне нужен массив для каждого. Мне кажется, что мне нужно удвоить весь код в классе GameLoop, чтобы проверить оба пути? Мой вопрос может быть немного неясным, но это то, что я чувствую прямо сейчас! Некоторые советы были бы хороши!
Это код, как я обрабатывать одинарные события прикосновения и передавать все точки в массив:
@Override
public boolean onTouch(View v, MotionEvent event) {
synchronized (gameLoop) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
gameLoop.touchDownX = event.getX();
gameLoop.touchDownY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
Point point = new Point();
point.x = (int) event.getX();
point.y = (int) event.getY();
gameLoop.addPoints(point);
gameLoop.startDrawLine = true;
break;
case MotionEvent.ACTION_UP:
Point point2 = new Point();
point2.x = (int) gameLoop.touchDownX;
point2.y = (int) gameLoop.touchDownY;
gameLoop.addPoints(point2); // Add last point to close shape
gameLoop.pathOK = true;
gameLoop.touchActionUp = true;
break;
}
}
return true;
}
EDIT: Это было сложно! Я нашел код, который немного изменил. Мне нужно создать массивList для каждого человека, который начинает рисовать фигуру на экране. Одновременно должно быть возможно, чтобы несколько игроков рисовали фигуры. Все значения Point должны храниться внутри массива player
. Наконец, все player
arrayList должны храниться внутри основного списка элементов массива, называемого players
. Могу ли я помочь решить эту проблему? Я не знаю, с чего начать.
Я объявил мои списки в классе GameLoop:
// Lists to handle multiple touch input
players = new ArrayList<List<Point>>(); // Main arrayList
player = new ArrayList<Point>(); // Inner arrayList
ниже код находится в классе MainActivity и я использую объект GameLoop
как gameLoop
общаться с методами GameLoop.
@Override
public boolean onTouch(View v, MotionEvent event) {
synchronized (gameLoop) {
for(int i=0; i<event.getPointerCount(); i++) { // Numbers of pointers on screen
int id = event.getPointerId(i);
// Check if fingers touch screen
if (event.getActionIndex() == i && (event.getActionMasked() == MotionEvent.ACTION_POINTER_UP || event.getActionMasked() == MotionEvent.ACTION_UP)) {
}
// Check if fingers leave the screen
else if (event.getActionIndex() == i && (event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN || event.getActionMasked() == MotionEvent.ACTION_DOWN)) {
}
// Check movement on screen
else {
}
}
}
return true;
}
Спасибо за информацию! Кажется очень сложным :(Я рассмотрю более подробно. –
Не так сложно. У вас есть история местоположений движения размером 'getHistorySize()', и в каждой записи истории у вас есть указатели 'getPointerCount()'. Тогда вы может видеть местоположение каждого указателя в заданном событии истории с помощью 'getHistoricalX (указатель, история)'. Все, что вам нужно сделать, - поместить правильное событие в правильный список, за указатель, и это то, что 'HashMap' для – tbkn23
Привет, снова! Я пытаюсь понять ваш пример кода. Могу ли я использовать списки массивов вместо hashMaps? –