BodyPart、Snake、SnakeGameというクラスのスネークゲームがあります。 BodyPartクラスは、本質的に、BodyPartのリンクリストであるSnakeクラスを作成するノードとして機能します。このメソッドは、リンゴが食べられたときに作成された各BodyPartの位置を取得および設定するために再帰を使用します。スネークゲームでヘビの動きの間違った行動を特定する
マウスクリックでこのイベントをシミュレートすることで、Snakeに体の部分を追加してリンゴを食べることをテストしています。私の問題は、デフォルトでは<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/
これはあなたのコードがうまくいくのには役立ちませんが、 'new'インスタンスを作成する前にクラスをJavaScriptで定義しなければならないことを知っていますよね? – PHPglue
@PHPglue yea i know。私のクラスは既に他のコードと定義されていますが、私の問題に最も関連性のあるビットを投稿するだけですが、残りのコードはフィドルです。 –