Java也一样,但有一个缓冲区

Java也一样,但有一个缓冲区,java,swing,Java,Swing,我做了一个简单的游戏,我有一个简单的方法来检测我何时收集了一枚硬币,但很难精确匹配它的位置 public class Token { private String name; int x; int y; private BufferedImage image; public Token (String nameIn, int xIn, int yIn, BufferedImage imageIn) { name = nameI

我做了一个简单的游戏,我有一个简单的方法来检测我何时收集了一枚硬币,但很难精确匹配它的位置

public class Token {
    private String name;
    int x;
    int y;
    private BufferedImage image;
    public Token (String nameIn, int xIn, int yIn, BufferedImage imageIn)
    {   
        name = nameIn;
        x = xIn;
        y = yIn;
        image = imageIn;
    }

    public boolean collected(Hero frylark) {
        if (frylark.getX() == x && frylark.getY() == y) {
            return true;
        }
        else {
            return false;
        }
    }
}
有没有办法让我有一个10像素的缓冲区而不是

精确匹配硬币的位置

二维场中两点之间的距离是其相应坐标之间差值的平方和:

public boolean collected(Hero frylark) {
    return Math.sqrt(Math.pow(frylark.getX() - x , 2) + 
                     Math.pow(frylark.getY() - y , 2)
                    ) <= 10.0;
}
公共布尔集合(英雄弗莱拉克){
返回Math.sqrt(Math.pow(frylark.getX()-x,2)+
Math.pow(frylark.getY()-y,2)

)根据Mureinik的回答,不使用Math.pow或Math.sqrt可以更快地完成此任务

double dx = frylark.getX() - x;
double dy = frylark.getY() - y;
return dx*dx + dy*dy <= 10.0*10.0;
double dx=frylark.getX()-x;
double dy=frylark.getY()-y;
返回dx*dx+dy*dy
我做了一个简单的游戏,我有一个简单的方法来检测我何时收集了一枚硬币,但很难精确匹配它的位置

public class Token {
    private String name;
    int x;
    int y;
    private BufferedImage image;
    public Token (String nameIn, int xIn, int yIn, BufferedImage imageIn)
    {   
        name = nameIn;
        x = xIn;
        y = yIn;
        image = imageIn;
    }

    public boolean collected(Hero frylark) {
        if (frylark.getX() == x && frylark.getY() == y) {
            return true;
        }
        else {
            return false;
        }
    }
}
我将为您提出一种稍有不同的方法。如果您试图仅使用x和y坐标来检测碰撞,则很难检测碰撞,因为您需要两个像素同时命中同一点

当您尝试检查不同大小图像的碰撞时,尤其会出现此问题:

Exmaple:

在当前的实现中,为了使
游戏角色
击中
硬币
红色像素(左上角)必须碰撞,最后需要为不同大小的图像添加缓冲区以检查碰撞


我建议为每个对象返回一个边界框,并检查它们的边界框是否相交:

public boolean collected(Hero h){
    Rectangle heroBox = new Rectangle (h.getX(), h.getY(), h.getWidth(), h.getHeight());
    Rectangle coinBox = new Rectangle (x, y, width, height);
    return(coinBox.intersects(heroBox));
}
创建边界框时,需要对象的宽度和高度(通常是图像的宽度和高度)

优势:

  • 您不再需要检查每个图像的大小并分别为它们设置缓冲区

有没有办法让我有一个10像素的缓冲区而不是 精确匹配硬币的位置

添加缓冲区:

如果您仍然需要一个缓冲区,比如说10像素。我们仍然可以在这个实现中应用它:

public boolean collected(Hero h, int buffer){
    Rectangle heroBox = new Rectangle (h.getX(), h.getY(), h.getWidth() + buffer, h.getHeight() + buffer);
    Rectangle coinBox = new Rectangle (x, y, width + buffer , height + buffer);
    return(coinBox.intersects(heroBox));
}
通过添加给定的缓冲区,我们可以扩大边界框的面积,从而使其更敏感。您可以根据我的示例进行调整,在其中一个对象(两个对象)上添加缓冲区,或者仅在其中一个对象的宽度或高度上添加缓冲区