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

[Allegro] Korzystanie ze struktur

Ostatnio zmodyfikowano 2009-01-14 21:02
Autor Wiadomość
snake_yaro
Temat założony przez niniejszego użytkownika
[Allegro] Korzystanie ze struktur
» 2009-01-08 23:50:22
Witam.

Rozpoczynam zabawę z allegro, jestem na etapie, w którym udało mi się utworzyć postać, która porusza się, skacze na deseczki, obraz gry się przesuwa. Nie wiem jak się zabrać do stworzenia klasy obiektu (załóżmy deseczki - na którą postać może wskoczyć) oraz jej wykorzystania w dalszej części gry. A może spróbować za pomocą tablicy - jak? Jest ktoś w stanie zaprezentować szkielet takiego swobodnego korzystania ze struktur/klas? Aby wyświetlić obiekt na ekranie podaje się współrzędne ew. można losowo je generować, ale przecież nie będę robił osobnych zmiennych oraz wywoływał ich poprzez
masked_blit
, gdyż wydaje mi się, że musi być jakiś inny, bardziej wydajny sposób. Ponadto, wpadłem na pomysł, aby zapisywać współrzędne obiektów do osobnym pliku, a potem tylko wykorzystywać ten plik do stworzenia mapy (w jakich miejscach znajdują się deseczki). Jednakże jak to ze sobą powiązać?

Dziękuję za wszelkie odpowiedzi.
P-3590
lynx
» 2009-01-09 09:35:24
Pzykładowa klasa deseczki:
C/C++
class deska
{
public:
    int x, y;
    BITMAP * gfx;
    deska( int Ax, int Ay ) //konstruktor klasy - poczytaj w kursie
};
Konstruktor klasy:
C/C++
deska::deska( int Ax, int Ay )
{
    x = Ax;
    y = Ay;
    gfx = load_bmp( "sciezka.bmp", default_palette )
}
lub szybszy jednak nieco trudniejszy sposób na zrobienie konstruktora:
C/C++
deska::deska( int Ax, int Ay )
    : x( Ax )
    , y( Ay )
    , gfx( load_bmp( "sciezka.bmp", default_palette ) )
{
}
/edit1:

oraz jej wykorzystania w dalszej części gry
Taka klasa jest bardzo pomocna w dalszym tworzeniu gry. Bo jak będziesz miał załużmy 100 deseczek, to definiujesz nie np. 3 tablice zmiennych o nazwach x,y,*gfx, a jedną tablicę obiektów zawierających x,y, i *gfx. Jak odwoływać się to klasy itp. poczytaj w kursie.

Co do zapisywania to dobrze by było jakbyś znał vectora (tzw. dynamiczna tablica) będzie o wiele łatwiej stworzyć edytor map itp. Do zapisu użyj fstream bądź cstdio. :)
P-3591
snake_yaro
Temat założony przez niniejszego użytkownika
» 2009-01-13 23:08:08
Dzięki Pietrzuch za odpowiedź.

Zanim zastosuję klasę deski postanowiłem przetestować wczytywanie współrzędnych z tablicy, oto co zrobiłem:

Zdefiniowałem rozmiar tablic:
C/C++
#define TABSIZE     5

Potem zainicjowałem dwie tablice:

C/C++
int tablica_x[ TABSIZE ] = { 200, 300, 300, 400, 500 };
int tablica_y[ TABSIZE ] = { 300, 300, 400, 500, 600 };

Pierwsza tyczy się współrzędnych x, druga y.

Zastosowałem pętlę przy wyświetlaniu deski co wygląda w następujący sposób:

C/C++
for( int i = 0; i < TABSIZE; i++ )
{
    deska_x = tablica_x[ i ];
    deska_y = tablica_y[ i ];
    i++;
   
    masked_blit( deska, bufor, 0, 0, deska_x, deska_y, deska->w, deska->h );
}

Niestety nie działa to jak powinno, deska wyświetla się (tylko jedna, co też dziwne), lecz nie można na nią wskoczyć. Postanowiłem zmienić wszelkie deklaracje w kodzie ze
deska_x
 na
tablica_x[ i ]
 - tak samo dla igreków, ale również nie przyniosło to efektów. Co ciekawe nie przesuwa mi się ekran.

Jakieś pomysły? Zaprezentować kod?
P-3658
snake_yaro
Temat założony przez niniejszego użytkownika
» 2009-01-13 23:28:30
Problem wyświetlania został rozwiązany w taki sposób:

C/C++
for( int i = 0; i < TABSIZE; i++ )
{
    masked_blit( deska, bufor, 0, 0, tablica_x[ i ], tablica_y[ i ], deska->w, deska->h );
}

Jednakże nadal nie da się wskoczyć na deskę oraz ekran się nie przesuwa.
P-3661
lynx
» 2009-01-13 23:31:35
Najpierw powiem, że przy każdym obrocie pętli dodajesz do wartości zmiennej i 2, a nie 1. Co do reszty to nie najlepiej to wygląda na tablicach. A jak już to po co je od nowa przepisywać do deseka_x,- y? Można zrobić przecież tak:
C/C++
for( int i = 0; i < TABSIZE; i++ ) //TU już masz i++ !!
{
    masked_blit( deska, bufor, 0, 0, dtablica_x[ i ], tablica_y[ i ], deska->w, deska->h );
}
W razie potrzeby dodania kolizji mamy wszystkie pozycje desek zapisane.
Teraz powinno być lepiej. Kod by się też przydał.

Aha pamiętaj, że to jest funkcja wyświetlająca już deski oprócz tego robisz tylko wyświetlanie ludzika w buforze, wyświetlanie bufora na ekranie, a za nim cokolwiek narysujesz w buforze czyścisz go funkcją clear_to_color.

/edit1:
Teraz robiąc kolizje posługujemy się elementami tablica_x i tablica_y.
P-3662
snake_yaro
Temat założony przez niniejszego użytkownika
» 2009-01-13 23:42:39
P-3663
DejaVu
» 2009-01-14 02:02:24
Ja bym to zrobił tak:
 
C/C++
class CDeska
{
protected:
    int m_x;
    int m_y;
    BITMAP * m_pGrafika;
public:
   
    CDeska( int x, int y, BITMAP * pGrafika )
        : m_x( x )
        , m_y( y )
        , m_pGrafika( pGrafika )
    {
    }
   
    void rysuj( BITMAP * pBufor, int iDeltaX = 0, int iDeltaY = 0 )
    {
        //tutaj dodać if'a => jeśli nie mieści się na ekranie nie wywoływać masked_blit
        masked_blit( m_pGrafika, pBufor, 0, 0, m_x - iDeltaX, m_y - iDeltaY, m_pGrafika->w, m_pGrafika->h );
    }
};

class CDeski
{
protected:
    typedef std::vector < CDeska > TDeski;
    TDeski m_vDeski;
    int m_iKameraX;
    int m_iKameraY;
public:
    CDeski()
        : m_iKameraX( 0 )
        , m_iKameraY( 0 )
    {
       
    }
   
    dodajDeske( int x, int y, BITMAP * pGrafika )
    {
        m_vDeski.push_back( CDeska( x, y, pGrafika ) );
    }
    ustawKamere( int x, int y )
    {
        m_iKameraX = x;
        m_iKameraY = y;
    }
   
    rysuj( BITMAP * pBufor )
    {
        for( TDeski::iterator i = m_vDeski.begin(); i != m_vDeski.end(); i++ )
        {
            i->rysuj( pBufor, m_iKameraX, m_iKameraY );
        }
    }
   
};
//...
//w programie przed pętlą
BITMAP * wygladDeski = load_bmp( "sciezka.bmp", default_palette );
CDeski deski;
deski.dodajDeske( 50, 50, wygladDeski );
deski.dodajDeske( 100, 50, wygladDeski );
deski.dodajDeske( 150, 50, wygladDeski );
deski.dodajDeske( 200, 50, wygladDeski );
int pozycjaKameryX = 0;
//w pętli rysującej

deski.ustawKamere( pozycjaKameryX, 0 );
deski.rysuj( buforEkranu );

//na koncu programu

//free wygladDeski <= czy jakkolwiek się to robiło w allegro;

Program jest napisany w ~5min więc można go spokojnie lepiej napisać, jednak jako jakiś wzór wypadkowy może posłużyć
P-3664
snake_yaro
Temat założony przez niniejszego użytkownika
» 2009-01-14 10:12:37
Wszystko zrozumiałe, ale chyba nie dla kompilatora, ponieważ wywala mi masę błędów przy tej drugiej klasie. Reszta innych błędów wydaje mi się, że jest spowodowana tym pierwszym, który podałem poniżej:

C/C++
ISO C++forbids declaration of ` vector ' with no type
P-3665
« 1 » 2
  Strona 1 z 2 Następna strona