Reklama
Pokazuje wyniki od 1 do 7 z 7

Temat: [C][SDL] "zostające" sprity

  1. #1
    Avatar Terr
    Data rejestracji
    2004
    Położenie
    Venore
    Posty
    1,993
    Siła reputacji
    22

    Domyślny [C][SDL] "zostające" sprity

    witam, piszę prostą gierkę korzystając z SDLa, zrobiłem sobie takie oto main menu(kazdy z tych napisów to w sumie oddzielny plik .bmp, tak samo "strzałka sterująca"):



    problem jest taki, że gdy wciskam klawisz odpowiedzialny za ruch strzałki sterującej, to owszem, idzie ona w dół, ale jej poprzednia pozycja nadal zostaje na ekranie:


    jak sobie z tym poradzić?

    kod:
    Kod:
    #define SCREEN_WIDTH 1000
    #define SCREEN_HEIGHT 700
    #define GAMEPOS 253
    #define HIGHSCORESPOS 295
    #define QUITPOS 337
    
    void mainmenu()
    {
        SDL_Window* mmenu = NULL;
        SDL_Surface* screenSurface = NULL;
        SDL_Surface *pointer, *logo, *game, *highscores, *quit, *controls;
        mmenu = SDL_CreateWindow( "Arkanoid ", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        screenSurface = SDL_GetWindowSurface( mmenu );
        SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0, 0, 0 ) );
        SDL_UpdateWindowSurface( mmenu );
        SDL_Rect ppos,lpos,gpos,hpos,qpos,cpos;
        SDL_Event event;
        int loop, z;
        logo = SDL_LoadBMP("logo.bmp");
        lpos.x=300;
        lpos.y=150;
        controls = SDL_LoadBMP("controls.bmp");
        cpos.x=50;
        cpos.y=300;
        pointer = SDL_LoadBMP("pointer.bmp");
        ppos.x=340;
        ppos.y=295;
        z=ppos.y-42;
        game = SDL_LoadBMP("play.bmp");
        gpos.x=400;
        gpos.y=300;
        highscores = SDL_LoadBMP("highscores.bmp");
        hpos.x=400;
        hpos.y=350;
        quit = SDL_LoadBMP("quit.bmp");
        qpos.x=400;
        qpos.y=400;
        SDL_BlitSurface( logo, NULL, screenSurface, &lpos );
        SDL_BlitSurface( game, NULL, screenSurface, &gpos );
        SDL_BlitSurface( controls, NULL, screenSurface, &cpos );
        SDL_BlitSurface( highscores, NULL, screenSurface, &hpos );
        SDL_BlitSurface( quit, NULL, screenSurface, &qpos );
        SDL_UpdateWindowSurface( mmenu );
    
        while( loop != 0 )
    			{
    
    				while( SDL_PollEvent( &event ) != 0 )
    				{
    
    					if( event.type == SDL_QUIT )
                            {
                                loop = 0;
                            }
    					if( event.type == SDL_KEYDOWN )
                            {
                                switch( event.key.keysym.sym )
                                    {
                                        case SDLK_UP:
                                            z=z-42;
                                            if (z<248)
                                                {
                                                    z=z+42;
                                                }
                                            break;
    
                                         case SDLK_DOWN:
                                             z=z+42;
                                             if (z>358)
                                                {
                                                    z=z-42;
                                                }
                                            break;
                                         case SDLK_RETURN:
                                            if (z==GAMEPOS)
                                            {
                                                SDL_DestroyWindow( mmenu );
                                                thegame();
                                            }
                                            if (z==HIGHSCORESPOS)
                                            {
                                               SDL_DestroyWindow( mmenu );
    
                                               highscore();
                                            }
                                            if (z==QUITPOS)
                                            {
                                                loop=0;
                                            }
    
                                            break;
                                    }
                            }
    				}
    
    
                    ppos.y=z;
                    SDL_BlitSurface( pointer, NULL, screenSurface, &ppos );
                    SDL_UpdateWindowSurface( mmenu );
    
    			}
    
    }
    edit. korzystam z SDL 2.0 w którym nie ma SDL_Flip(bo chyba wlasnie tego mi brakuje, patrząc po kodach podobnych programów). gdzieś znalazłem tip żeby skorzystać z SDL_RenderPresent ale średnio mi to wyszło i liczę na jakąś pomoc ;d
    Ostatnio zmieniony przez Terr : 27-01-2014, 03:55

  2. #2
    Avatar zakius
    Data rejestracji
    2008
    Położenie
    The Internets
    Wiek
    33
    Posty
    11,075
    Siła reputacji
    24

    Domyślny

    Każdą nową klatkę musisz najpierw mieć czystą, a nie rysować na starej.
    Also, nie wiem czy sdl ma, ale jeśli nie to pamiętaj o ręcznym buforowaniu: rysuj elementy na klatce w pamięci i wysyłaj ja na ekran dopiero jak będzie gotowa (może masz, w kod nie patrzyłem bo błąd z tematu zbyt oczywisty)
    Problem z komputerem? Instrukcja diagnostyczna
    Cytuj Vegeta napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Baby maja wymagania jak windows vista, takze nigdy nie wiesz.
    Cytuj Dzzej napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Moje posty to esencja głupoty.
    "Don't worry, I'm just a pervert"

  3. Reklama
  4. #3
    Avatar Absherr
    Data rejestracji
    2008
    Położenie
    Kraków
    Posty
    578
    Siła reputacji
    16

    Domyślny

    Poszukaj pod nazwą podwójne buforowanie.
    Ostatnio zmieniony przez Absherr : 27-01-2014, 08:30

  5. #4
    Avatar zakius
    Data rejestracji
    2008
    Położenie
    The Internets
    Wiek
    33
    Posty
    11,075
    Siła reputacji
    24

    Domyślny

    @up: podwójne buforowanie zapobiega widocznemu rysowaniu klatek, ale jeśli nie wykonasz go prawidłowo dalej będzie rysować na starej klatce
    Problem z komputerem? Instrukcja diagnostyczna
    Cytuj Vegeta napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Baby maja wymagania jak windows vista, takze nigdy nie wiesz.
    Cytuj Dzzej napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Moje posty to esencja głupoty.
    "Don't worry, I'm just a pervert"

  6. #5
    Avatar TheSnake
    Data rejestracji
    2008
    Posty
    321
    Siła reputacji
    17

    Domyślny

    Robisz to źle.

    Zasada każdej klatki jest taka:
    1. Input (klawisze, myszka, itp.)
    2. Czyścisz ekran
    3. Rysujesz wszystko

    Pseudokod:
    Kod:
    bool exit = false;
    while (!exit) {
    	if (pressed_key == ESC) {
    		exit = true;
    		break;
    	}
    
    	ClearSurface();
    	
    	Draw(logo);
    	Draw(menu);
    	Draw(selector);
    }
    @down, właśnie to napisałem?
    Ostatnio zmieniony przez TheSnake : 27-01-2014, 19:14

  7. #6
    Avatar zakius
    Data rejestracji
    2008
    Położenie
    The Internets
    Wiek
    33
    Posty
    11,075
    Siła reputacji
    24

    Domyślny

    @up:
    input
    czyścisz (zamazujesz bazowym kolorem, cokolwiek) bufor
    rysujesz na buforze
    wyświetlasz bufor
    Problem z komputerem? Instrukcja diagnostyczna
    Cytuj Vegeta napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Baby maja wymagania jak windows vista, takze nigdy nie wiesz.
    Cytuj Dzzej napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Moje posty to esencja głupoty.
    "Don't worry, I'm just a pervert"

  8. #7
    Avatar Black Keeper
    Data rejestracji
    2005
    Posty
    483
    Siła reputacji
    19

    Domyślny

    edit. korzystam z SDL 2.0 w którym nie ma SDL_Flip(bo chyba wlasnie tego mi brakuje, patrząc po kodach podobnych programów). gdzieś znalazłem tip żeby skorzystać z SDL_RenderPresent ale średnio mi to wyszło i liczę na jakąś pomoc ;d
    Pomogę ci trochę z 2.0, sam właśnie zacząłem niedawno migrację na nową wersję.
    SDL_RenderPresent jest funkcją nowego SDL 2.0 który wykorzystuje już GPU, a nie CPU do rysowania. Oczywiście byś musiał troszkę pozmieniać w programie aby z tego skorzystać. Poniżej przedstawiam tobie fragmenty kodu: przykład abyś nie miał problemów z menu oraz wykorzytanie nowych funkcji w 2.0

    Kod:
    SDL_Window* window = NULL;
    SDL_Renderer* renderer;
    SDL_Event event;
    
    SDL_Texture* picture = NULL;
    Kod:
    while( running )
            {
                while( SDL_PollEvent( &event ) != 0 )
                {
                    if( event.type == SDL_QUIT )
                    {
                        running = false;
                    }
    
                    else if( event.type == SDL_KEYDOWN )
                    {
                        switch( event.key.keysym.sym )
                        {
                        case SDLK_ESCAPE:
                            running = false;
                            break;
                        }
                    }
                }
    
                SDL_RenderClear( renderer ); //wypełnia okno kolorem rendera, np. na biało
    
                SDL_RenderCopy( renderer, picture, NULL, NULL ); //rysowanie obrazka
    
                SDL_RenderPresent( renderer); //coś jak stare SDL_Flip
            }
        }
    Rysowanie tekstur w 2.0
    http://lazyfoo.net/tutorials/SDL/07_...ring/index.php

    Z 1.2 -> 2.0
    http://wiki.libsdl.org/MigrationGuide

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. [C][SDL] obrót sprite o wektor
    Przez Terr w dziale Programowanie
    Odpowiedzi: 3
    Ostatni post: 25-02-2014, 21:48
  2. [Inne]Twórz sprity gdziekolwiek jesteś!
    Przez Trabadur w dziale Artykuły developerskie
    Odpowiedzi: 7
    Ostatni post: 13-08-2011, 19:32
  3. Sprity od Trabadura
    Przez Trabadur w dziale Open Tibia Server
    Odpowiedzi: 2
    Ostatni post: 04-08-2011, 09:16
  4. Dziwne Sprity
    Przez Robin Royal Paladin w dziale Tibia
    Odpowiedzi: 6
    Ostatni post: 12-09-2007, 14:25
  5. O.o nowe sprity
    Przez Silver Drag w dziale Tibia
    Odpowiedzi: 21
    Ostatni post: 07-10-2006, 12:07

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •