gpt4 book ai didi

javascript - 圆圈弹跳错误

转载 作者:搜寻专家 更新时间:2023-10-31 08:32:05 25 4
gpt4 key购买 nike

我正在使用没有 Canvas (!) 的 HTML5 和 jQuery 创建一个迷你游戏,并且在开发弹跳部分时(当圆圈与阶段限制发生碰撞时),我发现了一个错误:

当圆圈与底部或右侧限制碰撞并且您一直按向下/向右箭头键时,圆圈会继续弹跳到阶段限制,但是当您对相反的阶段限制(顶部和左侧)执行相同的操作时,圆圈反弹一两次,然后停止(我想得到第二个 react ,当它反弹然后停止时)。 我还发现这个bug只出现在Safari中。谁能帮我解决一下?

JSFiddle

Demo on site

<!DOCTYPE html>
<html>

<head>
<title>VelJS 3 Pre-Alpha</title>

<!-- This app was coded by Tiago Marinho -->
<!-- Special thanks to Drizr, from the interwebs -->
<!-- Do not leech it! -->

<link rel="shortcut icon" href="http://i.imgur.com/Jja8mvg.png">
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
var yvel = 0, xvel = 0;
var up = false, // W or arrow up
left = false, // A or arrow left
right = false, // D or arrow right
down = false; // S or arrow down

// Keydown:
document.addEventListener("keydown", function (evt) {
if (evt.keyCode == 87 || evt.keyCode == 38) { // up
up = true;
}
if (evt.keyCode == 65 || evt.keyCode == 37) { // left
left = true;
}
if (evt.keyCode == 68 || evt.keyCode == 39) { // right
right = true;
}
if (evt.keyCode == 83 || evt.keyCode == 40) { // down
down = true;
}
if (evt.keyCode == 8 || evt.keyCode == 80) { // del/p
}
});
// Keyup:
document.addEventListener("keyup", function (evt) {
if (evt.keyCode == 87 || evt.keyCode == 38) { // up
up = false;
}
if (evt.keyCode == 65 || evt.keyCode == 37) { // left
left = false;
}
if (evt.keyCode == 68 || evt.keyCode == 39) { // right
right = false;
}
if (evt.keyCode == 83 || evt.keyCode == 40) { // down
down = false;
}
});

function y(obj){
return $(obj).offset().top;
}
function x(obj){
return $(obj).offset().left;
}

setInterval(function(){

// Keydown/keyup handler:
if (up == true) {
yvel -= 2;
} else {
if (yvel < 0) {
yvel++;
}
}
if (left == true) {
xvel -= 2;
} else {
if (xvel < 0) {
xvel++;
}
}
if (right == true) {
xvel += 2;
} else {
if (xvel > 0) {
xvel--;
}
}
if (down == true) {
yvel += 2;
} else {
if (yvel > 0) {
yvel--;
}
}

var nextposx = $("circle").offset().left+xvel/16;
var nextposy = $("circle").offset().top+yvel/16;

if(nextposy < 0 || nextposy+20 > window.innerHeight){
yvel = Math.round(yvel*-0.5);
}
if(nextposx < 0 || nextposx+20 > window.innerWidth){
console.log(xvel);
xvel = Math.round(xvel*-0.5);
console.log(xvel);
}
$("circle").css({
top:$("circle").offset().top+yvel/16,
left:$("circle").offset().left+xvel/16
});
},8);
</script>
<style>
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,700,600' rel='stylesheet' type='text/css'> * {
margin: 0;
}
html,
body {
-webkit-text-smoothing: antialiased;
height:100%;
overflow:hidden;
color: #fff;
background-color: #181818;
}
circle{
position:absolute;

top:0;
left:0;

width:20px;
height:20px;

border-radius:10px;
background:#fff;
}
</style>
</head>

<body>
<circle></circle>
</body>

</html>

我没有使用 Canvas ,因为我已经尝试使用 EaselJS 创建这个迷你游戏,但我发现了很多问题,并且没有理由在我的情况下使用它,因为这个游戏没有任何图像(然后不需要硬件加速)。

最佳答案

此答案是对先前无效答案的完整更新。答案的完整代码在底部。

