Canvas显然运行多个线程
Canvas apparently running multiple threads
我已经得到了这段代码,其目的是运行经典的Nokia snake。代码本身按预期工作,但我的问题是,当你再次调用main函数(重新启动游戏)时,画布将产生2条蛇,在第三个循环中,4条,第四个,8条等等。只使用jQuery和JS,这里是一个工作小提琴。播放丢失一次,重新加载,查看副本。
下面是加载游戏的代码: function snakeLoad() {
loadSnake();
$(document).on('click', '#startSnake', function () {
$(this).remove();
startSnake();
});
function loadSnake() {
//start button
$('main').append('<div id="snake"><button id="startSnake">Click to start</button><canvas id="snakeCanvas" height="380" width="380">Get a modern browser</canvas><div>');
}
;
这是初始化的函数:
function startSnake() {
//create grid
var snakeCanvas = document.getElementById("snakeCanvas");
var ctx = snakeCanvas.getContext("2d");
//Global game vars init
var randomSeed = function (min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
};
var snakeLength = 1;
var snakePositions = [{x: randomSeed(14, 25) * 10, y: randomSeed(14, 25) * 10}];
var foodPosition = {x: randomSeed(25, 35) * 10, y: randomSeed(25, 35) * 10};
var snakeDirection = ['N', 'S', 'E', 'W'][randomSeed(0, 3)];
var i = 0;
console.log(snakePositions, foodPosition, snakeDirection);
//Draw initial position
//Snake
ctx.fillStyle = "green";
ctx.fillRect(snakePositions[0].x, snakePositions[0].y, 10, 10);
//Food
ctx.fillStyle = "red";
ctx.fillRect(foodPosition.x, foodPosition.y, 10, 10);
然后是带有失败条件的主要游戏内循环:
var moveSnake = setInterval(function () {
//... doing its thing
//On losing:
clearInterval(moveSnake);
return endSnake();
这是游戏结束脚本和重启按钮的动作:
function endSnake() {
$('#snake').remove();
$('main').html('<br/><input class="endGamer" id="playSnakeAgain" type="button" value="Play
Snake
Again" data-app="snake">');
}
$(document).on('click', '#playSnakeAgain', function (e) {
$('main').empty();
snakeLoad();
});
问题是,当第二次调用snakload时,初始位置所在的代码部分会运行多次,每次运行更多。这里没有任何形式的循环,你知道为什么它会成倍地增加循环吗?
谢谢你的帮助,这几天我都快疯了。
每次调用snakeLoad
时,您都在向文档添加一个额外的click
处理程序:
$(document).on('click',....
所以当你点击loadSnake
中添加的#startSnake
按钮时,有多个事件处理程序正在运行,每个调用startSnake()
。相反,只需在snakeLoad
:
$(document).on('click', '#startSnake', function () {
$(this).remove();
startSnake();
});
function loadSnake() {
//start button
$('main').append('<div id="snake"><button id="startSnake">Click to start</button><canvas id="snakeCanvas" height="380" width="380">Get a modern browser</canvas><div>');
}
function snakeLoad() {
loadSnake();
}
@James Thorpe -非常感谢你为我指出了正确的方向。
最后我只是补充了一句:美元(文档)。('点击',' # startSnake ');美元(文档)。('点击',' # playSnakeAgain ');
在每次绑定之后,它现在按预期工作了。
相关文章:
- 在javaservlet doPost方法中启动线程时,无法返回异常消息
- javascript中的多线程
- Javascript支持多线程吗
- 如何在nodejs中创建线程池
- 在节点.js的多个线程中运行任务
- Do JS Reference Errors停止运行时线程执行
- Cordova应用程序在安卓系统上运行,但线程似乎在ios上冻结了;“由于页面加载而重置插件”;
- 是文件系统在 JavaScript 中的不同线程上运行
- 我可以在单独的线程中运行 UIWebView 吗?
- JavaScript 函数可以检查它是否在 Web Worker 线程上运行吗?
- 如何将包含在 eval 方法中的两个文件作为线程运行
- AJAX 以多线程方式运行
- 如何使 UI 线程连续运行
- 在所有主流浏览器中,GIF动画和javascript在同一个线程上运行,这是真的吗?
- Google V8引擎可以在不同的上下文、不同的线程中同时运行不同的javascript吗?
- 中断运行javascript脚本的java线程
- spin.js在IE和FF上长时间运行线程时停止旋转
- Canvas显然运行多个线程
- 浏览器脚本是否强制要求在单个线程上运行
- 是否可以在单独的线程中运行 HTML 5 视频