2012-05-10 82 views
-1

我遇到了一個我試圖製作的遊戲的問題。這裏是我的代碼(非常基本):JavaScript遊戲循環不起作用

var canvas = document.createElement("canvas"); 
var gameCanvas = canvas.getContext("2d"); 
canvas.width = 500; 
canvas.height = 500; 
document.body.appendChild(canvas); 

// Global variables 
var game; 
game.fps = 60; 
game._intervalId = setInterval(game.run, 1000/game.fps); 

// Game loop 
game.run = function() { 
    game.draw(); 
}; 

// Functions 
game.draw = function() { 
    // Background image 
    var bgImage = new Image(); 
    bgImage.src = "img/background.png"; 
    // Player image 
    var playerImage = new Image(); 
    playerImage.src = "img/player.png"; 
    // Draw 
    gameCanvas.drawImage(bgImage, 0, 0); 
    gameCanvas.drawImage(playerImage, 10, 10);  
} 

// Game over 
document.getElementById('end').onclick = function stop(){ 
    clearInterval(game._intervalId);  
} 

// Run 
window.onload = game.run(); 

遊戲無法正常運行。我做錯了什麼,還是有我錯過的東西?這裏是一個頁面的鏈接:http://dl.dropbox.com/u/33213779/Game/demo_me.html

謝謝。

+0

你是什麼意思的「不正常運行」? – m90

+0

@ m90如果您查看鏈接,畫布似乎無法加載,或者圖像無法加載。我不知道這是遊戲循環還是加載畫布/圖像代碼的問題。 – Harry

回答

1

我可以從你寫的內容中發現兩個問題。

第一個是,你必須初始化你的遊戲變量作爲一個對象:

var game = {}; // = {} initializes a new Object 
game.fps = 60; 
.... 

的第二個問題是,你是不是預加載的圖像源(而不是你加載它們各60次秒......),以便畫布無法訪問它們,因爲它們仍在加載。

相反,你可以使用這樣的機制:

var bgImage = new Image(); 
bgImage.src = "img/background.png"; 
bgImage.onload = checkPreload; 

var playerImage = new Image(); 
playerImage.src = "img/player.png"; 
playerImage.onload = checkPreload; 

var loadedPics = 0; 
function checkPreload(){ 
loadedPics++; 
if (loadedPics == 2){ 
buildGame(); //start game 
} 
} 

function buildGame(){ 
//inside this function you should be safe to refer to bgImage and playerImage 
} 

注意,這是非常過於簡單化作爲圖像預加載是一個有很多缺陷的受災面積。但我想你會明白的。

順便說一句this是一個關於遊戲邏輯和所有東西畫布的非常好的教程。

+0

謝謝,我會閱讀它! – Harry

1

在Chrome中,遊戲會生成一個停止執行的錯誤。在var遊戲之後;遊戲是不確定的,那麼你做你game.fps =東西,就像你在做undefined.fps =東西,和JavaScript生氣。第一個補丁將做var game = {}

我不明白你爲什麼一次又一次地在一個循環中創建bgImage和播放器。即使這種方法有效,也會產生問題。

var canvas = document.createElement("canvas"); 
    var gameCanvas = canvas.getContext("2d"); 
    canvas.width = 500; 
    canvas.height = 500; 

     canvas.setAttribute("style","border:1px solid red"); 
    document.body.appendChild(canvas); 

    // Global variables 
    var game = {}; 
    game.fps = 60; 


    // Game loop 
    game.run = function() { 
     game.draw(); 
    }; 

    // Resource loader 
    game.loader = function() { 
     // Background image 
     game.bgImage = new Image(); 
     game.bgImage.src = "img/background.png"; 

     // Player image 
     game.playerImage = new Image(); 

     game.playerImage.src = "img/player.png"; 
    };     

    // Functions 
    game.draw = function() { 
     // Draw 
     gameCanvas.drawImage(game.bgImage, 0, 0); 
     gameCanvas.drawImage(game.playerImage, 10, 10);  
    } 
      game.loader(); 
    game._intervalId = setInterval(game.run, 1000/game.fps); 

此版本的代碼似乎按照您的意圖工作。

+0

等等,你建議我爲遊戲創建一個函數嗎?請稍微清楚一點,謝謝。 – Harry

+0

@哈里,答案很清楚。 '{}'是一個新的空對象。 – kay

+0

是的,我建議創建一個initlization函數來加載資源。 – Tei