我有类的游戏:BodyPart,Snake和SnakeGame。 BodyPart类充当组成Snake类的节点,它基本上是BodyParts的链接列表,这些方法使用递归绘制并检索/设置在吃苹果时创建的每个BodyPart的位置。在蛇游戏中确定蛇运动的错误行为
我正在通过点击鼠标来模拟这个事件,测试从吃苹果到蛇的身体部位的添加。我的问题在于当窗口加载时引起的行为的奇怪,因为默认情况下<canvas>
元素没有焦点,所以我必须点击它才能听到<canvas>
上的键盘事件。初始点击给予<canvas>
焦点会导致创建身体部位并将其添加到蛇。 我的问题是,当蛇开始移动时,新创建的身体部位不会跟随头部。 只有几秒钟后,新创建的身体部位的功能才开始工作,并跟随头部。创建正文部分的其他点击不会产生任何错误,只会产生第一次点击。
我一直在试图找出原因,但不能。我确信当我不用鼠标点击创建新的身体部位时,这个问题会得到解决,但在这个特定的环境中,我真的很想知道这种行为的原因!
主要的代码在工作:
gameloop() {
var ctx = this.ctx;
this.snake.move();
ctx.clearRect(0,0, this.canvas.width, this.canvas.height);
this.snake.draw(ctx);
setTimeout($.proxy(this.gameloop, this), this.frameLength);
}
move() {
var head = this.head;
//recursively pass back new position for each BodyPart node to be drawn
head.passBackPosition();
//get new position for the root node
switch(this.direction) {
case "up":
head.yPosition -= this.velocity;
break;
case "down":
head.yPosition += this.velocity;
break;
case "left":
head.xPosition -= this.velocity;
break;
case "right":
head.xPosition += this.velocity;
break;
}
}
position(x, y) {
if(x && y) {
this.xPosition = x;
this.yPosition = y;
}else {
return {x:this.xPosition,y:this.yPosition};
}
}
继承人的游戏的jsfiddle:https://jsfiddle.net/gabewest1/hq8wqwt4/7/
这不会帮助你的代码工作,但你确实知道在你创建一个新的实例之前必须用JavaScript定义类,对吗? – PHPglue
@PHPglue是的,我知道。我已经定义了我的类,其余的代码已经定义了,我只是选择只发布与我的问题最相关的位,但是我的代码的其余部分处于小提琴中。 –