Как я могу избежать наложения при создании спрайтов? JS - PHASER3 - PullRequest
0 голосов
/ 13 июля 2020

Я новичок в этом, и я делаю небольшую игру в JS, проблема, которая у меня сейчас, заключается в том, что когда я создаю врагов, они иногда перекрываются, создавая это:

введите описание изображения здесь

Способ их создания прост,

resetShip(enemy_spaceship) {
    enemy_spaceship.y = 0;
    enemy_spaceship.x = Phaser.Math.Between(10,globalThis.config.width);
}

В X каждый спрайт будет иметь случайное число от 10 до ширины экрана (холста), проблема в том, что если у спрайта 440 в X, а у другого 450 в X, этих 10 пикселей недостаточно, чтобы разделить их, некоторые люди сказали мне создать сетку, но, как я уже сказал, я новичок и поиск сетки может я не нашел ни одного примера, который я мог бы использовать для этого, спасибо, если вы можете мне помочь :)

1 Ответ

0 голосов
/ 13 июля 2020

Один вариант - для каждого вражеского корабля должен быть выделен определенный c регион, в котором он может стартовать. Если у вас есть 2 корабля, это означает, что первый корабль может находиться в любом месте первой половины оси X, а второй корабль может быть где угодно во второй половине оси X.

Для этого вы должен обновить вашу функцию resetShip, чтобы также принимать minX и maxX, и использовать это при определении его местоположения:

resetShip (enemy_spaceship, minX, maxX) {
  enemy_spaceship.y = 0;
  enemy_spaceship.x = Phaser.Math.Between(minX, maxX);
}

Затем вам нужно найти способ отдохнуть группе Корабли, предоставляя допустимые регионы для каждого корабля. Примерно так:

resetEnemies(ships) {
  //Each ship may be in a region that is 1/Nth of the width 
  let regionWidth = globalThis.config.width / ships.length
  //We need to know the shipWidth so we don't let ships get too
  //close to the left edge.
  let shipWidth = 64 

  ships.forEach((ship, i) => {
    //Assuming you just want padding on the left so it is no closer than 10px, 
    //this will define the minX for the Nth ship
    const minX = Math.min(10, i*regionWidth)
    //The maxX should not let a ship overlap the next region. So, we subtract the shipWidth
    //to ensure that, at worst, it is right next to the next ship
    const maxX = (i+1)*regionWidth-shipWidth

    //Use the updated restShip to put it in a valid location for it's region
    resetShip(ship, minX, maxX)
  })
}

...