Javascript 如何启动按键事件的蛇游戏?
我使用HTML5画布和JavaScript创建了一个简单的Snake游戏。我几乎完成了这个小项目,然而,我有一个问题我不能解决。加载时,snake的游戏会自动启动,通常会导致“游戏结束”,我希望玩家能够首先按下他们想要去的方向,然后开始游戏。我已经尝试了我能想到的所有可能的方法,主要是使用“keydown”或其他类似的事件侦听器。不管我把代码放在哪里,似乎都没用。有什么想法吗?非常感谢所有抽出时间帮助我的人,非常感谢。下面,我将为那些想要帮助的人留下项目的代码 蛇类游戏网站: HTML/CSS:Javascript 如何启动按键事件的蛇游戏?,javascript,html,html5-canvas,event-listener,Javascript,Html,Html5 Canvas,Event Listener,我使用HTML5画布和JavaScript创建了一个简单的Snake游戏。我几乎完成了这个小项目,然而,我有一个问题我不能解决。加载时,snake的游戏会自动启动,通常会导致“游戏结束”,我希望玩家能够首先按下他们想要去的方向,然后开始游戏。我已经尝试了我能想到的所有可能的方法,主要是使用“keydown”或其他类似的事件侦听器。不管我把代码放在哪里,似乎都没用。有什么想法吗?非常感谢所有抽出时间帮助我的人,非常感谢。下面,我将为那些想要帮助的人留下项目的代码 蛇类游戏网站: HTML/CSS:
window.onload=函数(){
var cvs=document.getElementById(“画布”);
var ctx=cvs.getContext(“2d”);
var cvsW=cvs.width;
var cvsH=cvs高度;
var snakeW=20;
var snakeH=20;
分数=0;
var direction=“right”;
此.document.addEventListener(“keydown”,getDirection);
功能方向(e){
如果(e.keyCode==37&&direction!=“right”){
方向=“左”;
}否则如果(e.keyCode==38&&direction!=“向下”){
方向=“向上”;
}否则如果(e.keyCode==39&&direction!=“left”){
direction=“right”;
}否则如果(e.keyCode==40&&direction!=“向上”){
方向=“向下”;
}
}
函数drawSnake(x,y){
ctx.fillStyle=“#507786”;
ctx.fillRect(x*蛇,y*蛇,蛇,蛇);
ctx.fillStyle=“#507786”;
ctx.strokeRect(x*蛇,y*蛇,蛇,蛇);
}
牵引蛇(4,5);
var-len=4;
var-snake=[];
对于(变量i=len-1;i>=0;i--){
蛇推({
x:我,
y:0
});
}
食物={
x:Math.floor(Math.random()*(cvsW/snakeW-1)+1),
y:Math.floor(Math.random()*(cvsH/snakeH-1)+1)
}
功能性食品(x,y){
ctx.fillStyle=“黑色”;
ctx.fillRect(x*蛇,y*蛇,蛇,蛇);
ctx.fillStyle=“#507786”;
ctx.strokeRect(x*蛇,y*蛇,蛇,蛇);
}
函数检查冲突(x、y、数组){
对于(var i=0;i=cvsW/snakeW | |蛇>=cvsH/snakeH
||检查碰撞(蛇、蛇、蛇)){
snake=null;
document.getElementById(“gameover”).innerHTML=“gameover”;
setInterval(函数(){
location.reload();
}, 3000);
}
if(snakeX==food.x&&snakeY==food.y){
食物={
x:Math.floor(Math.random()*(cvsW/snakeW-1)+1),
y:Math.floor(Math.random()*(cvsH/snakeH-1)+1)
}
var newHead={
x:snakeX,
y:斯纳基
};
分数+=1
document.getElementById(“gameScore”).innerHTML=score;
}否则{
snake.pop();
var newHead={
x:snakeX,
y:斯纳基
};
}
蛇。未移位(新头);
}
设置间隔(抽签,60);
}
蛇类游戏
* {
填充:0px;
边际:0px;
}
#帆布{
背景色:#8BAC0F;
-网络工具包盒阴影:10px 10px 5px 0px rgba(0,0,0,0.75);
-moz盒阴影:10px 10px 5px 0px rgba(0,0,0,0.75);
盒子阴影:10px 10px 5px 0px rgba(0,0,0,0.75);
}
#蛇类{
文本对齐:居中;
}
#蛇形石{
字体系列:“Sniglet”,草书;
字号:80px;
边缘顶端:40px;
边缘底部:20px;
}
#蛇类{
字体系列:“Sniglet”,草书;
字体大小:20px;
边缘底部:20px;
}
#游戏结束{
字体系列:“Sniglet”,草书;
字体大小:50px;
边缘底部:15px;
}
#页脚文本{
字体系列:“Sniglet”,草书;
字体大小:35px;
边缘顶部:25px;
}
Snake它会自动启动,因为您稍后会在代码下方调用drawSnake(4,5)
,并且您已经将初始化方向设置为“右”
您应该能够通过在初始化时将类似于hasStarted
的变量赋值为false来解决此问题。然后在onKeydown处理程序中检查hasStarted
是否为true或false。如果为false(游戏尚未开始),hasStarted
设置为true,则应调用setInterval(draw,60)
var hasStarted = false;
var direction = “”;
this.document.addEventListener("keydown", getDirection);
function getDirection(e) {
if (!hasStarted) {
hasStarted = true
switch e.keyCode {
case 37:
direction = "left";
break;
case 38:
direction = "up";
break;
case 39:
direction = "right";
break;
case 40:
direction = "down";
break;
default:
direction = "right";
break;
}
setInterval(draw, 60);
} else {
if (e.keyCode == 37 && direction != "right") {
direction = "left";
} else if (e.keyCode == 38 && direction != "down") {
direction = "up";
} else if (e.keyCode == 39 && direction != "left") {
direction = "right";
} else if (e.keyCode == 40 && direction != "up") {
direction = "down";
}
}
}
编辑#1(马蒂亚斯的荣誉):
您还必须删除最后一行代码中对setInterval的调用。它会自动启动,因为您稍后会调用drawSnake(4,5)
,并且您已经将初始化方向设置为“right”
您应该能够通过在初始化时将类似于hasStarted
的变量赋值为false来解决此问题。然后在onKeydown处理程序中检查hasStarted
是否为true或false。如果我
...
var direction = "";
...
...
function draw() {
if(direction != ""){
...
}
}
...
var direction = "start";
var snakeX = snake[0].x;
var snakeY = snake[0].y;
if (direction == "start")
{
snakeX = snakeX*.0001;
}