Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SDL] Natychmiastowa reakcja na klikniecie

Ostatnio zmodyfikowano 2011-12-20 21:39
Autor Wiadomość
mostrom
Temat założony przez niniejszego użytkownika
[SDL] Natychmiastowa reakcja na klikniecie
» 2011-12-20 20:30:52
Witam! to moje absolutne początki programowania grafiki. Tworzę coś w stylu gry - kółko i krzyżyk, tylko że dla uatwienia są same krzyżyki :D
Program wyświetla bitmape z napisem "WYGRALES", gdy zaznaczone zostaną 2 kafle obok siebie
plansza 10x10, daję kod:
C/C++
#include <SDL/SDL.h>
#include <SDL/SDL_Image.h>
#include <SDL/SDL_ttf.h>

SDL_Surface * ekran = NULL;
SDL_Surface * kafel = NULL;
SDL_Surface * kafelX = NULL;
SDL_Surface * win = NULL;



SDL_Rect winP; //kwadrat, że wygrałeś
SDL_Rect kafelK; //wymiary kafelka
SDL_Rect kafelD; // polozenie kafelka
SDL_Rect kursorP; //polozenie kursora

SDL_Rect plansza[ 10 ][ 10 ]; //tablica z kafelkami
bool zaznaczone[ 10 ][ 10 ]; //tablica czy zaznaczone

SDL_Event zdarzenie;
Uint8 * keystate = SDL_GetKeyState( NULL );
bool wyjscie = false;
int myszX, myszY;


int main( int argc, char * args[] ) {
    SDL_Init( SDL_INIT_EVERYTHING );
   
    ekran = SDL_SetVideoMode( 800, 600, 32, SDL_SWSURFACE | SDL_DOUBLEBUF );
    kafel = IMG_Load( "kafelek.bmp" ); //kafel pusty
    kafelX = IMG_Load( "kafelekX.bmp" ); //kafel zaznaczony
    win = IMG_Load( "win.bmp" ); //Duze "WYGRALES"
   
   
    kafelK.w = 32;
    kafelK.h = 32;
   
    kafelD.x = 50;
    kafelD.y = 50;
   
   
    winP.x = 200; // umiejscowienie "WYGRALES"
    winP.y = 150;
   
    //Rysowanie planszy
    for( int i = 0; i < 10; i++ ) {
        kafelD.x = kafelK.w +( i * 35 );
        for( int j = 0; j < 10; j++ ) {
            kafelD.y = kafelK.h +( j * 35 );
            SDL_BlitSurface( kafel, & kafelK, ekran, & kafelD );
            plansza[ i ][ j ].x = kafelD.x;
            plansza[ i ][ j ].y = kafelD.y;
        }
       
    }
   
   
   
    while( !wyjscie ) {
        while( SDL_PollEvent( & zdarzenie ) )
        {
            if( zdarzenie.type == SDL_QUIT )
                 wyjscie = true;
           
            if( zdarzenie.type == SDL_MOUSEMOTION )
                 kursorP.x = zdarzenie.motion.x;
           
            kursorP.y = zdarzenie.motion.y;
           
            if( zdarzenie.type == SDL_MOUSEBUTTONDOWN ) {
                if( zdarzenie.button.button == SDL_BUTTON_LEFT ) {
                    for( int i = 0; i < 10; i++ ) {
                        for( int j = 0; j < 10; j++ ) {
                            if( kursorP.x >= plansza[ i ][ j ].x && kursorP.x <= plansza[ i ][ j ].x + kafelK.w && kursorP.y >= plansza[ i ][ j ].y && kursorP.y <= plansza[ i ][ j ].y + kafelK.h ) {
                                if( !zaznaczone[ i ][ j ] ) {
                                    SDL_BlitSurface( kafelX, NULL, ekran, & plansza[ i ][ j ] );
                                    zaznaczone[ i ][ j ] = true;
                                }
                                else {
                                    SDL_BlitSurface( kafel, NULL, ekran, & plansza[ i ][ j ] );
                                    zaznaczone[ i ][ j ] = false;
                                }
                            }
                           
                        }
                    }
                }
            }
            for( int i = 0; i < 10; i++ ) {
                for( int j = 0; j < 10; j++ ) {
                   
                   
                    if( zaznaczone[ i ][ j ] == true &&( zaznaczone[ i + 1 ][ j + 1 ] == true ||
                    zaznaczone[ i + 1 ][ j ] == true ||
                    zaznaczone[ i ][ j + 1 ] == true ||
                    zaznaczone[ i - 1 ][ j - 1 ] == true ||
                    zaznaczone[ i - 1 ][ j ] == true ||
                    zaznaczone[ i ][ j - 1 ] == true )
                    ) {
                        SDL_FillRect( ekran, NULL, 0 ); //wyczyszczenie ekranu
                        SDL_BlitSurface( win, NULL, ekran, & winP ); //pokazanie "WYGRALES"
                    }
                   
                }
            }
           
        }
        SDL_Flip( ekran );
       
       
    }
    SDL_FreeSurface( kafel );
    SDL_FreeSurface( kafelX );
    return 0;
}

Pomijam to, że program jest zbugowany, np nie uwzględnia tego, że tablica nie może mieć argumentu -1, ale chodzi mi o szybkość działania.
Pewnie z powodu dużej ilości pętl, program po dłuższej ilości czasu wyświetla czy wygrałem.
Pytanie: jak prawidłowo zamieścić pętlę w programie, żeby działał tak szybko, jak Windowskowski Saper?
P-45966
pekfos
» 2011-12-20 21:39:42
Pytanie: jak prawidłowo zamieścić pętlę w programie,
Poczytaj lepiej kurs..
P-45973
« 1 »
  Strona 1 z 1