Javascript JS迷你游戏在网格中,首次复制后浏览器冻结
我正在尝试创建一个小游戏,在网格中复制邻居的细胞。我使用一个每秒绘制复制单元的网络工作者。我能够复制第一秒。如果我的初始单元格是row3col3,则新复制的单元格将是: row3col2,row3col4 row2col3,row4col3 问题是,在第一秒和复制之后,游戏冻结了,我无法做些什么。无法单击单元格等 编辑:几秒钟后,它转到'00:02',但Chrome崩溃了!出了点问题…“[重新加载]Javascript JS迷你游戏在网格中,首次复制后浏览器冻结,javascript,jquery,grid,web-worker,Javascript,Jquery,Grid,Web Worker,我正在尝试创建一个小游戏,在网格中复制邻居的细胞。我使用一个每秒绘制复制单元的网络工作者。我能够复制第一秒。如果我的初始单元格是row3col3,则新复制的单元格将是: row3col2,row3col4 row2col3,row4col3 问题是,在第一秒和复制之后,游戏冻结了,我无法做些什么。无法单击单元格等 编辑:几秒钟后,它转到'00:02',但Chrome崩溃了!出了点问题…“[重新加载] 编辑2:在查看使用的内存后,似乎我有一个内存溢出,16000 Mb!我的方法不好,所以 我知道我
编辑2:在查看使用的内存后,似乎我有一个内存溢出,16000 Mb!我的方法不好,所以 我知道我的代码没有得到真正的优化,我认为这就是问题所在。不幸的是,我无法编写更高效的代码,所以我向你们寻求一些帮助,给我一些探索的方法 代码如下:
var lastClicked;
var cellTab = Array();
var replicant = Array();
var newReplicant = Array();
var count = 5;
var rows = 20;
var cols = 20;
var randomRow = Math.floor((Math.random() * rows));
var randomCol = Math.floor((Math.random() * cols));
var grid = clickableGrid(rows, cols,randomRow,randomCol,cellTab, function(el,row,col,i){
console.log("You clicked on element:",el);
console.log("You clicked on row:",row);
console.log("You clicked on col:",col);
console.log("You clicked on item #:",i);
$(el).addClass('clicked');
lastClicked = el;
});
document.getElementById("game").appendChild(grid);
function clickableGrid( rows, cols, randomRow, randomCol, cellTab, callback ){
var i=0;
var grid = document.createElement('table');
grid.className = 'grid';
for (var r=0;r<rows;++r){
var tr = grid.appendChild(document.createElement('tr'));
for (var c=0;c<cols;++c){
var cell = tr.appendChild(document.createElement('td'));
$(cell).addClass('row'+r+'col'+c);
if(randomCol == c && randomRow == r)
{
storeCoordinate(r, c, replicant);
$(cell).css('background', '#000000');
}
storeCoordinate(r, c, cellTab);
cell.addEventListener('click',(function(el,r,c,i){
return function(){
callback(el,r,c,i);
}
})(cell,r,c,i),false);
}
}
return grid;
}
function storeCoordinate(xVal, yVal, array)
{
array.push({x: xVal, y: yVal});
}
function replicate(replicant)
{
for (var i = 0; i < replicant.length; i++) {
console.log(replicant);
var supRowX = replicant[i].x-1;
var supRowY = replicant[i].y;
storeCoordinate(supRowX, supRowY, newReplicant);
var subRowX = replicant[i].x+1;
var subRowY = replicant[i].y;
storeCoordinate(subRowX, subRowY, newReplicant);
var supColsX = replicant[i].x;
var supColsY = replicant[i].y-1;
storeCoordinate(supColsX, supColsY, newReplicant);
var subColsX = replicant[i].x;
var subColsY = replicant[i].y+1;
storeCoordinate(subColsX, subColsY, newReplicant);
}
}
function drawReplicant(replicant, cellTab)
{
for (var i = 0; i < replicant.length; i++) {
if($.inArray(replicant[i], cellTab))
{
$('.row'+replicant[i].x+'col'+replicant[i].y).css('background', '#000000');
}
}
}
var w = null; // initialize variable
// function to start the timer
function startTimer()
{
// First check whether Web Workers are supported
if (typeof(Worker)!=="undefined"){
// Check whether Web Worker has been created. If not, create a new Web Worker based on the Javascript file simple-timer.js
if (w==null){
w = new Worker("w.countdown.js");
}
// Update timer div with output from Web Worker
w.onmessage = function (event) {
document.getElementById("timer").innerHTML = event.data;
console.log(event.data);
replicate(replicant);
replicant = newReplicant;
drawReplicant(replicant, cellTab);
};
} else {
// Web workers are not supported by your browser
document.getElementById("timer").innerHTML = "Sorry, your browser does not support Web Workers ...";
}
}
// function to stop the timer
function stopTimer()
{
w.terminate();
timerStart = true;
w = null;
}
startTimer();
可能是因为我使用jQuery?你说的游戏冻结到底是什么意思?浏览器是否锁定并停止响应,或者只是游戏停止响应点击事件?在第一种情况下,它可能是一个infinte循环。如果是后者,则有某种原因阻止单击事件附加到元素。尝试添加一个或多个控制台语句并观察到底发生了什么。浏览器似乎停止响应,console.logevent.data;应返回“00:01”、“00:02”、“00:03”。。。但是在'00:01'被冻结。我无法选择“00:01”字符串。。编辑:几秒钟后,它转到'00:02',但Chrome崩溃了!出现问题…“[RELOAD]查看使用的内存后,似乎我的内存溢出,16000 Mb。。。世界跆拳道联盟。我的方法看起来很糟糕,我需要改变它。。。
var timerStart = true;
function myTimer(d0)
{
// get current time
var d=(new Date()).valueOf();
// calculate time difference between now and initial time
var diff = d-d0;
// calculate number of minutes
var minutes = Math.floor(diff/1000/60);
// calculate number of seconds
var seconds = Math.floor(diff/1000)-minutes*60;
var myVar = null;
// if number of minutes less than 10, add a leading "0"
minutes = minutes.toString();
if (minutes.length == 1){
minutes = "0"+minutes;
}
// if number of seconds less than 10, add a leading "0"
seconds = seconds.toString();
if (seconds.length == 1){
seconds = "0"+seconds;
}
// return output to Web Worker
postMessage(minutes+":"+seconds);
}
if (timerStart){
// get current time
var d0=(new Date()).valueOf();
// repeat myTimer(d0) every 100 ms
myVar=setInterval(function(){myTimer(d0)},1000);
// timer should not start anymore since it has been started
timerStart = false;
}