我正在使用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();