2009-12-24 54 views
1

所以我只是试图让一个红色的10 x 10盒子来回垂直移动。我编译并运行我的程序,红框出现开始向下移动,然后在碰到屏幕边缘后消失。我使用了一些cout <<语句,它们告诉我什么时候函数被调用,并且它们在应该被调用时都被调用。即使在看不见盒子的情况下,函数也能正确地被调用。矩形与SDL一起消失

我的主循环

while(running) 

    { 

     myScreen->Clear(); 

     boxes.Move(); 

     boxes.Draw(); 

     myScreen->Flip(); 
       ........ 

我draw()函数

SDL_Color red; 
    red.r = 255; 
    red.g = 0; 
    red.b = 0; 
    if(SDL_FillRect(my_screen->Get_screen(), &start_dest, SDL_MapRGB( 
    my_screen->Get_pixel_format(), red.r, red.g, red.b)) == -1)` 
     cout << "Fill rect in Draw(); failed\n"; 

我的移动()函数

start_dest.y += y_step; 
if (start_dest.y >= my_screen->Get_height()) 
    { 
     cout << "start_dest.y >= screen height\n"; 
     start_dest.y = my_screen->Get_height(); 
     y_step = -y_step; 
    } 
    if (start_dest.y <= 0) 
    { 
     cout << "start_dest.y <= 0\n"; 
     start_dest.y = 0; 
     y_step = -y_step; 
    } 

我一直在试图找到永远这个bug。只要有人想看更多的代码就留下评论。由于

+0

只是一个小窍门:如果你使用真正的调试器,你会发现bug比使用'cout'来填充你的程序要快得多,并且更加简洁。 – 2009-12-24 19:58:51

+3

也许这个错误是由源代码中多余的感叹号造成的。 – avakar 2009-12-24 20:00:44

+0

请告诉我:Get_height()返回什么值,以及y_step的初始值是什么。在我看来,他们喜欢以不同的单位说话,然后永远不会达到高潮,方向永远不会颠倒。 – 2009-12-24 20:10:26

回答

1

没有足够的信息给出确凿的答案,但这里有一个提示。

根据我对SDL的经验,SDL函数可以在调用时修改Rect结构,特别是当rect部分在屏幕外时。确保你在之前设置了全部它的属性(x,y,宽度,高度)使用矩形的SDL函数。

+0

是的,我只是简单地添加了一个start_dest.h = 10;之前我的SDL_fillRect和它的工作!谢谢 – TheFuzz 2009-12-24 20:27:59

0

(我假设这里start_dest具有“高度”成员,并且该屏幕坐标有(0,0)在左上角)

我想也许是第一个“如果”语句在移动()应该是

if(start_dest.y >= my_screen.Get_height - start_dest.height) 

,这样,当其底部击中屏幕的底部,而不是等到矩形的顶部到达那里的矩形会反弹。无论如何,这就是这个效果。