在Method中返回类型错误的结果

时间:2015-01-08 13:58:44

标签: 2d processing collision

我在2D Processing 2.2.1游戏中处理碰撞检测。基本上我所做的是编写一个类,通过定义其端点的坐标来创建一个框,并且有一个方法来检查这些框中的两个是否重叠。我通过引入一个布尔值来做到这一点,一旦这些框中的两个重叠,就设置为true。然后基本上实现了一个创建这些框的get方法,我遇到了返回类型错误的结果。它说该方法没有返回正确类型的Box1。我真的不明白,因为我返回的方框确实适合构造函数。我很确定这是因为碰撞的对象在一个数组中随着时间的推移生成越来越多的对象,但遗憾的是我不知道如何更改我的Collider(Box1)类。

这是我犯错误的代码:

//returning collider info
public Box1 getBox1() {
     for (int i =frameCount/600; i >0; i--) {
     return new Box1( block[i].x - Blockpic.width/2, block[i].y-Blockpic.height/2,      block[i].x+Blockpic.height/2, block[i].y+Blockpic.height/2);
 }

}

这是我的对撞机(Box1)类:

public class Box1 {
    float x1, x2;
    float y1, y2;

    Box1( float x1, float y1, float x2, float y2 ) {
    this.x1 = x1;
    this.y1 = y1;

    this.x2 = x2;
    this.y2 = y2;
 }

 boolean isOverlap( Box1 b ) {
 if ((( x1 <= b.x1 && b.x1 <= x2 ) || ( x1 <= b.x2 && b.x2 <= x2 ))
 && (( y1 <= b.y1 && b.y1 <= y2 ) || ( y1 <= b.y2 && b.y2 <= y2 ))) {
    return true;
 }
    return false;
 }
}

仅用于完整信息我的产卵对象类(错误所在的位置):

public class Blockfield {
    private int Blockcount;
    private PImage Blockpic;
    private Block block[];

  //Constructor
  public Blockfield (int Blockcount) {
    this.Blockcount = Blockcount; 
    Blockpic = loadImage("block2.png");
    //new array
    block = new Block [Blockcount];
    for ( int i=0; i < Blockcount; i++) {
      block[i] = new Block( width+Blockpic.width, random (height),7);
    }
  }


  //Draw method for this class


  public void draw () {
   for (int i =frameCount/600; i >0; i--) {
     pushMatrix();
      translate ( block[i].x,block[i].y );
      image ( Blockpic, block[i].x, block[i].y);
      popMatrix();
    }
  }

   public void update() {
     for (int i =frameCount/600; i >0; i--) {
     //moves blocks right to left
      block[i].x -=(6 * (frameCount/200));
      //spawns block when they leave the screen
      if (block[i].x < 0 - Blockpic.width) {
        block[i] = new Block( width+Blockpic.width, random (height),7);
      }
     }
   }
 //returning collider info
 public Box1 getBox1() {
 for (int i =frameCount/600; i >0; i--) {
    return new Box1( block[i].x - Blockpic.width/2, block[i].y-Blockpic.height/2, block[i].x+Blockpic.height/2, block[i].y+Blockpic.height/2);
 }
 }

}



class Block {
   float x, y;
   int speed;

   Block ( float x, float y, int speed) {
   this.x= x;
   this.y= y;
   this.speed = speed;
}

}

非常感谢!!!

1 个答案:

答案 0 :(得分:2)

正如你所说,问题在于这个方法:

public Box1 getBox1() {
   for (int i =frameCount/600; i >0; i--) {
      return new Box1( block[i].x - Blockpic.width/2, block[i].y-Blockpic.height/2, block[i].x+Blockpic.height/2, block[i].y+Blockpic.height/2);
   }
}

忽略一下,在这样的for循环中有一个return语句是没有意义的,整个问题是计算机太愚蠢了,不知道frameCount的值在运行代码之前是什么。如果frameCount为0怎么办?还是消极的?

如果frameCount为0或负数,那么for循环的主体将永远不会被执行,并且此方法永远不会返回任何内容。那是错误。

您可能知道frameCount将始终为正,但计算机不会。

编辑:继续回复您的以下评论:

如果您需要帮助,则必须提供MCVE。请注意,这应该尽可能少,只是为了获得基础知识。我们不需要任何碰撞检测,只需要您调用的功能。这是一个例子:

void setup(){
  String s = getString(true);
  println(s);
}

String getString(boolean b){
  if(b){
    return "testing";
  }
}

如果您尝试运行此代码,则会收到错误消息,告诉您&#34;此方法必须返回String&#34;类型的结果。

您收到此错误的原因是:如果我传入false值,getString()函数将返回什么?它不会回报任何东西!这与您的代码抱怨的完全一样。 我们可以看到getString()只是被调用了一个值为true,但是计算机并不够聪明,无法解决这个问题。

您似乎误解了编译器的强大功能。 无法看到运行时会发生什么。即使你很明显布尔值总是为真(或者在你的情况下,frameCount总是正数),编译器也不会知道。并且由于它无法知道,它告诉您可能不会从具有返回类型的方法返回值,并且这是编译器错误。

您需要重构代码,以便始终从具有返回类型的方法返回一些内容。但是,我怀疑for循环是否符合你的想法 - 但你还没有真正解释你的想法,所以这只是猜测。

您在其他方法中没有遇到此错误的原因是因为它们都不包含此逻辑错误。唯一具有返回类型的函数是这一个:

boolean isOverlap( Box1 b ) {
   if (lotsOfLogic) {
      return true;
   }
   return false;
}

请注意,即使if语句的计算结果为false,您仍然会从此函数返回一些内容。这就是你需要用getBox1()函数做的事情。