2012-05-10 8 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

В хроме игра генерирует ошибку, которая останавливает выполнение. После var game; игра не определена, то вэнь вы делаете game.fps = что-то, как будто вы делаете undefined.fps = something, и 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

Да, я предлагаю создать функцию инициализации для загрузки ресурсов. – Tei