2009-12-24 3 views
1

Donc j'essaie simplement de faire bouger une boîte rouge de 10 x 10 verticalement d'avant en arrière. Je compile et exécute mon programme et la boîte rouge apparaît commence à descendre, puis disparaît juste après avoir atteint le bord de l'écran. J'ai utilisé quelques instructions cout << qui me disent quand les fonctions sont appelées et elles sont toutes appelées quand elles sont supposées le faire. Même lorsque la boîte ne peut pas être vue, les fonctions sont correctement appelées.rectangle disparaissant avec SDL

Ma boucle principale

while(running) 

    { 

     myScreen->Clear(); 

     boxes.Move(); 

     boxes.Draw(); 

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

Mon draw() fonction

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"; 

Ma fonction Déplacer()

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; 
    } 

J'ai essayé de trouver ce bug pour toujours. Il suffit de laisser un commentaire si quelqu'un veut voir plus de code. Merci

+0

Juste un petit conseil: si vous utilisez un débogueur réel, vous trouverez des bugs beaucoup plus rapidement et de manière beaucoup plus propre que de remplir votre programme avec des 'cout's. –

+3

Peut-être que le bug est causé par un excès de points d'exclamation dans le code source. – avakar

+0

S'il vous plaît dites-moi: quelle valeur va Get_height() retour, et quelle est la valeur initiale de y_step. Il me semble qu'ils parlent dans des unités différentes, et puis getheight n'est jamais atteint et la direction n'est jamais inversée. –

Répondre

1

Il n'y a pas assez d'informations pour donner une réponse concluante, mais voici un indice. D'après mon expérience avec SDL, les fonctions SDL peuvent modifier votre structure Rect lorsqu'elle est appelée, en particulier lorsque rect est partiellement hors écran. Assurez-vous que vous définissez tous ses propriétés (x, y, largeur, hauteur) avant chaque fonction SDL qui utilise le rectangle.

+0

Oui, j'ai simplement ajouté un start_dest.h = 10; avant mon SDL_fillRect et ça a marché! Merci – TheFuzz

0

(je suppose ici que start_dest a un membre de « hauteur », et que les coordonnées de l'écran ont (0,0) dans le coin en haut à gauche)

Je pense peut-être le premier « if » en mouvement() devrait être

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

de sorte que le rectangle va rebondir quand son fond touche le fond de l'écran plutôt que d'attendre jusqu'à ce que le haut du rectangle arrive. Quelque chose à cet effet, de toute façon.