Javascript 拉格运动与帆布游戏
嘿,伙计们,我不完全确定我做错了什么。我玩过一些HTML5游戏,它们似乎遇到了不同的问题。这幅画落后于运动,看起来很奇怪。这里的情况似乎不是这样 在我的游戏中,画图看起来不错,但他移动的时候,画图就像每一秒一样滞后。移动是箭头键。如果我设置它自动移动,它也可以不使用箭头键,所以我不认为这是一个键检测问题 这几乎就像垃圾收集器每秒都在运行一样。我想我没有吐出那么多东西 我使用的是Chrome21Macosx和Firefox14 下面是js对相关代码的修改 这是罚款的铬金丝雀。我不知道这是否只是因为在金丝雀中javascript比标准chrome快得多。在最新的Firefox中,这很糟糕。我不确定我做错了什么。我正在根据时间更新移动。如果我把它拿出来,尽管它仍然很糟糕 我只是想知道是否有什么东西会让任何人觉得与众不同。谢谢你的帮助Javascript 拉格运动与帆布游戏,javascript,html,canvas,Javascript,Html,Canvas,嘿,伙计们,我不完全确定我做错了什么。我玩过一些HTML5游戏,它们似乎遇到了不同的问题。这幅画落后于运动,看起来很奇怪。这里的情况似乎不是这样 在我的游戏中,画图看起来不错,但他移动的时候,画图就像每一秒一样滞后。移动是箭头键。如果我设置它自动移动,它也可以不使用箭头键,所以我不认为这是一个键检测问题 这几乎就像垃圾收集器每秒都在运行一样。我想我没有吐出那么多东西 我使用的是Chrome21Macosx和Firefox14 下面是js对相关代码的修改 这是罚款的铬金丝雀。我不知道这是否只是因为
sg = Class.extend({
});
sg.entities = [];
sg.buttonStates = [];
sg.createEntity = function (entity) {
this.entities.push(entity);
};
window.requestAnimFrame = (function () {
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
function (callback, element) {
window.setTimeout(callback, 1000 / 60);
};
})();
(function defineUtil() {
sg.util = {};
sg.util.getRandomInt = function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
};
sg.util.getRandomNumber = function getRandomNumber(min, max) {
return Math.random() * (max - min) + min;
};
})();
/*************************/
(function createEntity() {
var Entity = Class.extend({
init: function (x, y) {
this.name = 'Entity';
this.health = 100;
this.pos = {
x: x,
y: y
};
this.vel = {
x: 0,
y: 0
};
this.accel = {
x: 0,
y: 0
}
console.log(this.name + ' created ' + x + ' ' + y);
},
update: function (elapsed) {
},
draw: function (ctx) {
}
});
sg.Entity = Entity;
})();
/************************/
// -- player.js
(function createPlayer() {
var Player = sg.Entity.extend({
x: 0,
y: 0,
moveLeft: false,
moveRight: false,
speed : 5,
init: function (x, y) {
this.x = x;
this.y = y;
this.name = 'Player';
},
draw: function (ctx) {
var x = this.x,
y = this.y;
ctx.beginPath();
ctx.rect(x, y, 40, 50);
ctx.fillStyle = 'white';
ctx.fill();
ctx.lineWidth = .5;
ctx.strokeStyle = 'rgba(0,0,0,.3)';
ctx.stroke();
ctx.fillStyle = 'rgba(0,0,0,.5)';
ctx.fillRect(x + 25, y + 15, 5, 5);
},
update: function (elapsed) {
var distance = (60 / 1000) * elapsed;
if (this.moveLeft) {
this.x += this.speed * distance;
} else if (this.moveRight) {
this.x -= this.speed * distance;
}
},
keyDown: function (e) {
if (e.keyCode === 39) {
this.moveLeft = true;
} else if (e.keyCode === 37) {
this.moveRight = true;
} else {
this.moveLeft = false;
this.moveRight = false;
}
},
keyUp: function (e) {
if (e.keyCode === 39) {
this.moveLeft = false;
} else if (e.keyCode === 37) {
this.moveRight = false;
}
}
});
sg.Player = Player;
})();
/**********************************/
(function createGame() {
var Game = Class.extend({
canvas: null,
context: null,
width: null,
height: null,
init: function (width, height) {
this.canvas = document.getElementById('canvas');
this.context = this.canvas.getContext('2d');
this.width = width || 800;
this.height = height || 600;
this.canvas.width = this.width;
this.canvas.height = this.height;
},
clear: function () {
this.context.clearRect(0, 0, this.width, this.height);
},
draw: function () {
this.clear();
for (var i = 0; i < sg.entities.length; i++) {
sg.entities[i].draw(this.context);
}
},
update: function (elapsed) {
for (var i = 0; i < sg.entities.length; i++) {
sg.entities[i].update(elapsed);
}
},
keyDown: function (e) {
for (var i = 0; i < sg.entities.length; i++) {
if (typeof sg.entities[i].keyDown === 'function') {
sg.entities[i].keyDown(e);
}
}
},
keyUp: function (e) {
for (var i = 0; i < sg.entities.length; i++) {
if (typeof sg.entities[i].keyUp === 'function') {
sg.entities[i].keyUp(e);
}
}
}
});
sg.Game = Game;
var game = sg.currentGame = new sg.Game(800, 600);
var player = new sg.Player(200, 459);
sg.createEntity(player);
function update(elapsed) {
game.update(elapsed);
}
var lastUpdate = Date.now();
function draw() {
var now = Date.now();
var elapsed = (now - lastUpdate);
lastUpdate = now;
game.draw();
update(elapsed);
requestAnimFrame(draw);
}
window.addEventListener('keydown', sg.currentGame.keyDown, false);
window.addEventListener('keyup', sg.currentGame.keyUp, false);
draw();
})();
keydown/keyup事件在一次按下和另一次按下之间等待一点时间 这是我如何解决我的案件不确定这是否正是你的问题;增加一个设置间隔,每隔20毫秒检查是否有多个向下键用于对角线移动
var keys = {};
$(document).bind('keyup', function(e){
delete keys[e.which];
});
$(document).bind('keydown', function(e){
keys[e.which] = true;
});
setInterval(keyEvent, 20);
function keyEvent(){
for(var idKeyPressed in keys){
switch(idKeyPressed){
case "87": // "W" key; Move to the top
// Do something
break;
}
}
}
希望对您有所帮助:按键向下/按键向上事件在一次按下和另一次按下之间等待一点时间 这是我如何解决我的案件不确定这是否正是你的问题;增加一个设置间隔,每隔20毫秒检查是否有多个向下键用于对角线移动
var keys = {};
$(document).bind('keyup', function(e){
delete keys[e.which];
});
$(document).bind('keydown', function(e){
keys[e.which] = true;
});
setInterval(keyEvent, 20);
function keyEvent(){
for(var idKeyPressed in keys){
switch(idKeyPressed){
case "87": // "W" key; Move to the top
// Do something
break;
}
}
}
希望有帮助:您是否尝试过在Chrome调试器工具中分析内存?我想失控的内存泄漏可能会比你需要的更频繁地触发GC。再补充一句,它在最新的Chrome和Firefox Windows 7上运行得非常好。几天前我做了一个CPU配置文件,但没有什么突出的。内存配置文件也不突出。这是我在其他画布游戏中看到的典型情况。内存增加,然后GC命中。从我所看到的GC只会每隔30秒左右出现一次。至少是一个巨大的GC打击。我只是想知道你是否因为Windows上的GPU加速画布而没有注意到。我认为当前的Chrome没有MacOSX的功能。也许金丝雀有。是的,我分析了第一个链接,没有发现严重的记忆问题。。。令人困惑但正如我所说,这对我来说很好。你做了所有正确的事情——在事件处理程序中尽可能少地处理,使用RequestAnimationFrame安排动画,等等。这些都没有意义。我可以毫无问题地玩《愤怒的小鸟》。这只是一个简单的移动,而且很糟糕。你试过在Chrome调试器工具中分析内存吗?我想失控的内存泄漏可能会比你需要的更频繁地触发GC。再补充一句,它在最新的Chrome和Firefox Windows 7上运行得非常好。几天前我做了一个CPU配置文件,但没有什么突出的。内存配置文件也不突出。这是我在其他画布游戏中看到的典型情况。内存增加,然后GC命中。从我所看到的GC只会每隔30秒左右出现一次。至少是一个巨大的GC打击。我只是想知道你是否因为Windows上的GPU加速画布而没有注意到。我认为当前的Chrome没有MacOSX的功能。也许金丝雀有。是的,我分析了第一个链接,没有发现严重的记忆问题。。。令人困惑但正如我所说,这对我来说很好。你做了所有正确的事情——在事件处理程序中尽可能少地处理,使用RequestAnimationFrame安排动画,等等。这些都没有意义。我可以毫无问题地玩《愤怒的小鸟》。这只是一个简单的动作,很糟糕。关于关键事件延迟的有趣理论。。。但我看不出这能解决问题?是的。谢谢你的帮助,但是这个问题也发生在没有按键的动作上。关于关键事件延迟的有趣理论。。。但我看不出这能解决问题?是的。谢谢你的帮助,但是这个问题也会发生在没有按键的情况下。