Java游戏光线投射:直线和矩形之间的最近交点
我的游戏有问题。我想做的是画一条线,如果这条线与周围环境相交,它会计算出周围环境与玩家之间的最短距离,并放置一个红点(见图) 当我用一行代码运行我的程序时,它工作得很好,但是当我把代码行发送到周围的所有角落时,有些代码行会穿过周围的环境。 (抱歉英语不好) 附言。 直线:马里奥和周围点之间的直线 线条sur:描述边界或周围环境的线条 我正试着做这样的事情 有人知道这里出了什么问题吗 这是我的密码Java游戏光线投射:直线和矩形之间的最近交点,java,raycasting,Java,Raycasting,我的游戏有问题。我想做的是画一条线,如果这条线与周围环境相交,它会计算出周围环境与玩家之间的最短距离,并放置一个红点(见图) 当我用一行代码运行我的程序时,它工作得很好,但是当我把代码行发送到周围的所有角落时,有些代码行会穿过周围的环境。 (抱歉英语不好) 附言。 直线:马里奥和周围点之间的直线 线条sur:描述边界或周围环境的线条 我正试着做这样的事情 有人知道这里出了什么问题吗 这是我的密码 public void Lighting(){ ListIter
public void Lighting(){
ListIterator<Surroundings> surrounding = m.getSurrounding();
Line.clear();
LineSur.clear();
Point.clear();
rememDistance=1500;
while (surrounding.hasNext() ){
Surroundings rectangle = surrounding.next();
Rectangle sur = new Rectangle((int) rectangle.grootte().getX(),(int) rectangle.grootte().getY()-13,(int) rectangle.grootte().getWidth(),(int) rectangle.grootte().getHeight());
Line.add(new Lines((int) sur.getX() , (int) sur.getY() , (int) sur.getX() , (int) (sur.getY()+sur.getHeight())));
Line.add(new Lines((int) sur.getX() , (int) sur.getY() , (int) (sur.getX()+sur.getWidth()), (int) sur.getY()));
Line.add(new Lines((int) (sur.getX()+sur.getWidth()), (int) (sur.getY()+sur.getHeight()), (int) (sur.getX()+sur.getWidth()), (int) sur.getY()));
Line.add(new Lines((int) (sur.getX()+sur.getWidth()), (int) (sur.getY()+sur.getHeight()), (int) sur.getX() , (int) (sur.getY()+sur.getHeight())));
LineSur.add(new LinesSur((int) m.player.getxPositie(), (int) m.player.getyPositie(), (int) sur.getX() , (int) sur.getY()));
LineSur.add(new LinesSur((int) m.player.getxPositie(), (int) m.player.getyPositie(), (int) (sur.getX()+sur.getWidth()), (int) sur.getY()));
LineSur.add(new LinesSur((int) m.player.getxPositie(), (int) m.player.getyPositie(), (int) sur.getX() , (int) (sur.getY()+sur.getHeight())));
LineSur.add(new LinesSur((int) m.player.getxPositie(), (int) m.player.getyPositie(), (int) (sur.getX()+sur.getWidth()), (int) (sur.getY()+sur.getHeight())));
}
//Problem is probably coming from these for loops
int distance=0;
for(int i=0;i < LineSur.size();i++){
for(int j=0;j < Line.size();j++){
Line2D.Double lineI = LineSur.get(i).points();
if(lineI.intersectsLine(Line.get(j).points())){
Point2D IntPoint = getIntersection(Line.get(j).points(),lineI);
Point.add(new Points((int) IntPoint.getX(),(int) IntPoint.getY()));
distance = (int) Point.get(Point.size()-1).point2D().distance(m.player.getxPositie(), m.player.getyPositie());
if(rememDistance > distance){
rememDistance = distance;
System.out.println(rememDistance);
Point.get(Point.size()-1).distance= rememDistance;
}
else{Point.remove((Point.size()-1));}
}
}
for(int k=0;k < Point.size();k++){
if(rememDistance == Point.get(k).distance){
Point.get(k).shortest=true;}
}
rememDistance = 1500;
}
for(int i=0;i < Point.size();i++){
if(Point.get(i).shortest==false){Point.remove(i);}
}
}
您正在尝试执行光线投射。如果您的代码没有检测到第一个找到的元素,那是因为冲突检测中出现了一些错误:要么周围环境太小,无法执行检测步骤,要么您有一些更严重的错误。
rectangle.grootte().getY()-13
13有什么意义?@AndyTurner是以前错误的一个快速修复程序,仍然需要修复那个好的调用,但它没有什么特别之处。所有红点都位于矩形上的事实意味着相交逻辑是正确的;它只是检测到最短的距离,而不是最短的距离。我不确定,但我认为for loop overk
应该在当前包含它的循环之外。@and yturner它需要在那里,因为来自mario的每一行都需要一个红点。您正在尝试执行光线投射。如果您的代码没有检测到第一个找到的元素,那是因为冲突检测中出现了一些错误:要么周围环境太小,无法执行检测步骤,要么您有一些更严重的错误。rectangle.grootte().getY()-13
13有什么意义?@AndyTurner是以前错误的一个快速修复程序,仍然需要修复那个好的调用,但它没有什么特别之处。所有红点都位于矩形上的事实意味着相交逻辑是正确的;它只是检测到最短的距离,而不是最短的距离。我不确定,但我认为for循环overk
应该在当前包含它的循环之外。@而yturner它需要在那里,因为来自mario的每一行都需要一个红点。
public Point2D getIntersection(final Line2D.Double line1, final Line2D.Double line2){
final double x1,y1, x2,y2, x3,y3, x4,y4;
x1 = line1.x1; y1 = line1.y1; x2 = line1.x2; y2 = line1.y2;
x3 = line2.x1; y3 = line2.y1; x4 = line2.x2; y4 = line2.y2;
final double x = ((x2 - x1)*(x3*y4 - x4*y3) - (x4 - x3)*(x1*y2 - x2*y1)) /((x1 - x2)*(y3 - y4) - (y1 - y2)*(x3 - x4));
final double y = ((y3 - y4)*(x1*y2 - x2*y1) - (y1 - y2)*(x3*y4 - x4*y3)) /((x1 - x2)*(y3 - y4) - (y1 - y2)*(x3 - x4));
return new Point2D.Double(x, y);
}