我正在处理的程序有问题。有时,它会冻结。没有错误或任何东西。
该游戏是一款多人游戏,您可以在其中驾驶一艘船。其他玩家和道具的照片会根据您的位置进出视野。在大多数情况下,它工作得很好,但在某些情况下,它会锁定。
我已经追踪到它何时将一个表面 BLIT 到另一个表面上。(SDL_BlitSurface)。
如果我注释掉它 blits (SDL_BlitSurface) 的单行代码,并用一个简单的圆圈替换图形,它在任何情况下都不会冻结。但是,注释掉圆圈并再次用blitting图形替换它,它会随机冻结。令人沮丧的是,有时会,有时不会。有时图形会在屏幕上停留片刻然后冻结,有时它会在它出现的那一刻冻结。有时,它根本不会冻结。我根本无法追踪到任何特别的事情。
我有大量的代码可以检查 NULL 表面,但似乎并没有阻止它。我还将它设置为将有关所有图形的信息输出到文件(例如宽度、高度、内存中的位置、x、y 等),并且没有什么不寻常的。
我的主要问题是,表面会导致 SDL_BlitSurface 冻结怎么办?我还可以为表面添加哪些其他检查,以确保它不会尝试涂抹坏表面?
代码太长无法列出,但它是如何工作的:
class Player
{
Player();
int x;
int y;
int xvel;
int yvel;
SDL_Surface *DrawScreen;
SDL_Surface *ShipPic;
void check_player_dist();
void check_powerup_dist();
void update();
};
class PowerUp
{
int x;
int y;
int type;
SDL_Surface *Powerup_Pic;
};
Player::Player()
{
Apply_Surface(0, 0, PlayerShipPics, ShipPic);
}
Player::Update(Player p[], PowerUp pu[])
{
x += xvel;
y += yvel;
for (int i = 0; i < Num_Players; i++)
{
if (check_on_screen(p[i].x, p[i].y) == true)
{
Apply_Surface(x - p[i].x, y - p[i].y, p[i].ShipPic, DrawScreen);
}
}
for (int i = 0; i < Num_PowerUps; i++)
{
if (check_on_screen(pu[i].x, pu[i].y) == true)
{
Apply_Surface(x - pu[i].x, y - pu[i].y, pu[i].Pic, DrawScreen);
}
}
}
int main()
{
SDL_Surface *Screen;
Player players[4];
PowerUp powerups[200];
Num_Players = 4;
Num_PowerUps = 200;
while (quit == false)
{
for (int i = 0; i < Num_Players; i++)
{
players[i].update(players, powerups);
switch (i)
{
case 0: ScreenX = 0; ScreenY = 0; break;
case 1: ScreenX = ScreenWid / 2; ScreenY = 0; break;
case 2: ScreenX = 0; ScreenY = ScreenHigh / 2; break;
case 3: ScreenX = ScreenWid / 2; ScreenY = ScreenHigh / 2; break;
}
Apply_Surface (ScreenX, ScreenY, players[i].DrawScreen, Screen);
}
if (SDL_Flip(Screen) == -1)
{
return -1;
}
}
}
void Apply_Surface (int x, int y, SDL_Surface* Source, SDL_Surface* Destination, SDL_Rect* Clip)
{
SDL_Rect Offset;
Offset.x = x;
Offset.y = y;
if ((Source != NULL) && (Destination != NULL))
{
SDL_BlitSurface (Source, Clip, Destination, &Offset );
}
}
我注意到当两个或更多玩家彼此靠近并试图在他们的两个屏幕上绘制相同的加电时,它通常会冻结。但是再次......并非总是如此!