にレンダリング台無しそのsleep
もの:。再帰呼び出しは、私は次のコードを持っている(無視ゲーム
function game_loop(snake){
sleep(200);
background(200);
draw_borders();
const r = snake_draw(snake_move(snake.x, snake.y));
game_loop(r);
}
function setup() {
createCanvas(w, h);
frameRate(10);
noLoop();
}
function draw() {
game_loop({x: snake_initial_x, y: snake_initial_y});
}
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
function snake_move(x, y){
const x_speed = 1;
const y_speed = 0;
return {x: x + x_speed, y: y + y_speed };
}
function snake_draw(position){
const snake_color = 255 ;
fill(snake_color);
rect(position.x * sqr_size, position.y * sqr_size, sqr_size, sqr_size);
return position;
};
const border_color = 81;
function draw_borders(){
draw_row_borders(0);
draw_column_borders(1);
}
function draw_row_borders(x){
if(x >= 0 && x < cols) {
fill(border_color);
rect(x * sqr_size, 0, sqr_size, sqr_size);
fill(border_color);
rect(x * sqr_size, (rows - 1) * sqr_size, sqr_size, sqr_size);
draw_row_borders(x + 1, 0);
}
}
function draw_column_borders(y){
if(y >= 1 && y < rows - 1) {
fill(border_color);
rect(0, y * sqr_size, sqr_size, sqr_size);
fill(border_color);
rect((cols - 1) * sqr_size, y * sqr_size, sqr_size, sqr_size);
draw_column_borders(y + 1);
}
}
コードの最後の部分が必要ですが、私は念のためにそれらを追加していない
私の問題は、私はgame_loop(r)
またはgame_loop(snake_draw(snake_move(snake.x, snake.y)))
呼び出すとき、ゲームはすべてのレンダリングを停止していることですが、私はgame_loop
内console.log()
を置けば、私はそれが(すなわち、関数を呼び出すsnake.x, snake.y
を更新)働いていることがわかります。
なぜこの再帰呼び出しがすべてを混乱させるのですか?
私はp5jsフレームワークを使っています。
通常、JavaScriptコードはイベントベース(すなわち、タイマーイベント)であり、ビジーウェイトを使用していません...あなたが使用しているフレームワークに、タイマー付きのゲームループを書く例があります。 –
フレームワークは ' ** 'noLoop()'が呼び出されていない限り(私が呼び出した)、draw()は1秒間に60回、**描画されます。私が書いた 'game_loop()'はそれとは関係ありません! – csTroubled
'game_loop()'(無限再帰)があなたのコードと何の関係もないのであれば、それをなぜ投稿に含めましたか? (また 'game_loop'があなたの' draw'から呼び出されています - それがどうしても関係ないことはわかりません) –