SFML中心延迟一帧

时间:2017-04-07 01:27:34

标签: c++ sfml

我正在使用C ++和SFML制作游戏。现在,我有一个由瓷砖和可以占据这些瓷砖的实体制成的网格。其中一个实体是播放器,我想将相机置于这个实体的中心。我有一个sf::RenderWindow和一个sf::View来执行此操作:

 21     sf::RenderWindow window(sf::VideoMode(width, height), "");
 22     sf::View main_camera;
 23 
 24     window.setFramerateLimit(60);
 25 
 26     main_camera.setSize(width, height);
 27     window.setView(main_camera);

每一帧,我都会在绘制窗口之前将相机放在播放器上:

 99         window.clear();
100 
101         player.move(movement_flag);
102         grid.draw_all(window);
103 
104         if(moused_over) moused_over->draw_contents(window);
105 
106         player.center_camera(main_camera);
107         gui.display(window, camera_offset);
108 #ifdef DEBUG
109         printf("Drawing window, centered at [%4f, %4f]\n", main_camera.getCenter().x, main_camera.getCenter().y);
110 #endif  
111         window.setView(main_camera);
112         window.display();

我的问题是,无论何时我移动,都有一帧差异,其中玩家偏离中心:http://imgur.com/LH8oery(它不显示每一帧,因为我从录音中的60变为25 gif,但你仍然可以看到它几次)

这是调试输出:

...
Drawing window, centered at [350.000000, 140.000000]
Drawing sprite at   [ 350,  140]
Centering camera at [ 350,  140]
Drawing window, centered at [350.000000, 140.000000]
Drawing sprite at   [ 350,  140]
Centering camera at [ 350,  140]
Drawing window, centered at [350.000000, 140.000000]

Got a movement flag of 4
DOWN address: 0xedbbcbd0
Drawing sprite at   [ 350,  210]
Centering camera at [ 350,  210]
Drawing window, centered at [350.000000, 210.000000]
Drawing sprite at   [ 350,  210]
Centering camera at [ 350,  210]
Drawing window, centered at [350.000000, 210.000000]

...

当我输入时,移动标志文本触发,我向下移动。然后,在将下一帧绘制到屏幕之前,摄像机将以新坐标为中心。

我认为相机在下一帧之前没有居中是一个问题,但调试输出显示没有绘制窗口的位置且相机没有以最新的玩家坐标为中心。

我不知道造成这种情况的原因。如有必要,我可以分享更多代码。任何帮助解决问题的人都非常感激。

编辑:

我解决了这个问题。我不确定为什么,但将player.move(movement_flag)移到grid.draw_all(window)之后似乎可以解决问题:

 99         window.clear();
100 
101         grid.draw_all(window);
102         
103         if(moused_over) moused_over->draw_contents(window);
104 
105         gui.display(window, camera_offset);
106 #ifdef DEBUG
107         printf("Drawing window, centered at [%4f, %4f]\n", main_camera.getCenter().x, main_camera.getCenter().y);
108 #endif  
109         
110         player.move(movement_flag);
111         player.center_camera(main_camera);
112         window.setView(main_camera);
113         window.display();

0 个答案:

没有答案