【发布时间】:2021-02-12 02:39:32
【问题描述】:
我画了应用菜单,之前写过菜单类和这个类的功能。
当我启动应用程序时,菜单工作 5-7 秒,但在 Windows 中,光标以蓝色圆圈的形式旋转,这不是好兆头。如果这 5-7 秒是空闲的,整个屏幕 变成白色,Windows 说应用程序没有响应。在这种情况下,如果您按下按钮损坏的位置,这些按钮就会被触发,菜单关闭并开始游戏。我认为问题在于菜单类的描述。
菜单类代码:
class Menu
{
public:
Image menuImage1, menuImage2, menuImage3;
Texture menuTexture1, menuTexture2, menuTexture3;
int menuNum = 0;
bool isMenu;
list <Asteroid*> asteroidsMass;
list <Asteroid*> ::iterator it;
Sprite menu1, menu2, menu3;
Menu()
{
menuImage1.createMaskFromColor(Color::Black);
menuImage2.createMaskFromColor(Color::Black);
menuImage3.createMaskFromColor(Color::Black);
menuImage1.loadFromFile("title.jpg");
menuImage2.loadFromFile("start.jpg");
menuImage3.loadFromFile("exit.jpg");
menuTexture1.loadFromImage(menuImage1);
menuTexture2.loadFromImage(menuImage2);
menuTexture3.loadFromImage(menuImage3);
menu1.setTexture(menuTexture1);
menu2.setTexture(menuTexture2);
menu3.setTexture(menuTexture3);
menu1.setPosition(scrX / 2, 200);
menu2.setPosition((scrX / 2) - 172.5, 300);
menu3.setPosition((scrX / 2) - 140, 450);
menu1.setOrigin(300, 75);
for (int i = 0; i < 15; i++)
{
Asteroid* aster = new Asteroid(rand() % 1200, rand() % 800, 5, 25, 0);
asteroidsMass.push_back(aster);
}
isMenu = true;
}
void update(RenderWindow& app)
{
while (isMenu)
{
menu2.setColor(Color::White);
menu3.setColor(Color::White);
app.clear(Color::Black);
menuNum = 0;
if (IntRect((scrX / 2) - 172, 300, 360, 100).contains(Mouse::getPosition(app))) { menu2.setColor(Color::Green); menuNum = 2; }
else if (IntRect((scrX / 2) - 172, 450, 360, 100).contains(Mouse::getPosition(app))) { menu3.setColor(Color::Green);menuNum = 3; }
if (Mouse::isButtonPressed(Mouse::Left))
{
if (menuNum == 2)
{
for (it = asteroidsMass.begin(); it != asteroidsMass.end(); it++)
{
Asteroid* asteroid = *it;
it = asteroidsMass.erase(it);
delete asteroid;
}
isMenu = false;
}
if (menuNum == 3)
{
for (it = asteroidsMass.begin(); it != asteroidsMass.end(); it++)
{
Asteroid* asteroid = *it;
it = asteroidsMass.erase(it);
delete asteroid;
}
isMenu = false;
app.close();
}
}
for (it = asteroidsMass.begin(); it != asteroidsMass.end(); it++)
{
app.draw((*it)->EntityShape);
}
for (it = asteroidsMass.begin(); it != asteroidsMass.end(); it++)
{
(*it)->update();
}
app.draw(menu1);
app.draw(menu2);
app.draw(menu3);
app.display();
}
}
};
【问题讨论】:
-
让
update()等待看起来很奇怪。您必须命令您的库进行“消息处理”,这是 Windows GUI 应用程序所必需的。 -
为什么将指向小行星的指针存储在
list中?直接写list<Asteroid> astroidsMass,就不用再手动调用new和delete了。还可以使用 range-for对其进行迭代,例如:for (auto &asteroid: asteroidsMass) app.draw(asteroid.EntityShape)。 -
menuNum == 2和menuNum == 3内部的循环是错误的。在 for 循环中删除it++。更好的版本:for(auto aptr : asteroidsMass) delete aptr; asteroidsMass.clear(); -
@MikeCAT 你是什么意思?
-
@CodePenguin32 您有未定义的行为,因为您通过基类指针 (
Entity*) 删除对象 - 但Entitys 析构函数不是virtual。