我正在使用Allegro和C ++开发2D平台游戏。但是,有一个问题。在游戏中角色有橡皮子弹,当子弹射击时,它会永远从墙壁反射出来。该角色具有射击30发子弹的能力,然而,子弹计数越多,图形变得越慢。虽然我不使用任何循环来绘制任何子弹的运动,但游戏不可避免地会减速。这是移动子弹的功能:
void Character :: moveBullets(void){
if(bullet_turn != bullet_count){
bullet_chain[bullet_turn++]->move();
else
bullet_turn = 0;}
这是函数move():
rectfill(buffer, getX(), getY(), getX() + bullet_image[direction]->h, getY() + bullet_image[direction]->w, 0);
//update direction
acquire_screen();
draw_sprite(buffer, bullet_image[direction], x, y);
blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
release_screen();
}
我该怎么办?在绘制许多精灵时,Allegro总是会减速吗?
答案 0 :(得分:2)
如果我正确理解您的代码,您将整个屏幕从缓冲区复制到每个项目符号的屏幕上。这真的是你想要的吗?
另外,你确定你应该使用acquire_screen()吗? acquire_bitmap
的文档https://www.allegro.cc/manual/4/api/bitmap-objects/acquire_bitmap
表示在某些情况下会导致速度放缓。
答案 1 :(得分:1)
根据acquire_bitmap文档,acquire_screen
来电,您应尽量减少通话次数。通常这意味着在更新过程开始时调用它,然后在释放锁之前执行绘图的 all 。
...大多数绘图功能需要在绘制之前锁定视频位图。但是这样做非常慢,所以如果你在主重绘功能开始时只获取一次屏幕,然后调用需要锁定位图的多个绘图操作,并且只在完成后才释放它,你将获得更好的性能。
从当前的示例代码中无法判断,但我怀疑moveBullets
被多次调用。