我必须检查所有浏览器以查看问题所在:

-在 Chrome 上一切正常,所以我没有什么可以改变的。

-在 Safari 上,球在底部和右侧弹跳。我发现问题是由设置为 float 而不是 int 的位置引起的,所以我只需要四舍五入位移。

$("circle").css({
top:Math.round($("circle").offset().top+yvel/16),
left:Math.round($("circle").offset().left+xvel/16)
});

我的第一个答案是通过在位移中作弊来解决问题,这次答案解决了它。这种改进应该不会影响 Chrome(但我现在无法对其进行测试)。

- 在 Firefox 上,球停在页面底部之前。我只需要更改 body 碰撞的比较器,并向其添加 0pxmargin。在旧版本的 Firefox 中,当你按下 UP 时,球会在上升之前稍微下降,我认为这个错误是由于 xvel--, xvel++, yvel--yvel++xvel+=2, xvel-=2, yvel+= 2yvel-=2 所以我将它们替换为两次 ++xvel,两次 --xvel,两次++yvel 和两次 --yvel 应该更快(同样我现在无法测试它所以我希望它能工作)。这些改进应该不会影响 Chrome 和 Safari。

然后我优化你的代码,让它更有效率。

您的 HTML 没有改变。

你的CSS现在是:

<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,700,600' rel='stylesheet' type='text/css'> * {
margin: 0;
}

html, body {
-webkit-text-smoothing: antialiased;
height:100%;
overflow:hidden;
color: #fff;
background-color: #181818;
margin: 0px;
}

circle {
position:absolute;
top:0;
left:0;
width:20px;
height:20px;
border-radius:10px;
background:#fff;
}

您的 JavaScript 现在是:

var yvel = 0, xvel = 0;
var up = false, // W or arrow up
left = false, // A or arrow left
right = false, // D or arrow right
down = false; // S or arrow down

// Keydown:
document.addEventListener("keydown", function (evt) {
if (evt.keyCode == 87 || evt.keyCode == 38) { // up
up = true;
}
if (evt.keyCode == 65 || evt.keyCode == 37) { // left
left = true;
}
if (evt.keyCode == 68 || evt.keyCode == 39) { // right
right = true;
}
if (evt.keyCode == 83 || evt.keyCode == 40) { // down
down = true;
}
if (evt.keyCode == 8 || evt.keyCode == 80) { // del/p
}
});
// Keyup:
document.addEventListener("keyup", function (evt) {
if (evt.keyCode == 87 || evt.keyCode == 38) { // up
up = false;
}
if (evt.keyCode == 65 || evt.keyCode == 37) { // left
left = false;
}
if (evt.keyCode == 68 || evt.keyCode == 39) { // right
right = false;
}
if (evt.keyCode == 83 || evt.keyCode == 40) { // down
down = false;
}
});

function y(obj){
return $(obj).offset().top;
}
function x(obj){
return $(obj).offset().left;
}

setInterval(function(){

// Keydown/keyup handler:
if (up) {
--yvel;
--yvel;
} else if (yvel < 0) {
yvel++;
}
if (left) {
--xvel;
--xvel;
} else if (xvel < 0) {
xvel++;
}
if (right) {
++xvel;
++xvel;
} else if (xvel > 0) {
xvel--;
}
if (down) {
++yvel;
++yvel;
} else if (yvel > 0) {
yvel--;
}

var nextposx = $("circle").offset().left+xvel/16;
var nextposy = $("circle").offset().top+yvel/16;

if(nextposy < 0 || nextposy+20 > $('body').height()){
yvel = Math.round(yvel*-0.5);
}
if(nextposx < 0 || nextposx+20 > $('body').width()){
xvel = Math.round(xvel*-0.5);
}
$('circle').css({
top:Math.round($('circle').offset().top+yvel/16),
left:Math.round($('circle').offset().left+xvel/16)
});
},8);

你有一个 JSFiddle 结果 here .

剩下的唯一错误是,在 Firefox 中,圆圈在右侧超出了几个像素,但它非常小。

对不起,如果我的英语不好,我希望你能理解我写的所有内容。我想我在这里的工作已经完成了......玩得开心 =D。

关于javascript - 圆圈弹跳错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22287506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com