0

私のプログラムはゾンビサバイバルゲームで、ブロックの2D配列に設定されています。私は、最初の試みである配列リストを使用してゾンビを格納し、それぞれがその動きを検出するために、その上、下、および周囲にブロックがあるかどうかを「チェック」します。

ここに関連するコードを投稿し、スケッチフォルダを個別にアップロードします。

ArrayList zombies;

void setup() {
  zombies = new ArrayList();
}

void draw() {
      for (int i = 0; i < zombies.size(); i++) {
    Zombie zombie = (Zombie) zombies.get(i);
      zombie.draw();
}
}

void keyPressed() {
  if (key == 'z') {
    zombies.add(new Zombie());
}
}

class Zombie
{
  int posX = 20;
  int posY = 10;
  boolean fall;
  boolean playerOnBlock;

  Zombie() {
    posX = 10;
    posY = 590;
    fall = false;
  }

  void draw() {
    grid.blockCheck(posX, posY, 2);
    fill(0, 255, 0);
    rect(posX, posY, 10, 10);
  }

  void fall() {
    posY += 5;
    println("zombiefall"+posY);
  }

  void move(boolean left, boolean right, boolean above) {
    if (left == true && player.playerX < posX) {
      posX -= 1;
    }
    if (right == true && player.playerX > posX) {
      posX += 1;
    }
  }
}

class Grid {
  void blockCheck(int x, int y, int e) {
    for (int i = 0; i < l; i++)
      for (int j = 0; j < h; j++)
      {
        grid[i][j].aroundMe (x, y, i, j, e);
      }
  }
}

class Block {
  void aroundMe(int _x, int _y, int _i, int _j, int entity) {
    int pGX = _x/10;
    int pGY = _y/10;

    if (entity == 1) {
      if (pGY+1 == _j && pGX == _i && state == 4) {
        player.fall();
      }

      if (pGX == _i && pGX-1 <= _i && _y == posY && state == 4) {
        leftOfMe = true;
      }
      else
      {
        leftOfMe = false;
      }

      if (pGX+1 == _i && _y == posY && state == 4) {
        rightOfMe = true;
      }
      else
      {
        rightOfMe = false;
      }
      if (pGY-1 == _j && _x == posX && state ==4) {
        aboveOfMe = true;
      }
      else
      {
        aboveOfMe = false;
      }

      player.controls(leftOfMe, rightOfMe, aboveOfMe);
    }

    if (entity == 2) {

      if (pGY+1 == _j && pGX == _i && state == 4) {
              for (int i = 0; i < zombies.size(); i++) {
    Zombie zombie = (Zombie) zombies.get(i);
        zombie.fall();
      }
      }

      if (pGX == _i && pGX-1 <= _i && _y == posY && state == 4) {
        ZleftOfMe = true;
      }
      else
      {
        ZleftOfMe = false;
      }

      if (pGX+1 == _i && _y == posY && state == 4) {
        ZrightOfMe = true;
      }
      else
      {
        ZrightOfMe = false;
      }

      if (pGY-1 == _j && _x == posX && state ==4) {
        ZaboveOfMe = true;
      }
      else
      {
        ZaboveOfMe = false;
      }
      for (int i = 0; i < zombies.size(); i++) {
    Zombie zombie = (Zombie) zombies.get(i);
      zombie.move(ZleftOfMe, ZrightOfMe, ZaboveOfMe);
    }
  }

スケッチはここにあります:http ://www.mediafire.com/?u5v3117baym846v

問題は、参照している配列リストのどの要素を指定するかにあると思います。問題を次のように観察できるからです。

すべての「ゾンビ」は、落下する必要があることを検出すると落下します。

ゾンビが追加されるたびにゾンビの速度が上がります-どういうわけか、すべてのゾンビ要素を1つのゾンビオブジェクトとして扱いますか?

これは同様の問題である可能性があります 。新しい要素が追加されると、ArrayListのすべての要素が変更されますか?

しかし、私は自分のプロジェクトをいじくり回していて、それをまだ機能させることができないようです。

私のプロジェクトの詳細については、遠慮なくお問い合わせください。私は一晩中コンピューターを持っているので、すぐに返信できるはずです。前もって感謝します。

ご協力いただきありがとうございます。私はそれを次のように使用しています:

ArrayList <Zombie> zombies =  new ArrayList <Zombie>();
-------------------------------------------
    void setup(){
  zombies = new ArrayList();
-------------------------------------------

void draw(){
  for (Zombie z:zombies) {
    z.draw();
  }
}

-------------------------------------------

void keyPressed() {
  if (key == 'z') {
    for (int i = 0; i< 1; i++) {
      zombies.add(new Zombie(i));
    }
  }

-------------------------------------------

class Zombie
{
  int posX = 20;
  int posY = 10;
  boolean fall;
  boolean playerOnBlock;
  int z;

  Zombie(int _z) {
    posX = 10;
    posY = 590;
    fall = false;
    z = _z;
  }

  void draw() {
    grid.blockCheck(posX, posY, 2);
    fill(0, 255, 0);
    rect(posX, posY, 10, 10);
  }

  void fall() {
    posY += 5;
    println("zombiefall"+posY);
  }

  void move(boolean left, boolean right, boolean above) {
    if (left == true && player.playerX < posX) {
      posX -= 1;
    }
    if (right == true && player.playerX > posX) {
      posX += 1;
    }
  }
}
4

1 に答える 1

0

これがアイデアです:)

//use generics to keep it simple. Only Zoombies in this list
ArrayList <Zoombie> samp =  new ArrayList <Zoombie>();

void setup() {
  //a regular for loop to use the i as id
  for (int i = 0; i< 100; i++) {
    samp.add(new Zoombie(i));

  }
  //run just once
  noLoop();
}


void draw() {

  //a enhanced for, no need for use  get()
  // z will represent each element in the collection
  for (Zoombie z:samp) {
    z.d();   
  }

  println("done");
}

// a dummy class ;)
class Zoombie {
  int id;
  Zoombie (int _id)
  {
    id =_id;
  }

  void d()
  {
    println(id);
  }
}
于 2013-03-14T12:41:23.243 に答える