我正在创建一个基本游戏,需要在drawObstacle和drawRocketShip方法之间实现碰撞检测。我需要检查一个方法是否创建了一个与另一个方法重叠的图像。由于我为了简洁起见而省略了一些随机化和位置相似性检查,因此它们不能分成不同的类别。如果需要,我可以进一步详细说明,但我认为开始时不一定需要它。
public class SideScrollGame extends PApplet {
// Variables determining motion, window size, etc.
public float rock1;
public float rock2;
public float rock3;
public float rock4;
public float rock5;
public void setup(){
size(width,height);
//rock1 to rock5 are randomized values determining height.
}
public void draw(){
moveShip();
moveRock();
drawObstacle(rock1, 3);
drawObstacle(rock2, 3);
drawObstacle(rock3, 3);
drawObstacle(rock4, 3);
drawObstacle(rock5, 3);
translate(x,y);
// Code behind motion omitted for sake of brevity. It just moves the
// ship up and down across the Processing applet
drawRocketShip();
// drawObstacle and drawRocketShip create composite images using the
// ellipse(), rect(), and triangle() functions.
}
}
答案 0 :(得分:2)
您可以使用get()
函数以这种方式执行此操作。您可以在the reference中找到更多信息,但基本上它可以让您获得特定像素的颜色。你可以根据它来执行一些逻辑。
但说实话,这不是你应该考虑的方式。您应该将碰撞检测基于存储在内存中的一组形状,而不是将碰撞检测基于实际绘制的内容。对于大多数情况,简单的圆形或矩形都可以正常工作。
如果您使用translate()
函数绘制所有内容,则会变得更复杂,但您可以使用screenX()
和screenY()
函数将坐标转换为屏幕坐标。同样,可以在the reference中找到更多信息。
无耻的自我推销:我已经在可用的处理here中编写了一个关于碰撞检测的教程,但互联网上有大量的资源。
如果您仍遇到问题,请将问题缩小到MCVE,我们将从那里开始。祝你好运。
答案 1 :(得分:0)
我需要检查一个方法是否创建了一个与另一个方法重叠的图像。
您在显示屏上检测碰撞的方法有点不稳定......
每个程序由3层组成
即使您的程序没有明确公开这些图层,它的行为也应该明确地分配给其中一个。
简而言之:您尝试在视图层中找到碰撞。但是 Controller 层应该查看 Model 并在那里找到冲突。这将使您能够更改UI(例如,从Swing更改为FX)或添加缩放功能,而不会影响碰撞检测逻辑。
我看到的问题(以及您必须解决的问题)是您目前只有图像来表示对象的形状。您需要将图像转换为可以计算距离的模型类:
/// represents a point in an abstract coordinate system where
/// the coordinates must be less than Integer.MAX_VAL/2
/// and bigger than Integer.MIN_VAL/2
/// to avoid integer overflows on calculations
class GameCoordinate{
public final int x;
public final int y;
GameCoordinate(int x, int y){
this.x = x;
this.y = y;
}
}
/// something that can cause a colision
interface GameObject{
GameCoordinate getCenter();
GameCoordinate getNearestSurfacePointTo(GameObject other);
boolean collidesWith(GameObject other);
}
class Cycle implements GameObject{
private final GameCoordinate center;
private final int radius;
Cycle(GameCoordinate center, radius){
this.center = center;
this.radius = radius;
}
@Override
GameCoordinate getCenter(){
return center;
}
@Override
GameCoordinate getNearestSurfacePointTo(GameObject other){
deltaX= (int)(center.x-other.getCenter().x);
deltaY= (int)(center.y-other.getCenter().y);
return new GameCoordinate(
center.x +(radius*(deltaY/deltaX))),
center.y +(radius*(deltaX/deltaY))));
}
@Override
boolean collidesWith(GameObject other){
GameCoordinate othersNearestPointToMe = other.getNearestSurfacePointTo(center);
deltaX= (int)(center.x-othersNearestPointToMe.getCenter().x);
deltaY= (int)(center.y-othersNearestPointToMe.getCenter().y);
return radius >= (int)Math.abs(Math.sqr( deltaX*deltaX+deltaY*deltaY));
}
}
多边形的计算可能更复杂......