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

[Allegro] Podwójne Buforowanie nic nie daje

Ostatnio zmodyfikowano 2008-09-30 21:42
Autor Wiadomość
lynx
Mały przykład
» 2008-09-30 20:50:36
No to ja napiszę Ci taki mały przykładowy kodzik (ty go zmienisz do swoich potrzeb) :


C/C++
#include <allegro.h>
//inne 'includy'...

//zmienne statku;
int sx, sy;
//zmienne pocisku;
int px, py;
short int kierun, kierun2; //zmienna kierunku, o ile bedziesz jej uzywal w swojej grze
//bedzie ci sluzyc do odpowiedniego poruszania się przycisku
//funkcja kolizja niedopuszczajaca do przejscia obiektu przez teren niedozwolony


bool kolizja( void )
{
    if( sx < 600 ) /
         return true;
   
    if( sx > 0 )
    //Itd. funkcja sprawdza pozycje statku (koniec ekranu), i tylko statku
         return false;
   
}


int main()
{
    //ŁADOWANIE OBRAZKÓW< USTAWIANIE GŁĘBI KOLORÓW, itp.
   
    //PETLA
    do
    {
        // REAGOWANIE NA KLAWIATURĘ
        if( key[ Key_UP ] )
        {
            sy--;
            kierun = 1;
            if( kolizja == true )
            {
                sy++;
            } //zmienna ruchu się cofa zanim zostanie wyświetlona jej pozycja
        }
        if( key[ KEY_RIGHT )
        {
            sx++;
            kierun = 2;
            if( kolizja == true )
            {
                sx--;
            }
        }
        //Oraz inne funkcje odpowiadające za ruch
        if( key[ KEY_SPACE ] )
        {
            px = sx; //zaladowanie zmiennych pocisku odpowiednio do pozycji obeiktu (statek)
            py = sy;
            kierun2 = kierun;
        }
        //DODAWANIE ZMIENNEJ POCISKU !!!! DODAWANIE ZMIENNEJ POCISKU!!!!
        switch( kierun2 )
        {
        case '1':
            py--;
            break;
            //Itd. odpowiednio do kierunku statku
        }
        masked_blit( obrazek, bufor, pozycje statku, atrybuty funkcji );
        masked_blit( obrazek, bufor, pozycje pocisku, atrybuty funkcji );
        blit( bufor, screen, dalsze atrybuty funkcji );
        while( key[ KEY_ESC ] );
        //Funkcje Końcowe
    }




Ok, już tłumaczę funkcja kolizja sprawdza, czy obiekt statek, i tylko on nie wyjeżdża za ekran jak by co to go zatrzymuje w następnych funkcjiach. Gdy naciśniemy przycisk spacja, funkcje zapamiętują aktualny kierunek pozycję itp. rzeczy, by później móc prawidłowo wyświetlać pocisk. Pozycji pocisku nie sprawdzamy - bo po co? Jak pocisk będzie za ekranem to i tak zniknie.


W miarę poznawania c++, i bibliotek graficznych/do tworzenia gier (tj. Allegro) poprzerabiasz ten kod, tak by był jeszcze lepszy i bardziej funkcjonalny. Jednak narzie myślę, że taki kod Ci wystarczy pomimo, że ma bugi. Zresztą w końcu nie zrobie za Ciebie wszystkiego. Kod ten napisałem dla przykładu i lepszego zrozumienia tego całego poruszania się obiektów. Kod nie jest też taki 'bogaty' ponieważ był pisany dosłownie przed chwilą, żeby Ci pomóc, zresztą tak jak mówiłem to jest tylko przykład jak rozwiązać twój problem. Mam nadzieję, że pomogłem i docenisz moje starania :D, bo w końcu chwile trwało to pisanie kodu. ;p            Pozdrawiam, Piotrek.





/edit:
Co do rozszerzania kodu, to przykładowo możesz dodać parę zmiennych. Pocisk nie będzie znikał i się pojawiał w innym miejscu. Wystarczy, że dodasz zmienną int czas = 0; następnie za każdym obrotem pętli dodajemy do niej wartość 1 (czas++;).
I zmieniamy to:

C/C++
if( key[ KEY_SPACE ] )
{
    px = sx; //zaladowanie zmiennych pocisku odpowiednio do pozycji obeiktu (statek)
    py = sy;
    kierun2 = kierun;
}
na to:

C/C++
if( key[ KEY_SPACE ] && czas <= 1024 ) //1024 = musi być większe niż szerokość ekranu.
{
    px = sx; //zaladowanie zmiennych pocisku odpowiednio do pozycji obeiktu (statek)
    py = sy;
    kierun2 = kierun;
    czas = 0;
}
P-1739
Tombol
Temat założony przez niniejszego użytkownika
» 2008-09-30 21:42:28
Ok thx za wszelka pomoc teraz tylko rozkimam ten kod i będę mieć :P



Ktoś tam pisał żebym zaczął od c++ to odrazu odpowiadam że umiem c++ ale w teorii bo przeczytałem książki a napisałem 0 programów :/
P-1740
1 « 2 »
Poprzednia strona Strona 2 z 2