2014-01-30 3 views
1

이것은 index.html 파일입니다.뱀 게임을 위해 easeljs 및 javascript를 사용하여 이미지를 추가합니다.

<html> 
<head> 

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

<title>Dragon Progression</title> 
<script type="text/javascript" src="library/easeljs-0.6.0.min.js"></script> 
<script type="text/javascript" src="libs/ndgmr.Collision.js"></script> 
<script type="text/javascript" src="js/startScreen.js"></script> 
<script type="text/javascript" src="js/gameScreen.js"></script> 

</head> 

<body onLoad="renderStartScreen()"> 

<canvas id="canvas1" width="1024" height="698"> 

    Browser does not support canvas. Please upgrade browser. 

    </canvas> 

</body> </html> 

이 은 StartScreen.js

var introBackground; 
var startScreenBtn; 
var startScreenBtnImg; 
var stage; 
var stageHeight; 
var stageWidth; 
//this function render start screen 
function renderStartScreen() 
{ 
stage = new createjs.Stage("canvas1"); 
stage.enableMouseOver(); 
stageWidth = document.getElementById("canvas1").width; 
stageHeight = document.getElementById("canvas1").height; 

introBackground = new createjs.Bitmap("assets/images/bg.jpg"); 
introBackground.x = introBackground.y = 0; 
stage.addChild(introBackground); 

startScreenBtn = new createjs.Container(); 
startScreenBtn.x = 500; 
startScreenBtn.y = 300; 
startScreenBtnImg = new createjs.Bitmap("assets/images/start_button_normal.png"); 
stage.addChild(startScreenBtn); 
startScreenBtn.addChild(startScreenBtnImg); 


var btnBg = new createjs.Shape(); 
btnBg.graphics.beginFill("#FFFFFF"); 
btnBg.graphics.drawRect(0, 0, 143, 35); 
btnBg.alpha = 0.01; 
startScreenBtn.addChild(btnBg); 
startScreenBtn.addEventListener("mouseover", onstartScreenBtnOver); 
startScreenBtn.addEventListener("mouseout", onstartScreenBtnOut); 
startScreenBtn.addEventListener("click", onstartScreenBtnClick); 
createjs.Ticker.setFPS(45); 
createjs.Ticker.addEventListener("tick", startScreenTickHandler); 

} 
//event handler function get called on start button roll over 
function onstartScreenBtnOver() 
{ 
startScreenBtnImg.image.src = "assets/images/start_button_over.png"; 
} 
//event handler function get called on start button roll out 
function onstartScreenBtnOut() 
{ 
startScreenBtnImg.image.src = "assets/images/start_button_normal.png"; 
} 
//event handler function get called on start button click 
function onstartScreenBtnClick(event) 
{ 
cleanupStartScreen(); 
} 
//event handler function get called on specified interval 
function startScreenTickHandler() 
{ 
stage.update(); 
} 
//clean start screen and loads main game 
function cleanupStartScreen() 
{ 
stage.removeAllChildren(); 
stage.update(); 
stage.removeAllEventListeners(); 
createjs.Ticker.removeEventListener("tick", startScreenTickHandler); 
loadMainGame(); 
} 

이 gamescreen.js 파일입니다.

var background; 
var snakeArray = []; 
//var snakeBody; 
var snake; 
var snakeWidth=25; 
var food; 
var keyCode; 
var CHECK_HIT_ALPHA = 1; 
var currDirection; 
var tempX; 
var tempY; 
var prevX; 
var prevY; 


