簡體   English   中英

如何使用Javascript為下落物體游戲中的每個“彈丸”生成一個隨機的X值?

[英]How do I generate a random X value for each “projectile” in my falling objects game using Javascript?

我正在編寫一個游戲,該游戲目前正處於初期階段,供一個項目嘗試了解有關編碼的更多信息。 在我的游戲中,物體隨機產生(綠色方塊),而玩家(紅色方塊)避開它們。 我在嘗試使綠色方塊從x軸上的隨機位置生成時遇到麻煩。 我已經有了一個為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;

預期 :每3秒就會在x軸上的隨機位置生成一個綠色方塊,並向上移動

實際 :綠色方塊均從X軸上的相同隨機位置生成。

每次添加新的射彈時,都應重置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行計算的值。

這是您的問題:

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()'

從本質上講,shivashriganesh mahato和natelouisdev都對如何解決此問題做出了響應,但是由於您正在學習編碼,因此這里是一個提示。 當您編碼時,代碼將以特定順序運行。 如果要重復分配某些東西(在這種情況下使用的是隨機數),並且希望僅在事件發生后才出現,則需要確保在每個事件中都觸發它。

natelouisdev有一個很好的方法,因為通過將其用作函數,您可以在代碼中更清晰地調用隨機化器,並使它每次都重新分配x的值。

由於您正在開發游戲,因此划分代碼也是一個好主意。 這樣可以更輕松地將您的想法保持在每次事件觸發時的狀態。

例:

  • 函數gameLoss(){}-定義游戲丟失時的事件返回。 然后,您可以創建可編輯的規則來說明損失原因,而不必編輯損失
  • 函數gameActive(){}-定義什么是正常的游戲玩法。 正常游戲過程中發生的一切都應在此處進行管理。

  • function gameArea(){}-定義游戲畫布,該畫布對UI的作用大於對游戲性的作用(得分,壽命,屏幕尺寸等)

如果創建了單個函數,您會意識到在常規游戲中只需要一個隨機的'x'值,因此您可以在gameActive()函數中分配它,而不是將其作為全局變量。 然后,您將在一個時間間隔內根據需要多次調用gameActive()函數,以確保每次都創建一個唯一值。

旁注:不要亂扔不必要的全局變量。 調試時,這會使您的代碼變得一團糟。 -

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM