Как получить позицию X объектов в обработке - PullRequest
1 голос
/ 21 сентября 2019

Я пытаюсь сделать Space Invaders в обработке.В настоящее время я работаю над тем, чтобы заставить врага двигаться правильно.Я заставил их быть нарисованными в правильном месте, но я не заставил их правильно двигаться.Вот мой код:

PImage mainPlayer;
PImage enemyPlayer;

float Xspeed = 60;
float Yspeed = 60;
float X;
float Y;

Enemy EnemyPlayer = new Enemy("EnemyPlayerSpaceInvaders.png", 10, 10, 6);

void setup() {
 size(1400, 800);

 //enemyPlayer = loadImage("EnemyPlayerSpaceInvaders.png");
 mainPlayer = loadImage("MainPlayerSpaceInvaders.png");


}

void draw() {
  background(0);

  Enemy[] enemyPlayer = new Enemy[60];
  for (int i = 0; i < 5; i += 1) {
    for (int j = 0; j < 11; j += 1) {
      enemyPlayer[j *i] = new Enemy("EnemyPlayerSpaceInvaders.png", 50 + j * 100, 5 + 75 * i, 6);
    }
  }

  for (int i = 0; i < 5; i += 1) {
    for (int j = 0; j < 11; j += 1) {
      if(enemyPlayer[j * i].alive){
        enemyPlayer[j * i].Draw();
      }
      enemyPlayer[j *i].moveAndDraw(6);
    }
  }
}


class Enemy {
  boolean alive = true;
  float x;
  float y;
  float speed;
  String playerTexFile;
  PImage playerTex;
    Enemy(String PlayerTexFile, float X, float Y, float Speed){
     x = X;
     y = Y;
     speed = Speed;
     playerTexFile = PlayerTexFile;
    }

    void Draw(){
      playerTex = loadImage(playerTexFile);
     image(playerTex, x, y); 
    }

    void moveAndDraw(float Speed){
     playerTex = loadImage(playerTexFile);
     if(alive){
       x += Speed;
       if (x >= 1300) {
          x = 100;
          y += 50;
        } 
     } 
   }
}

Вот мой результат: enter image description here

Функция Draw работает, но вы видите, что это портитфункция moveAndDraw().

И вражеские рисунки не двигаются.Я делал это раньше с c ++ SFML, но в этом есть очень простая функция getPosition.Причина, по которой я хочу получить позицию, состоит в том, что сейчас я должен использовать неточные числа в качестве позиции X и Y, и для того, чтобы противник правильно двигался, мне нужно точно знать, какая это позиция.Я проверил несколько страниц на processing.org, но ни одна из них не помогла.Я не нашел ни одного getPosition, а все те, что я видел, использовали другие люди, чтобы сделать это, но я просто не смог заставить его работать.Если есть какой-нибудь код, который мог бы заставить меня это работать, или просто какая-то функция, которую я просмотрел, и даже страница веб-сайта, на которую я мог бы посмотреть, я был бы открыт для этого.Пожалуйста, скажите мне, что я могу сделать, чтобы это сработало.

1 Ответ

1 голос
/ 21 сентября 2019

Проблема в том, что вы воссоздаете врагов в каждом кадре в его начальной позиции:

void draw() {
   background(0);

   Enemy[] enemyPlayer = new Enemy[60];
   for (int i = 0; i < 5; i += 1) {
       for (int j = 0; j < 11; j += 1) {
           enemyPlayer[j *i] = new Enemy("EnemyPlayerSpaceInvaders.png", 50 + j * 100, 5 + 75 * i, 6);
       }
   }

   // [...]
}

Вам необходимо:

  • Создатьглобальный массив врагов Enemy[] enemyPlayer (и удаление PImage enemyPlayer).
  • Создайте и инициализируйте врагов в setup.
  • Используйте и перемещайте существующих врагов в draw:

Также обратите внимание, что ваши циклы не делают того, что вы ожидаете.Создайте врагов в 2 вложенных цикла.Если i работает от o до 6, а j от 0 до 10, индекс врага равен i*10 + j.
. Враги могут перемещаться в одном цикле от 0 до enemyPlayer.length.

//PImage enemyPlayer; <--- DELETE

// global array of enemies
Enemy[] enemyPlayer = new Enemy[60];

// [...]

void setup() {
    size(1400, 800);

    mainPlayer = loadImage("MainPlayerSpaceInvaders.png");

    // create enemies
    for (int i = 0; i < 6; i += 1) {
        for (int j = 0; j < 10; j += 1) {
            enemyPlayer[i*10 + j] = new Enemy("rocket64.png", 50 + j * 100, 5 + 75 * i, 6);
        }
    }
}

void draw() {
    background(0);

    // move enemies
    for(int i = 0; i < enemyPlayer.length; ++i ) { 
        if(enemyPlayer[i].alive){
            enemyPlayer[i].Draw();
        }
        enemyPlayer[i].moveAndDraw(6);
    }
}
...