gpt4 book ai didi

c++ - 失去弹跳球的位置

转载 作者:行者123 更新时间:2023-11-28 08:20:58 25 4
gpt4 key购买 nike

我正在尝试使用 WIN32 GUI 绘制弹跳球,因此我为球位置定义了一个二维 vector 和我屏幕尺寸的矩形 map

struct pos {
float x;
float y;
};
RECT maprect = {0, 0, 800, 600};
pos ballpos;
ballpos.x=300;
ballpos.y=300;

(当然我为 2dvec 使用了一个类,而且它不止于此)

我画了一个椭圆

Ellipse(backbufferDC, (int)ballpos.x-45, (int)ballpos.y-45,
(int)ballpos.x+45, (int)ballpos.y+45);

现在为了使我的椭圆弹跳,我在我的消息循环中使用了这段代码,它工作正常:

bool balldown = false; 
if (ballpos.y > maprect.bottom-40) {
balldown = true;
}
else if (ballpos.y < maprect.top+300) {
balldown = false;
}

if (ballpos.y > maprect.bottom-40) {
balldown = true ;
}
else if(ballpos.y < maprect.top+300) {
balldown = false;
}

if (!balldown) {
vel+=1;
ballpos.y +=3;
}
else {
ballpos.y-=3;
}


Ellipse(bbdc, (int)tankpos.x-45, (int)tankpos.y-45,
(int)tankpos.x+45, (int)tankpos.y+45);

但为了让它看起来更逼真,我决定改变移动中的球速度所以我最终得到了这段代码

float vel;
if (ballpos.y > maprect.bottom-40) {
balldown = true ;
}
else if (ballpos.y < maprect.top+300) {
balldown = false ;
}

if (!balldown) {
vel+=0.5f;
ballpos.y +=vel;
}
else {
vel-=0.5f;
ballpos.y-=vel;
}



Ellipse(bbdc, (int)tankpos.x-45, (int)tankpos.y-45,
(int)tankpos.x+45, (int)tankpos.y+45);

现在看起来好多了,但问题是球只反弹了一次,然后第二次进入地面并消失了!

最佳答案

if (!balldown) {
vel+=0.5f;
ballpos.y +=vel;
}
else {
vel-=0.5f;
ballpos.y-=vel;
}

这个逻辑是错误的。重力总是在同一方向向下产生加速度。

你应该做的是处理碰撞。与巨大墙壁的弹性碰撞可能看起来像

vel = -vel;

所以最后你有

vel -= 0.5f;
ballpos.y += vel;
if (ballpos.y <= floory) {
vel = -vel;
ballpos.y = 2*floory - ballpos.y;
}

关于c++ - 失去弹跳球的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5850804/

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