gpt4 book ai didi

Javascript 对象碰撞

转载 作者:行者123 更新时间:2023-11-30 14:30:10 26 4
gpt4 key购买 nike

我有一个简单的 javascript 程序。

你可以在其中移动一个正方形。

如果正方形与物体发生冲突,一个像素将跳回。

它有效。但如果两个对象彼此相邻,它将不起作用。此代码的示例。如果平方 y 坐标为 200 并且接近银则它不会碰撞。

我该如何解决?

我该如何解决?如果有人可以提供更简单的解决方案,那么谢谢。

<body onload="Start()">
<script>
function Start() {
myAvatar = new component("black", 30, 30, 50, 50);
components = {
silverMine: new component("grey", 30, 30, 300, 170),
forest: new component("green", 30, 30, 300, 200),
}
Field.start();
}

var Field = {
field: document.createElement("canvas"),
start: function() {
this.field.height = 800;
this.field.width = 800;
this.context = this.field.getContext("2d");
document.body.insertBefore(this.field, document.body.childNodes[0]);
this.interval = setInterval(fieldUpdate, 10);

window.addEventListener('keydown', function(e) {
Field.keys = Field.keys || [];
Field.keys[e.keyCode] = (e.type == "keydown");
})

window.addEventListener('keyup', function(e) {
Field.keys[e.keyCode] = (e.type == "keydown");
})
},

clear: function() {
this.context.clearRect(0, 0, this.field.width, this.field.height);
}
}

function component(color, width, height, x, y) {
this.color = color;
this.width = width;
this.height = height;
this.x = x;
this.y = y;

this.componentUpdate = function() {
ctx = Field.context;
ctx.save();
ctx.fillStyle = color;
ctx.fillRect(this.x, this.y, this.width, this.height);
ctx.restore();
}
}

function collision(a) {
for (var prop in components) {
c = components[prop];
com = prop;

if ((a.x == c.x - c.width) && (a.y >= c.y - c.width && a.y <= c.y - c.width + 60)) {
console.log("balról");
return true;
}
if ((a.x == c.x + c.width) && (a.y >= c.y - c.width && a.y <= c.y - c.width + 60)) {
console.log("jobbrol");
return true;
}
if ((a.y == c.y - c.width) && (a.x >= c.x - c.width && a.x <= c.x - c.width + 60)) {
console.log("felülröl");
return true;
}
if ((a.y == c.y + c.width) && (a.x >= c.x - c.width && a.x <= c.x - c.width + 60)) {
console.log("alulrol");
return true;
}

if ((a.x == c.x - c.width + 1) && (a.y >= c.y - c.width && a.y <= c.y - c.width + 60)) {
a.x = c.x - c.width;
console.log("5");
return true;
}
if ((a.x == c.x + c.width - 1) && (a.y >= c.y - c.width && a.y <= c.y - c.width + 60)) {
a.x = c.x + c.width;
console.log("6");
return true;
}
if ((a.y == c.y - c.width + 1) && (a.x >= c.x - c.width && a.x <= c.x - c.width + 60)) {
a.y = c.y - c.width;
console.log("7");
return true;
}
if ((a.y == c.y + c.width - 1) && (a.x >= c.x - c.width && a.x <= c.x - c.width + 60)) {
a.y = c.y + c.width;
console.log("8");
return true;
}

}

return false;
}

function fieldUpdate() {
Field.clear();
if (Field.keys && Field.keys[37]) {
myAvatar.x--;
}
if (Field.keys && Field.keys[38]) {
myAvatar.y--;
}
if (Field.keys && Field.keys[39]) {
myAvatar.x++;
}
if (Field.keys && Field.keys[40]) {
myAvatar.y++;
}
collision(myAvatar);
myAvatar.componentUpdate();
for (var prop in components) {
components[prop].componentUpdate();
}
}
</script>
</body>

</html>

最佳答案

主要问题是您可以同时在 x 和 y 方向上移动,因为某些检测会出现 off by 1 类型的错误。因此,当您位于顶部正方形底部下方一个像素时,它实际上会检测到与该正方形在 y 方向上的碰撞,并且只会阻止 y 移动但允许 x 移动。

这是一个不允许碰撞的更改,尽管它确实会“卡住”在某些地方:

function fieldUpdate() {
Field.clear();
var oldX = myAvatar.x;
var oldY = myAvatar.y;
if (Field.keys && Field.keys[37]) {
myAvatar.x--;
}

if (Field.keys && Field.keys[39]) {
myAvatar.x++;
}

if (collision(myAvatar)) {
myAvatar.x = oldX;
myAvatar.y = oldY;
}

var oldX = myAvatar.x;
var oldY = myAvatar.y;

if (Field.keys && Field.keys[40]) {
myAvatar.y++;
}

if (Field.keys && Field.keys[38]) {
myAvatar.y--;
}

if (collision(myAvatar)) {
myAvatar.x = oldX;
myAvatar.y = oldY;
}

myAvatar.componentUpdate();
for (var prop in components) {
components[prop].componentUpdate();
}
}

如果您修复了 1 个错误,它也应该不会卡住。

另外一个问题是你在几个地方有 c.y - c.width。这些应该很可能是 c.y - c.height。如果您制作非方形形状,这将是一个问题。

关于Javascript 对象碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51323955/

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