有没有一种方法可以通过Java处理检查一个方法是否优于另一个方法?

有没有一种方法可以通过Java处理检查一个方法是否优于另一个方法?,java,processing,Java,Processing,我正在创建一个初级游戏,需要在DrawBarriend和drawRocketShip方法之间实现碰撞检测。我需要检查一个方法是否创建了与另一个方法重叠的图像。由于我采用了一些随机化和位置相似性检查,这些检查没有被分成不同的类,为了简洁起见,这些检查被省略了。如果需要的话,我可以进一步阐述,但我认为一开始不一定需要 public class SideScrollGame extends PApplet { // Variables determining motion, window size,

我正在创建一个初级游戏,需要在DrawBarriend和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.

    }
}

您可以使用
get()
函数以这种方式完成。您可以在中找到更多信息,但基本上它允许您获得特定像素的颜色。你可以在此基础上执行一些逻辑

但老实说,你不应该这样想。与其根据实际绘制的图形进行碰撞检测,不如根据存储在内存中的一组形状进行碰撞检测。在大多数情况下,一个简单的圆或矩形就可以了

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

无耻的自我推销:我已经写了一篇关于处理过程中碰撞检测的教程,但是互联网上有大量的资源


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

你可以使用
get()
函数来实现。您可以在中找到更多信息,但基本上它允许您获得特定像素的颜色。你可以在此基础上执行一些逻辑

但老实说,你不应该这样想。与其根据实际绘制的图形进行碰撞检测,不如根据存储在内存中的一组形状进行碰撞检测。在大多数情况下,一个简单的圆或矩形就可以了

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

无耻的自我推销:我已经写了一篇关于处理过程中碰撞检测的教程,但是互联网上有大量的资源

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

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

你在显示器上检测碰撞的方法有些古怪

每个程序由3层组成

  • 保存应用程序状态的模型
  • 提供业务逻辑的控制器
  • 进行用户交互(输入/输出)的视图
  • 即使您的程序没有显式地公开这些层,它的行为也应该显式地分配给其中一个层

    长话短说:您尝试在视图层中查找碰撞。但是控制器层应该查看模型并在那里找到冲突。这将使您能够更改UI(例如从Swing更改为FX)或添加缩放功能,而不会影响碰撞检测逻辑

    我看到的问题(您必须解决)是,您当前只有图像来表示对象的形状。您需要将该图像转换为可以计算其距离的模型类:




    多边形的计算可能更复杂

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

    你在显示器上检测碰撞的方法有些古怪

    每个程序由3层组成

  • 保存应用程序状态的模型
  • 提供业务逻辑的控制器
  • 进行用户交互(输入/输出)的视图
  • 即使您的程序没有显式地公开这些层,它的行为也应该显式地分配给其中一个层

    长话短说:您尝试在视图层中查找碰撞。但是控制器层应该查看模型并在那里找到冲突。这将使您能够更改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));     
       }   
    }