function loadMainGame() 
{ 
background = new createjs.Bitmap("assets/images/loading_background.jpg"); 
background.x=0; 
background.y=0; 
//snake = new createjs.Container(); 


//snakeTail = new createjs.Shape(); 
//snakeTail.graphics.beginFill("#E2DC1E").drawPolyStar(40,65,15,3,0,360); 
createSnakeHead(); 
createFood(); 
snakeArray.currDirection = ""; 
stage.addChild(background,snake,food); 
createjs.Ticker.addEventListener("tick", snakeMovement); 
//createjs.Ticker.addEventListener("tick", snakeBodyMovement); 
window.onkeydown=function(e) 
{ 

    keyCode = e.keyCode || e.which || window.Event; 
    if(keyCode == 37 && currDirection != "right") 
    { 
     currDirection = "left"; 
     snake.rotation= -90; 
     tempX = snakeArray[0].x; 
     tempY = snakeArray[0].y; 
    } 
    else if(keyCode == 39 && currDirection !="left") 
    { 
     currDirection = "right"; 
     snake.rotation = 90; 
     tempX = snakeArray[0].x; 
     tempY = snakeArray[0].y; 
    } 
    else if(keyCode == 38 && currDirection != "down") 
    { 
     currDirection = "up"; 
     snake.rotation = 360; 
     tempX = snakeArray[0].x; 
     tempY = snakeArray[0].y; 
    } 
    else if(keyCode == 40 && currDirection != "up") 
    { 
     currDirection = "down"; 
     snake.rotation = 180; 
     tempX = snakeArray[0].x; 
     tempY = snakeArray[0].y; 
    } 
} 

} 
function createSnakeHead() 
{ 
    snake = new createjs.Bitmap("assets/images/snake.png"); 
snake.type = "head"; 
var randX = Math.floor(Math.random()*800); 
var randY = Math.floor(Math.random()*500); 
snake.x = randX; 
snake.y = randY; 
snake.regX = snake.image.width/2; 
snake.regY = snake.image.height/2; 
snakeArray.push(snake); 
} 

function createFood() 
{ 
food = new createjs.Bitmap("assets/images/food.png"); 
var randX = Math.floor(Math.random()*800); 
var randY = Math.floor(Math.random()*500); 
food.x = randX; 
food.y = randY; 
} 

function snakeMovement() 
{ 
console.log(snakeArray.length); 
for(var i=0;i<=snakeArray.length-1;i++) 
{ 
    if(currDirection=="left") 
    { 
     snakeArray[i].rotation= -90; 
     snakeArray[i].x = snakeArray[i].x - 2; 
     prevX = snakeArray[i].x; 
     prevY = snakeArray[i].y; 
     if (snakeArray[i].x <= 0) 
     { 
      snakeArray[i].x = stageWidth; 
     } 
     snakeBodyMovement(prevX,prevY); 
    } 
    else if(currDirection == "right") 
    { 
     //tempX = snakeArray[0].x; 
     snakeArray[i].rotation= 90; 
     snakeArray[i].x = snakeArray[i].x + 2; 
     prevX = snakeArray[i].x; 
     prevY = snakeArray[i].y; 
     if (snakeArray[i].x >= stageWidth) 
     { 
      snakeArray[i].x = 0; 
     } 
     snakeBodyMovement(prevX,prevY); 
     snakeArray[i].currDirection = "right"; 
    } 
    else if(currDirection == "up") 
    { 
     //tempY = snakeArray[0].y; 
     snakeArray[i].rotation= 360; 
     snakeArray[i].y = snakeArray[i].y - 2; 
     prevX = snakeArray[i].x; 
     prevY = snakeArray[i].y; 
     if(snakeArray[i].y <=0) 
     { 
      snakeArray[i].y = stageHeight; 
     } 
     snakeBodyMovement(prevX,prevY); 
     snakeArray[i].currDirection = "up"; 
    } 
    else if(currDirection == "down") 
    { 
     //var tempY = snakeArray[0].y; 
     snakeArray[i].rotation= 180; 
     snakeArray[i].y = snakeArray[i].y + 2; 
     prevX = snakeArray[i].x; 
     prevY = snakeArray[i].y; 
     if(snakeArray[i].y >= stageHeight) 
     { 
      snakeArray[i].y = 0; 
     } 
     snakeBodyMovement(prevX,prevY); 
     snakeArray[i].currDirection = "down"; 
    } 
} 
foodSnakeCollision(); 
stage.update(); 
} 

