有没有办法检查一个方法是否使用Java Processing绘制另一个方法?

时间:2017-06-29 21:01:25

标签: java processing

我正在创建一个基本游戏,需要在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.

    }
}

2 个答案:

答案 0 :(得分:2)

您可以使用get()函数以这种方式执行此操作。您可以在the reference中找到更多信息,但基本上它可以让您获得特定像素的颜色。你可以根据它来执行一些逻辑。

但说实话,这不是你应该考虑的方式。您应该将碰撞检测基于存储在内存中的一组形状,而不是将碰撞检测基于实际绘制的内容。对于大多数情况,简单的圆形或矩形都可以正常工作。

如果您使用translate()函数绘制所有内容,则会变得更复杂,但您可以使用screenX()screenY()函数将坐标转换为屏幕坐标。同样,可以在the reference中找到更多信息。

无耻的自我推销:我已经在可用的处理here中编写了一个关于碰撞检测的教程,但互联网上有大量的资源。

如果您仍遇到问题,请将问题缩小到MCVE,我们将从那里开始。祝你好运。

答案 1 :(得分:0)

  

我需要检查一个方法是否创建了一个与另一个方法重叠的图像。

您在显示屏上检测碰撞的方法有点不稳定......

每个程序由3层组成

  1. 模型,它包含应用程序状态
  2. 提供业务逻辑
  3. 控制器
  4. 执行用户互动(输入/输出)的查看
  5. 即使您的程序没有明确公开这些图层,它的行为也应该明确地分配给其中一个。

    简而言之:您尝试在视图层中找到碰撞。但是 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));     
       }   
    }
    

    多边形的计算可能更复杂......