使用类的对象数组进行碰撞

时间:2015-03-23 20:42:55

标签: java class variables object processing

我正在制作一款游戏,基本上你就像飞船一样躲避传入的小行星(这是第一年的大学项目)。

我遇到了一个问题,我在一个类(小行星)中调用了6个对象,它们是通过数组调用的。我需要能够在类之外使用它们的x和y位置,以便检测用户控制的精灵是否与一个碰撞。

每当我尝试引用类外的小行星的x或y位置时,我都会收到错误“无法对非静态字段进行静态引用.posstacle.posx”。

以下是我的代码的MCVE。它调用对象,然后向下移动屏幕。我现在已经删除了用户控制的精灵和图像,因为我需要知道的是如何引用类外的对象位置。

*我添加了一些显示我正在尝试实现的内容的更改

obstacle [] asteroid; 
int x;
int y = 400;
int velocity = 10;

void setup ()
{
  size (700, 500);

  asteroid = new obstacle[6];
  for (int i = 0; i < asteroid.length; i++) {
    asteroid[i] = new obstacle();
  }
}

void draw () {
  background(0);
  collision();
  rect (x,y,30,30);

  for (int i = 0; i < asteroid.length; i++) {
    asteroid[i].display();
    asteroid[i].move();
  }
}

void keyPressed () {
  if (key == CODED) {

    if (keyCode == RIGHT) {  
      x += velocity;
    }

    if (keyCode == LEFT) {
      x -= velocity;
    }
  }
}

void collision () {
  if (x == obstacle.posx && y == obstacle.posy) {
    println("Hit");
  }
}


class obstacle {


  int velocity = 6;
  int posx;
  int posy = height;



  void display () {
    rect (posx, posy, 50, 50);
  }

  void move() {
    posy += velocity;
    if (posy >= height) {
      posy = (int(random(-500, -50))); 
      posx = (int(random(20, 650))); 
    }
  }
}

2 个答案:

答案 0 :(得分:2)

回复:你最后的评论,这是你的问题。您无法引用obstacle.posx,因为obstacle是类类型,posx不是静态的。您可以在for循环中移动它并执行System.out.println(asteroids[i].posx)(假设posx在那里可见(即它是公开的)。

答案 1 :(得分:0)

您可能会将障碍类与此类的实例混淆。 您不应该尝试通过类(通过obstacle.posx)访问实例成员,而是通过实例访问。

与调用move()display()等方法/函数的方式相同,您应该可以访问posx

这是draw()的略微修改版本:

void draw () {
  background(0);
  println(asteroid[0].posy);
  for (int i = 0; i < asteroid.length; i++) {
    asteroid[i].display();
    asteroid[i].move();
  }
}

注意控制台中的值会发生变化。您没有直接通过类访问posy,您访问第一个障碍物实例(存储在小行星阵列中的索引0处)并使用点符号(移动/显示其他符号的方式相同)。希望这很清楚。你太近了。