我是数组列表的新手,我觉得这个问题会有点复杂。我正在尝试制作智能碰撞探测器。构造函数通过接收起始坐标并将它们添加到每个ArrayList来开始多边形。 AddVertex()方法为每个方法添加另一组坐标,End()方法在第一个坐标的位置添加另一对坐标。然后我有一个名为MouseCollision()的方法,它返回一个布尔值并测试鼠标是否在多边形内。如果点顺时针排列,则测试鼠标是否在形状内,但如果逆时针创建多边形,则将测试负形状的鼠标。我正在使用一个不等式系统来确定鼠标是否位于该行的正确一侧,它在该部分中变得复杂。
无论如何,这是Detector.java的全文:
package helpers;
import java.util.*;
import org.lwjgl.input.Mouse;
import static helpers.Artist.*;
public class Detector {
List<Float> pX, pY, b, m;
boolean colliding;
public Detector(float pX, float pY) {;
this.pX = new ArrayList<Float>();
this.pY = new ArrayList<Float>();
this.pX.add(pX);
this.pY.add(pY);
}
public void AddVertex(float pX, float pY) {
this.pX.add(pX);
this.pY.add(pY);
}
public void End() {
this.pX.add(pX.get(0));
this.pY.add(pY.get(0));
}
public boolean MouseColliding() {
colliding = true;
this.m = new ArrayList<Float>();
this.b = new ArrayList<Float>();
for (int i=0; i<pX.size(); i++) {
if (pX.get(i+1)-pX.get(i) == 0) {
if (pY.get(i+1)-pY.get(i) > 0) {
if (Mouse.getX() >= pX.get(i)) {}
else colliding = false;
} else {
if (Mouse.getX() <= pX.get(i)) {}
else colliding = false;
}
} else {
m.add(pY.get(i+1) - pY.get(i)/pX.get(i+1) - pX.get(i));
b.add(pY.get(i) - m.get(i)*pX.get(i));
if (pX.get(i+1)-pX.get(i) > 0) {
if (HEIGHT - Mouse.getY() <= m.get(i)*Mouse.getX()+b.get(i)) {}
else colliding = false;
} else {
if (HEIGHT - Mouse.getY() >= m.get(i)*Mouse.getX()+b.get(i)) {}
else colliding = false;
}
}
}
if (colliding) return true;
else return false;
}
}
每当我尝试运行程序时,我也会收到错误消息:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at helpers.Detector.MouseColliding(Detector.java:47)
at data.Boot.<init>(Boot.java:57)
at data.Boot.main(Boot.java:72)
我不知道我做错了什么,我去了第47行:b.add(pY.get(i) - m.get(i)*pX.get(i));
我不知道问题是什么。
我对ArrayLists了解,我是否需要制作Iterator?我该怎么做?
答案 0 :(得分:0)
将for循环更改为for (int i=0; i<pX.size()-1; i++) {
迭代应为
px.size() - 1
因此您的pX.get(i+1)
不会导致IndexOutOfBoundsException
例外。