Arkanoid 3D krok po kroku

23.04.2010 - Olgierd Humeńczuk
TrudnośćTrudność

Dodajemy ruch

Zmodyfikujmy nasz program tak, by wprowadzić możliwość poruszania sześcianu za pomocą myszki. Nasze zadanie wykonamy w następujących krokach:

  • dodamy strukturę w której będziemy przechowywać współrzędne myszki
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    /**
    * @struct position2d
    * @brief pozycja dwuwymiarowa
    */
    struct position2d
    {
        /**
        * @brief domyslny konstr.
        * inicjalizuje wsp. wartosciami zerowymi
        */
        position2d( void ) : x( 0 ), y( 0 ) { }
        /// wspolrzedna x
        int x;
        /// wspolrzedna y
        int y;
    } mousePosition; 
  • dodamy obsługę zdarzenia zmiany położenia myszki w funkcji processInput
    1
    2
    3
    
    case SDL_MOUSEMOTION:
    mousePosition.x = event.motion.x;
    mousePosition.y = event.motion.y;
  • napiszemy funkcję pomocniczą która pomoże przeliczyć współrzędne kursora myszki na ekranie na współrzędne obiektu
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    /**
    * @brief Funkcja pomocnicza, przelicza pozycję z jednej przestrzeni na inna
    *        okreslona podanymi parametrami
    *
    * @param posX pozycja wejściowa
    * @param maxPosX maksymalna wartosc jaką może uzyskać parametr posX
    * @param dstPosMin minimalna wartosc pozycji w docelowej przestrzeni
    * @param dstPosMax maksymalna wartosc pozycji w docelowej przestrzeni
    */ 
    GLfloat transformPos( GLfloat posX, GLfloat maxPosX, 
                          GLfloat dstPosMin, GLfloat dstPosMax )
    {
        GLfloat normalized = posX / maxPosX;
        return dstPosMin + ( ( dstPosMax - dstPosMin ) * normalized );
    }
  • zmienimy linię kodu odpowiedzialną za ustawienie współrzędnych obiektu z:
    1
    
    glTranslatef( 0.0f, 0.0f, -10.0f );
    na:
    1
    2
    3
    4
    5
    
    glTranslatef( 
        transformPos( static_cast< GLfloat >( mousePosition.x ), 
                      static_cast< GLfloat >( screenX ), 
                      -5.5f, 5.5f ),  
            0.0f, 0.0f ); 

Błędy?

Poprawimy "dziwne" zachowanie przesuwanego sześcianu. Na moim komputerze zauważyłem opóźnienie ruchu sześcianu względem ruchu myszki. Spowodowane jest to nieaktualnymi wartościami położenia kursora przekazywanymi w zdarzeniu SDL_MOUSEMOTION. Spróbujmy pozyskać informację o położeniu myszki w inny sposób. Istnieje w bibliotece SDL funkcja:

1
    Uint8 SDL_GetMouseState( int *x, int *y );
Parametrami tej funkcji są wskaźniki na zmienne typu int. Funkcja ta zwraca pojedynczy bajt w którym zapisana jest informacja o stanie klawiszy urządzenia. Zamieńmy linie w funkcji processInput:

1
2
mousePosition.x = event.motion.x;
mousePosition.y = event.motion.y;

na

1
SDL_GetMouseState( &mousePosition.x, &mousePosition.y );

i możemy cieszyć się płynnym ruchem naszego sześcianu na ekranie.

Co dalej?

Umiemy wyświetlić w przygotowanym przez nas oknie podstawowe wielokąty. Co więcej umiemy ułożyć je w bryłę, którą możemy poruszać! Mamy solidne podstawy do dalszej pracy. W następnej części zajmiemy się oświetleniem, by osiągnąć większe złudzenie głębi i dodać atrakcyjności grafice w naszej grze.

O wszelkich błędach, lub spostrzeżeniach dotyczących artykułu, można dyskutować na forum.

5
Twoja ocena: Brak Ocena: 5 (2 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com