Как я могу вызвать переменные и функции из другого класса внутри сцены? - PullRequest
1 голос
/ 31 января 2020

Я делаю небольшую игру-прототип, в которой используются расширяющиеся классы (не знаю, как это называется), и я пытаюсь обнаружить столкновение между игроком и наземными блоками. Моя проблема в том, что обработка говорит, что «player» не может быть преобразован в переменную. Из-за этого я не могу использовать какую-либо переменную из класса Player для обнаружения какого-либо столкновения.

Если у вас есть вопросы, на которые вам нужно ответить, чтобы помочь мне, я с удовольствием на них отвечу.

Это класс PlayScene

public class PlayScene extends GameScene {
  public WorldBlocks blocks;
  public Player player;

  public PlayScene() {
    blocks = new WorldBlocks();
    player = new Player();
  }

  public void Update() {
    if (!blocks.levelLoaded) {
      blocks.spawnGroundBlocks();
      player.spawnPlayer();
    }
    blocks.updateGroundBlocks();
  }

  public void Draw() {
    background(255);
    blocks.drawGroundBlocks();
  }
}

Класс игрока

class Player {
  public float x, y, xVelocity, yVelocity, playerSize;
  public boolean groundCollision;

  void spawnPlayer() {
    x = width/25;
    y = height - height/3;
    xVelocity = 0;
    yVelocity = 0;
    playerSize = width/35;
  }

  void updatePlayer() {

  }
}

Класс WorldBlocks (проблема разделена)

class WorldBlocks {
  private final int NUMBER_OF_BLOCKS = 100;
  private boolean levelLoaded = false;

  private float spawnPosX;
  private float spawnPosY;
  public final float BLOCK_SIZE = width/30;

  public float []x = new float[NUMBER_OF_BLOCKS];
  public float []y = new float[NUMBER_OF_BLOCKS];
  private float []blockColor = new float[NUMBER_OF_BLOCKS];

  void spawnGroundBlocks() {
    spawnPosX = -(BLOCK_SIZE/2);
    spawnPosY = height - 1.5 * BLOCK_SIZE;

    for (int i = 0; i < NUMBER_OF_BLOCKS; i++) {
      if (spawnPosX < width + BLOCK_SIZE/2 && spawnPosY < height) {
        x[i] = spawnPosX;
        y[i] = spawnPosY;
        blockColor[i] = random(100, 155);
        spawnPosX += BLOCK_SIZE;

        if (spawnPosX > width && spawnPosY < height - BLOCK_SIZE/2) {
          spawnPosX = -BLOCK_SIZE/2;
          spawnPosY = height - BLOCK_SIZE/2;
        }
      } else {
        spawnPosX = 0;
        spawnPosY = -height;
        blockColor[i] = random(200, 255);
      }
    }
    levelLoaded = true;
  }

  void updateGroundBlocks() {
    for (int i = 0; i < NUMBER_OF_BLOCKS; i++) {
  if (player.y + player.playerSize/2 > y[i] - BLOCK_SIZE/2) { //This is the problem statement
    collision = true;
  }
      if (x[i] < - BLOCK_SIZE/2) {
        x[i] += width + BLOCK_SIZE;
      }
      if (x[i] > width + BLOCK_SIZE/2) {
        x[i] -= width + BLOCK_SIZE;
      }
    }
  }

  void drawGroundBlocks() {
    for (int i = 0; i < NUMBER_OF_BLOCKS; i++) {
      fill(blockColor[i]);
      square(x[i], y[i], BLOCK_SIZE);
    }
  }
}

1 Ответ

1 голос
/ 31 января 2020

Расширение классов соответственно называется наследование .


В вашем коде:

  • Экземпляры класса PlayScene каждый иметь a Player.

  • Player не определено в классе WorldBlocks.

Следовательно, когда вы ссылаетесь на экземпляр игрока (с player.y и подобным) в классе WorldBlocks, вы ничего не найдете. Именно это означает, что обработка 'player' не может быть преобразована в переменную - он не может найти Player объект в пределах класса WorldBlocks.


Для вызова методов на игроке в классе WorldBlocks требуется ссылка на экземпляр Player.

Один из способов предоставления этой ссылки - через конструктор; измените класс WorldBlocks следующим образом:

class WorldBlocks {

    private player;

    public WorldBlocks(Player player) {
           this.player = player;
    }
}

Измените конструктор PlayScene следующим образом:

public PlayScene() {
    player = new Player();
    blocks = new WorldBlocks(player);
}

Теперь, когда вы обращаетесь к игроку (player.y ) внутри коллизии l oop класса WorldBlocks он знает, на что ссылаться - он вызовет объект private player, принадлежащий этому экземпляру WorldBlocks.

...