gpt4 book ai didi

java - 不确定如何处理多点触控

转载 作者:太空狗 更新时间:2023-10-29 15:10:58 25 4
gpt4 key购买 nike

我正在做一个简单的游戏,玩家可以在屏幕上绘制形状。路径的点存储在一个数组中,并在类 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;
}

编辑:这很复杂!我找到了一些我修改了一点的代码。我需要为每个开始在屏幕上绘制形状的人创建一个 arrayList。必须有几个玩家可以同时绘制形状。所有 Point 值都应存储在 player arrayList 中。最后,所有playerarrayList 都应该存储在名为players 的主arrayList 中。我能得到一些帮助来解决这个问题吗?我不知道如何开始。

我已经在 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;
}

最佳答案

看看这个例子,它一次处理所有指针的运动历史:

void printSamples(MotionEvent ev) {
final int historySize = ev.getHistorySize();
final int pointerCount = ev.getPointerCount();
for (int h = 0; h < historySize; h++) {
System.out.printf("At time %d:", ev.getHistoricalEventTime(h));
for (int p = 0; p < pointerCount; p++) {
System.out.printf(" pointer %d: (%f,%f)",
ev.getPointerId(p), ev.getHistoricalX(p, h), ev.getHistoricalY(p, h));
}
}

System.out.printf("At time %d:", ev.getEventTime());
for (int p = 0; p < pointerCount; p++) {
System.out.printf(" pointer %d: (%f,%f)",
ev.getPointerId(p), ev.getX(p), ev.getY(p));
}
}

您必须为多个指针创建多个数组。您可以使用 HashMap<Integer, List<Point>>从指针 ID 映射到 Point 的列表s 代表那个指针。

这是 MotionEvent 的指南以我上面发布的示例为例:

http://developer.android.com/reference/android/view/MotionEvent.html

编辑:尝试将代码与您的需求相匹配:

private HashMap<Integer, List<Point>> myPoints;

private void addPoints(MotionEvent ev) {
final int historySize = ev.getHistorySize();
final int pointerCount = ev.getPointerCount();
for (int h = 0; h < historySize; h++) {
for (int p = 0; p < pointerCount; p++) {
addPoint(ev.getPointerId(p), new Point(ev.getHistoricalX(p, h), ev.getHistoricalY(p, h)));
}
}

System.out.printf("At time %d:", ev.getEventTime());
for (int p = 0; p < pointerCount; p++) {
addPoint(ev.getPointerId(p), new Point(ev.getHistoricalX(p, h), ev.getHistoricalY(p, h)));
}
}

private void addPoint(Integer pointerId, Point point) {
List<Point> points = myPointers.get(pointerId);

if (points == null) {
points = new LinkedList<Point>();
myPointers.put(pointerId, points);
}

myPointers.get(pointerId).add(point);
}

关于java - 不确定如何处理多点触控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16494786/

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