2016-11-18 75 views
0

我有类的游戏: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/

+0

这不会帮助你的代码工作,但你确实知道在你创建一个新的实例之前必须用JavaScript定义类,对吗? – PHPglue

+0

@PHPglue是的,我知道。我已经定义了我的类,其余的代码已经定义了,我只是选择只发布与我的问题最相关的位,但是我的代码的其余部分处于小提琴中。 –

回答

1

我打你的小提琴和身体不按头发生边界附近,其中x == 0或Ÿ== 0。

读你的代码,我发现:

position(x, y) { 
    if(x && y) { 
     this.xPosition = x; 
     this.yPosition = y; 
    }else { 
     return {x:this.xPosition,y:this.yPosition}; 
    } 
} 

这意味着只要你在任何这些边界的,下面的行不执行:

this.xPosition = x; 
    this.yPosition = y; 

解决方案:

position(x, y) { 
    this.xPosition = x; 
    this.yPosition = y; 
    return {x:this.xPosition,y:this.yPosition}; 
} 

看小提琴:https://jsfiddle.net/vzsf2nee/1/