gpt4 book ai didi

java - 如何使圆反弹矩形的角 - 处理

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

我会尽快保持这一点。

只需编写一个处理程序,使球从矩形反弹。

目前我只能弄清楚如何做顶部、左侧、右侧和底部,但是当球进入矩形的角落时,它不会反弹,而是进入矩形并在 1 之后或 2 个反弹被释放。

我只是真的想知道我应该如何让球偏离矩形的角,这样它就不会出现故障

这是我的代码:

    float x = 100, y = 100, radius = 50;
float vx = 3, vy = 3;
float MX = 0;
float MY = 0;


void setup() {
size(500, 700);
}

void draw() {
background(0);
fill(255);

x += vx;
y += vy;
if (x + radius > width) {
vx = vx * -1;
}
//makes the ball bounce off the right
if (x - radius < 0) {
vx = vx * -1;
}
//makes the ball bounce off the left
if (y + radius > height) {
vy = vy * -1;
y = height - radius;
}
//make the ball bounce off the top
if (y - radius < 0) {
vy = vy * -1;
y = radius;
}
//makes the ball bounce off the top
if (y + radius > MY && x + radius > MX + 50 && x + radius < MX + 150 &&
y + radius < MY + 20) {
vy *= -1;
y = MY - 3 - radius;
} //Top Side
if (x - radius < MX + 100 && y > MY - 10 && y < MY + 10 && x - radius > MX) {
vx *= -1;
} // Right Side

if (y - radius < MY + 20 && x + radius > MX + 50 && x + radius < MX + 150 &&
y - radius > MY) {
vy *= -1;
y = MY + 20 + radius;
} //Bottom Side

if (x + radius > MX && y > MY - 10 && y < MY + 10 && x + radius < MX + 100) {
vx *= -1;
} // Left Side

ellipse(x, y, radius * 2, radius * 2);
rect(MX, MY, 100, 20);

}

void mouseMoved() {

MX = mouseX - 50;
MY = mouseY - 10;
if (MX < 0) {
MX = 0;
}
if (MX > 400) {
MX = 400;
}
if (MY < 0) {
MY = 0;
}
if (MY > 680) {
MY = 680;
}

抱歉,我很清楚如何插入代码,我是这个网站的新手,请怜悯哈哈:)

干杯

最佳答案

问题不在于您需要检测角点碰撞。您还有另外两个问题:

问题 1:当您检测到碰撞时,您需要移动球,使其不再与矩形碰撞。

如果不这样做,那么当球与盒子顶部相交时,您将 vy 变量乘以 -1。这导致圆圈开始向上移动。但下一帧,圆圈仍然与矩形碰撞,因为它还没有向上移动足够的距离。因此,您的代码检测到该碰撞,再次将 vy 乘以 -1,然后球向下移动。下一帧会发生同样的事情,直到球最终停止与矩形碰撞。

放慢帧速率看看我在说什么:

bad collision

要解决此问题,您需要将球“弹出”回不再与矩形相交的位置。这样你就知道它在下一帧中不会仍然发生碰撞。

问题 2:您不应该分别在每一侧进行碰撞。相反,在整个圆和整个矩形之间进行碰撞,然后一次检查一个移动轴。

一次检查一侧会导致很多令人头痛的问题,包括同时击中多侧的问题。我还敢打赌,您的代码没有按照您的想法进行操作:尝试将 println() 语句添加到所有 if 语句中,以确保它们正在执行当你认为他们是的时候。

为了解决这个问题,我将创建一个 collides() 函数,该函数获取球的下一个位置的参数,并返回球是否会与矩形的任意边。然后进入下一个 X 和 Y 位置并翻转它们的速度。它看起来像这样:

 if (collides(circleX + vx, circleY)) {
vx*=-1;
}
else {
circleX += vx;
}
if (collides(circleX, circleY + vy)) {
vy*=-1;
}
else {
circleY += vy;
}

您还需要添加“弹出”球的逻辑,使其不再发生碰撞。

good collision

PS:您是否尝试在 google 或 Stack Overflow 搜索上搜索您的问题? This question几乎与您的问题完全相同,以至于我很确定您在同一类!

关于java - 如何使圆反弹矩形的角 - 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38611704/

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