2014-01-31 3 views
2

Я пытаюсь разработать игру, похожую на змеиные игры на старых телефонах модели. Я создал игру, которую вы можете посмотреть на here. Но, контролируя змею, я переключил ширину и высоту змеи, чтобы повернуться в любом направлении, но я хочу, чтобы змея выглядела как настоящая змея, я имею в виду, что она должна иметь форму L при повороте и постепенно превращаться в прямую снова, Пожалуйста, дайте мне любую идею, как я могу это сделать, используя холст. змея является наполнителем() в холсте.Игра с использованием холста HTML5

Ниже приведен полный код ..

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Snake</title> 
</head> 
<body> 
Use Arrow keys of to control the snake. 
<canvas id="can_game" height="400" width="400" style="border:1px solid;"></canvas> 
<div id="score_div"></div> 
<div id="time">0.00</div> 
<script type="text/javascript"> 
var score=0,fps=30,canvas=document.getElementById("can_game"),context=canvas.getContext('2d'),dir="",score_div=document.getElementById("score_div"),width_h=45,pass='left',timediv=document.getElementById("time"),time=0.00; 
var player = { 
    color : '#ff00', 
    px :'180', 
    py : '384', 
    height : '12', 
    width : '45', 
    draw : function(){ 
     context.fillRect(this.px,this.py,this.width,this.height); 
    } 
} 
var ball = { 
    x :Math.round(Math.random(4)*400), 
    y : Math.round(Math.random(4)*400), 
    draw : function() { 
    context.beginPath(); 
    context.fillStyle = "#ff0000"; 
    context.arc(this.x,this.y,6,0,2*Math.PI,false); 
    context.fill(); 
    } 
} 
setInterval(function(){ 
    score_div.innerHTML=score; 
    timediv.innerHTML=Math.round(time/1000)+" Seconds"; 
    time=parseInt(time)+1000/fps; 
    update(); 
    draw(); 
    var test=hitTestPoint(player.px,player.py,player.width,player.height,ball.x,ball.y); 
    if(test===true) 
    { 
     ball.x=Math.round(Math.random(80)*400); 
     ball.y=Math.round(Math.random(80)*400); 
     score+=10; 
     width_h+=3; 
    } 
    console.log(player.py,canvas.width); 
    if(player.px <=0) 
     player.px=360; 
    else if(player.px >= (canvas.width)) 
     player.px=0; 
    else if(player.py <= 0) 
     player.py=360; 
    else if(player.py >= (canvas.height)) 
     player.py=0; 
    document.onkeydown = function() { 
     var key_pressed = window.event.keyCode; 
    /* if(key_pressed == 32) 
      dir = "freeze";*/ 
     if(key_pressed == 37) 
      dir = "left"; 
     else if(key_pressed == 39) 
      dir = "right"; 
     else if(key_pressed == 38) 
      dir = "up"; 
     else if(key_pressed == 40) 
      dir = "down"; 
}; 
},1000/fps); 
function hitTestPoint(x1, y1, w1, h1, x2, y2) 
{ 
    if ((x1 <= x2 && x1+w1 >= x2) && 
     (y1 <= y2 && y1+h1 >= y2)) 
      return true; 
    else 
     return false; 
} 
function draw() 
{ 
    context.clearRect(0,0,canvas.width,canvas.height); 
    player.draw(); 
    ball.draw(); 
    context.fill(); 
} 
function update() 
{ 
switch(dir){ 
    case "left": 
     player.px-=3; 
     player.width=width_h; 
     player.height=12; 
     break; 
    case "right": 
     player.px= parseInt(player.px)+3; 
     player.width=width_h; 
     player.height=12; 
     break; 
    case "up": 
      player.py-=3; 
      player.width=12; 
      player.height=width_h; 
     break; 
    case "down": 
      player.py+=3; 
      player.width=12; 
      player.height=width_h; 
     break; 
    } 
} 
</script> 
</body> 
</html> 
+0

пожалуйста показать код, чтобы получить помощь. Очень сложно дать ответ с предоставленной вами информацией. –

+0

вам придется использовать несколько прямоугольников – Markasoftware

+0

Спасибо @Markasoftware. Я попробую. – Vignesh

ответ

2

Вы можете взглянуть на эту CSS deck tutorial, чтобы решить вашу проблему.

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

Так что, когда змей движется в другом направлении (или оси) его лица блока постепенно добавляют в другой оси, и это дает иллюзию змеиного поворота в том, как вы ожидаете, что

Смежные вопросы