Java “制造线”;停止“;当它与对象相交时

Java “制造线”;停止“;当它与对象相交时,java,java-2d,Java,Java 2d,所以我制作了一个自上而下的游戏,里面有僵尸,你的玩家可以射杀它们。播放机上有一条红线(像激光一样)显示您指向的方向。我希望这台激光器能像一台真正的激光器一样工作——如果有一个物体挡住了它,它只能飞到那个物体那么远的地方。此外,我也不确定如何让激光穿过鼠标指针,并一直移动到窗口边缘(除非有物体挡住)。我有一个名为entities的ArrayList,它包含我渲染的所有对象(Class=Entity) Player p = (Player) entities.get(0); g.setColor(C

所以我制作了一个自上而下的游戏,里面有僵尸,你的玩家可以射杀它们。播放机上有一条红线(像激光一样)显示您指向的方向。我希望这台激光器能像一台真正的激光器一样工作——如果有一个物体挡住了它,它只能飞到那个物体那么远的地方。此外,我也不确定如何让激光穿过鼠标指针,并一直移动到窗口边缘(除非有物体挡住)。我有一个名为entities的ArrayList,它包含我渲染的所有对象(Class=Entity)

Player p = (Player) entities.get(0);
g.setColor(Color.RED);
g.drawLine((int)p.getX(), (int)p.getY(), getMouseX(), getMouseY());
该代码只生成一条从玩家位置到光标点(如预期)的线。请记住,敌人是圆(我有一种方法来检查一个点是否在圆中)

public boolean ispointincorcle(双中心x、双中心y、双半径、双x、双y){

布尔值isInRectangle=x>=centerX-radius&&x=centerY-radius&&y简单的方法是蛮力:谷歌如何检查直线是否与圆相交,并检查每个实体。如果没有相交,则绘制直线和边的交点(再次谷歌学习数学)。也许有人会写这些公式,也许是用Java代码,作为答案,这样你就不用谷歌了:)是的,我不确定它在诱惑下是否有效。如果你没有数千个实体,它很容易就足够有效了。如果没有,是时候了解一下或者其他一些优化方法了。
public boolean isPointInCircle(double centerX, double centerY, double radius, double x, double y){
    boolean isInRectangle = x >= centerX - radius && x <= centerX + radius && y >= centerY - radius && y <= centerY + radius;
    if(isInRectangle){
        double dx = centerX - x;
        double dy = centerY - y;
        dx *= dx;
        dy *= dy;
        double distanceSquared = dx + dy;
        double radiusSquared = radius * radius;
        return distanceSquared <= radiusSquared;
    }
    return false;
}