function foodSnakeCollision() 
{ 
var intersection = ndgmr.checkPixelCollision(snake,food,CHECK_HIT_ALPHA); 
if(intersection)  
{ 
    console.log("Eat food"); 
    var randX = Math.floor(Math.random()*800); 
    var randY = Math.floor(Math.random()*500); 
    food.x = randX; 
    food.y = randY; 
    createSnake(); 
} 
} 

function createSnake() 
{ 
var snakeBody = new createjs.Bitmap("assets/images/snake.png"); 
snakeBody.type = "body"; 
snakeBody.regX = snake.image.width/2; 
snakeBody.regY = snake.image.height/2; 
if(currDirection=="left") 
{ 

    snakeBody.x = snakeArray[snakeArray.length-1].x + 25; 
    snakeBody.y =snakeArray[snakeArray.length-1].y +0; 
} 
if(currDirection == "right") 
{ 
    snakeBody.x = snakeArray[snakeArray.length-1].x - 25; 
    snakeBody.y =snakeArray[snakeArray.length-1].y - 0; 
} 
if(currDirection == "up") 
{ 
    snakeBody.x = snakeArray[snakeArray.length-1].x + 0; 
    snakeBody.y =snakeArray[snakeArray.length-1].y + 25; 
} 
if(currDirection == "down") 
{ 
    snakeBody.x = snakeArray[snakeArray.length-1].x - 0; 
    snakeBody.y =snakeArray[snakeArray.length-1].y - 25; 
} 
snakeArray.push(snakeBody); 
console.log(snakeArray.length + "after collision"); 
stage.addChild(snakeBody); 
} 

function snakeBodyMovement(prevX,prevY) 
{ 
for(var i=1;i<=snakeArray.length-1;i++) 
{ 
    if(currDirection == "left") 
    { 
     snakeArray[i].x = prevX + 15; 
     snakeArray[i].y = prevY; 
    } 
    else if(currDirection == "right") 
    { 
     snakeArray[i].x = prevX - 15; 
     snakeArray[i].y = prevY; 
    } 
    else if(currDirection == "up") 
    { 
     snakeArray[i].x = prevX; 
     snakeArray[i].y = prevY + 15; 
    } 
    else if(currDirection == "down") 
    { 
     snakeArray[i].x = prevX; 
     snakeArray[i].y = prevY - 15; 
    } 


} 
} 

gameScreen.js 파일에 snakebody를 사용하여 추가 한 새로운 snakebody가 하나씩 추가되지 않습니다. 다른 하나 아래에 하나를 추가하고 있습니다. 뱀 본체와 음식과 충돌하면 추가되는 뱀 부품을 부드럽게 움직이는 방법을 제안하십시오.

+0

이 질문에는 많은 불필요한 코드가 있습니다. 문제를 설명하기에 충분한 코드가 포함되도록 코드를 변경 하시겠습니까? –

+0

gameScreen.js 파일 만 고려하십시오. 흐름을 이해하려면 모든 기능이 필요합니다. – monisha

답변

1

여기 내 문제의 근본 원인은 이미지를 미리로드하지 않는다는 것입니다. GameScreen.js의 코드 블록을 고려하십시오.

snake = new createjs.Bitmap("assets/images/snake.png"); 
snake.type = "head"; 
var randX = Math.floor(Math.random()*800); 
var randY = Math.floor(Math.random()*500); 
snake.x = randX; 
snake.y = randY; 
console.log("Snake head width: " + snake.image.width); 
snake.regX = snake.image.width/2; 
snake.regY = snake.image.height/2; 

비트 맵 선언이있을 때까지 이미지가 서버에서로드되지 않습니다. 이미지 로딩은 비동기이므로 이미지가 라인 snake.regX = snake.image.width/2;에 도달 할 때 반드시로드되지 않으며 폭과 높이가 모두 0이됩니다. 추가 한 콘솔 로그를보고이를 확인할 수 있습니다. 등록 포인트를 없애면 모든 포지션도 해제됩니다.

제 제안은 제품군의 일부인 라이브러리를 사용하여 이미지를 미리로드하는 것입니다. http://www.createjs.com/Docs/PreloadJS/modules/PreloadJS.html.