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. |
|
lynx |
» 2009-01-09 09:35:24 Pzykładowa klasa deseczki: class deska { public: int x, y; BITMAP * gfx; deska( int Ax, int Ay ) };
Konstruktor klasy: 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: 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. :) |
|
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: Potem zainicjowałem dwie tablice: 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: 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? |
|
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: 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. |
|
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: for( int i = 0; i < TABSIZE; 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. |
|
snake_yaro Temat założony przez niniejszego użytkownika |
» 2009-01-13 23:42:39 |
|
DejaVu |
» 2009-01-14 02:02:24 Ja bym to zrobił tak: 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 ) { 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 ); } } };
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;
deski.ustawKamere( pozycjaKameryX, 0 ); deski.rysuj( buforEkranu );
Program jest napisany w ~5min więc można go spokojnie lepiej napisać, jednak jako jakiś wzór wypadkowy może posłużyć |
|
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: ISO C++forbids declaration of ` vector ' with no type
|
|
« 1 » 2 |