Как мне сгенерировать случайное значение X для каждого «снаряда» в моей игре с падающими объектами, используя Javascript? - PullRequest
0 голосов
/ 04 января 2019

Я кодирую игру, которая в настоящее время находится на очень ранней стадии проекта, чтобы попытаться узнать больше о кодировании.В моей игре объекты генерируют случайным образом (зеленые квадраты), а игрок (красный квадрат) избегает их.У меня возникли проблемы при попытке создать зеленые квадраты из случайного положения на оси X.У меня уже есть формула для генерации случайного числа для X, но после случайного выбора числа все «снаряды» генерируют там, а не все генерируют из другой области.Как получить все «снаряды» для случайного генерирования из разных позиций на оси х?

   var randomX = Math.floor(Math.random() * 480) + 15;

    function updateGameArea() {
    var x, y;
    for (i = 0; i < projectiles.length; i += 1) {
        if (player.crashWith(projectiles[i])) {
            gameArea.stop();
            return;
        } 
    }
    gameArea.clear();
    gameArea.frameNo += 1;
    if (gameArea.frameNo == 1 || everyinterval(150)) {
        x = randomX;
        y = gameArea.canvas.height; 
        projectiles.push(new component(40, 40, "green", x, y));
    }
    for (i = 0; i < projectiles.length; i += 1) {
        projectiles[i].y += -1; // the shape is using its coordinates to build downward from its y position
        projectiles[i].update();
    }
    player.newPos();    
    player.update();
}

    function everyinterval(n) {
    if ((gameArea.frameNo / n) % 1 == 0) {return true;}
    return false;

Ожидается : зеленые квадраты генерируются в случайных позициях на оси x каждые 3 секунды и перемещаются вверх

Фактические : зеленые квадратывсе генерируются из одной и той же случайной позиции на оси X.

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Вот ваша проблема:

var randomX = Math.floor(Math.random() * 480) + 15;
// Generates a random number and stores it to randomX
// Called using 'randomX'

Вам нужно превратить ее в функцию, если вы хотите, чтобы она запускалась каждый раз:

var randomX = function() { Math.floor(Math.random() * 480) + 15 }; 
// Returns a new number each time
// Called using 'randomX()'
0 голосов
/ 04 января 2019

И Шивашриганеш Махато, и Нателуисдев, по сути, ответили на то, как решить проблему, но поскольку вы изучаете кодирование, это совет.Когда вы кодируете, код будет выполняться в определенном порядке.Если вы хотите, чтобы что-то было переназначено повторно, в данном случае используется случайное число, и вы хотите, чтобы это происходило только после события, вам нужно убедиться, что оно срабатывает в каждом событии.

У natelouisdev есть хороший подход, потому что, используя его как функцию, вы можете более аккуратно вызывать ваш случайный случай в своем коде и заставлять его каждый раз переустанавливать значение x.

Поскольку вы создаете игру, также неплохо бы разделить код на части.Это облегчит сохранение ваших идей для каждого триггера события.

Пример:

  • function gameLoss () {} - Определить возврат события при проигрыше в игре.После этого вы можете создавать редактируемые правила для определения причины потери, не редактируя потери
  • function gameActive () {} - Определяет, что является нормальным игровым процессом.все, что происходит во время нормального игрового процесса, должно управляться здесь.

  • function gameArea () {} - Определяет игровой холст, который функционирует больше для пользовательского интерфейса, чем для игрового процесса (баллы, продолжительность, размер экрана,и т. д.)

Если бы вы создали отдельные функции, вы бы поняли, что вам нужно только случайное значение «х» при обычной игре, поэтому вы бы присваивали его в функции gameActive (), а не какглобальная переменная.Затем вы вызываете функцию gameActive () столько раз, сколько необходимо в течение определенного промежутка времени, чтобы каждый раз создавалось уникальное значение.

- Примечание: не засоряйте ненужные глобальные переменные.Это сделает беспорядок вашего кода при отладке.-

0 голосов
/ 04 января 2019

Вы должны сбрасывать X каждый раз, когда добавляете новый снаряд:

if (gameArea.frameNo == 1 || everyinterval(150)) {
    randomX = Math.floor(Math.random() * 480) + 15;
    x = randomX;
    y = gameArea.canvas.height; 
    projectiles.push(new component(40, 40, "green", x, y));
}

В противном случае значение randomX остается постоянным в качестве значения, первоначально оцененного в строке 1, когда интерпретатор достиг его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...