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));
}
通过添加给定的缓冲区,我们可以扩大边界框的面积,从而使其更敏感。您可以根据我的示例进行调整,在其中一个对象(两个对象)上添加缓冲区,或者仅在其中一个对象的宽度或高度上添加缓冲区