Arkanoid 3D krok po kroku

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

Celem tego cyklu jest stworzenie gry komputerowej wzorowanej na pomyśle znanym z klasycznego już Arkanoid. Postaramy się odmłodzić tę grę dodając jej jeden wymiar, dzięki czemu nie tylko zyska przydomek 3d ale pozwoli nam się "pobawić" grafiką trójwymiarową. Grę będziemy pisać od podstaw w języku C++.

Dzięki artykułom z tego cyklu nauczymy się:

  • wyświetlać bryły trójwymiarowe na ekranie
  • używać wbudowanego w Open GL modelu oświetlenia
  • używać tekstur
  • wykrywać kolizje między obiektami
  • odtwarzać dźwięki zorientowane w przestrzeni trójwymiarowej

Podczas implementacji naszej gry poznamy biblioteki: SDL, Open GL, Open AL.

Tworzenie okna i kontekstu Open GL

Do zarządzania oknem i zdarzeniami generowanymi przez system operacyjny oraz użytkownika użyjemy biblioteki SDL. Biblioteka ta pozwala nam nie myśleć o specyfice systemu operacyjnego na którym działać będzie nasza aplikacja, co zaoszczędzi nam kilka godzin żmudnego kodowania. Napiszmy zatem pierwszą funkcję wykorzystującą polecenia z SDL odpowiedzialną za inicjalizację biblioteki i utworzenie okna z przypiętym do niego kontekstem Open GL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void initSDL( int scrWidth, int scrHeight )
{
    // zaincjalizowanie części biblioteki odpowiadającej za wyświetlanie
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        throw std::runtime_error( "Can't initialize SDL\n" );
    }
 
    // ustawienie ilości bitów dla każdego z kolorów
    SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
 
    // ustawienie ilości bitów dla specjalnych buforów
    SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 24 );
    SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 8 );
 
    // włączenie podwójnego buforowania
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, true );
    SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 1 );
 
    // stworzenie okna aplikacji z kontekstem OpenGL'a
    if ( SDL_SetVideoMode( scrWidth, scrHeight, 24, SDL_OPENGL ) == 0 )
    {
        throw std::runtime_error(
            std::string( "Unable to set video mode: " ).append( 
            std::string( SDL_GetError() ) ) );
    }
}

Przyjrzyjmy się teraz przedstawionemu fragmentowi kodu:

  • Linia nr 4 to inicjalizacja samej biblioteki.
  • W liniach od 10 do 12 ustawiane są ilości bitów dla składowych koloru - czerwonej, niebieskiej i zielonej. Z reguły takie ustawienie jest ustawieniem domyślnym dla większości komputerów, wyjątek mogą stanowić urządzenia mobilne i konsole na których ze względów wydajnościowych warto użyć innego rozkładu.
  • Linie 15 i 16 to powtórzenie operacji ustawienia bitów dla specjalnych buforów Open GL'a. W naszym kodzie używamy dwóch buforów: bufora głębi ( zwanego również z-buforem ) i bufora szablonu.
  • W kolejnych liniach naszego kodu znajdują się polecenia włączające podwójne buforowanie oraz synchronizację pionową.
  • Ostatnie polecenie którym się zajmiemy znajduje się w linii 23 i odpowiada za utworzenie okna naszej aplikacji. Parametrami są:
    • szerokość okna
    • wysokość okna
    • liczba bitów przypadającą na jeden piksel
    • flagi zachowania i specjalnych własności
    .

Rys. 1 Przykładowy obraz bufora głębi.

Podwójne buforowanie to technika polegająca na używaniu dwóch identycznych buforów w pamięci i zapisywaniu do jednego buforu podczas gdy drugi zajęty jest przenoszeniem danych pomiędzy pamięcią karty graficznej a oknem naszej aplikacji. Podwójne buforowanie podwaja ilość używanej pamięci dając w zamian bardziej płynną animację.

Synchronizacja pionowa odpowiada za synchronizację wyświetlania monitora z generowaniem obrazu przez kartą graficzną. Brak synchronizacji pionowej może spowodować błędy w renderowanym obrazie. Z reguły wyłącza się synchronizację pionową, aby zmierzyć wydajność programu ( mierzy się ją w klatkach na sekundę ).

Bufory takie jak bufor głębi czy bufor szablony zdefiniowane są per piksel ( co oznacza, że jeden element bufora odpowiada dokładnie jednemu pikselowi na ekranie ) i domyślnie używają wartości typu integer. Bufor głębi, w swoim podstawowym zastosowaniu odpowiada za poprawne wyświetlanie obrazów w których obiekty geometryczne renderowane są w losowej kolejności i mogą zasłaniać się nawzajem

Bardziej szczegółowo omówimy bufory specjalne przy okazji ich wykorzystania w kodzie naszej gry.

Tak przygotowane okno jest gotowe do wyświetlania obrazów jakie stworzymy za pomocą biblioteki Open GL.


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

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com