Capitan Temat założony przez niniejszego użytkownika |
[SFML] Pacman, problem. » 2012-10-26 19:11:30 Witajcie, od razu z miejsca zaświadczam, że przeczytałem wszystkie możliwe kursy o c++ i sfml na cpp0x.pl ;] Nie mogę znaleźć odpowiedzi na mój problem.
Otóż stworzyłem pacman'a w allegro, a teraz chciałem stworzyć go w Sfml lecz nie wiem jak odzwierciedlić jego poruszanie się.
Mam mapę kafelkową wypełnioną liczba 1,2 (1-pole po którym, może chodzić pacman, 2-ściana), chodzi mi o to by odzwierciedlić takie cóś ;p
ALLEGRO: if(map[(pacman_y)/32][(pacman_x-32)/32]!=1) pacman_x-=32;
SFML: else if(sterowanie.IsKeyDown(Key::D)||sterowanie.IsKeyDown(Key::Right)) { if(mapa[][]==1) pacman[0].przesun(5,0); }
Nie wiem jak pobrać współrzędną iksową (x) i igrekową (y)Circla(koła), gdyż obecnie pacman jest kołem, a nie sprajtem.^^.
Czytałem kurs kilka razy i nie znalazłem na to odpowiedzi, ale pewnie jest tak, że jest tam odpowiedź lecz ja jej nie widzie ;C
Proszę o jakieś nakierowanie mnie ;]
Jbc mogę wrzucić cały kodzik ;p
Pozdrawiam, Capinn. |
|
DejaVu |
» 2012-10-26 19:32:18 Hm... w zasadzie jeżeli masz napisaną grę w Allegro i chcesz ją przerobić na SFML to jedyne co zmieniasz to wyświetlanie grafiki (no i oczywiście obsługa sterowania). Cała logika gry pozostaje natomiast bez zmian. |
|
Capitan Temat założony przez niniejszego użytkownika |
» 2012-10-26 19:42:38 No może masz racje ^^ Ale dalej chciałbym uzyskać odpowiedź na moje pytanie ;] |
|
DejaVu |
» 2012-10-26 20:41:51 Nie dałeś fragmentu kodu odpowiedzialnego za wyświetlanie pacmana w Allegro. Swoją drogą intryguje mnie fakt jakim cudem udało Ci się napisać pacmana, skoro wkleiłeś fragment kodu w SFML-u, który nie jest poprawny składniowo... |
|
Capitan Temat założony przez niniejszego użytkownika |
» 2012-10-26 20:51:38 Kod w SFML: #include <SFML/Graphics.hpp>
using namespace sf;
struct polorzenie { double x; double y; double fPredkosc; polorzenie( double f_x = 0.0, double f_y = 0.0, double f_fPredkosc = 1.0 ) : x( f_x ) , y( f_y ) , fPredkosc( f_fPredkosc ) { } double ruchX; double ruchY; void aktualizujPolozenie() { if( ruchX > fPredkosc ) ruchX = fPredkosc; if( ruchX <- fPredkosc ) ruchX =- fPredkosc; if( ruchY > fPredkosc ) ruchY = fPredkosc; if( ruchY <- fPredkosc ) ruchY =- fPredkosc; x += ruchX; y += ruchY; } void przesun( int deltaX, int deltaY ) { ruchX = deltaX; ruchY = deltaY; } };
int main() { RenderWindow App( VideoMode( 640, 480, 32 ), "PACMAN" ); App.SetFramerateLimit( 60 ); typedef std::vector < polorzenie > VObiektyT; VObiektyT pacman; pacman.push_back( polorzenie( 48, 48, 1.0 ) ); Event event; Clock timer; int sk = 32, wk = 32; int map_x = 0, map_y = 0; float d; Image kafelka1, kafelka2, kafelka3; kafelka1.LoadFromFile( "1.bmp" ); kafelka2.LoadFromFile( "2.bmp" ); kafelka3.LoadFromFile( "3.bmp" ); Sprite k1, k2, k3; k1.SetImage( kafelka1 ); k2.SetImage( kafelka2 ); k3.SetImage( kafelka3 ); int mapa[ 15 ][ 20 ] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 3, 1, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 1 }, { 1, 3, 1, 3, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1 }, { 1, 3, 1, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 1 }, { 1, 3, 1, 3, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 1 }, { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, { 1, 1, 1, 1, 3, 3, 1, 1, 1, 3, 3, 1, 1, 1, 3, 3, 1, 1, 1, 1 }, { 1, 1, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 3, 3, 1, 1, 1, 1 }, { 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1 }, { 1, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 1 }, { 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 1 }, { 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 1 }, { 1, 3, 1, 3, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1 }, { 1, 3, 1, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }; while( App.IsOpened() ) { d = App.GetFrameTime(); timer.Reset(); map_y = 0; for( int i = 0; i < 15; i++ ) { map_x = 0; for( int j = 0; j < 20; j++ ) { if( mapa[ i ][ j ] == 1 ) { k1.SetPosition( map_x, map_y ); App.Draw( k1 ); } if( mapa[ i ][ j ] == 2 ) { k2.SetPosition( map_x, map_y ); App.Draw( k2 ); } if( mapa[ i ][ j ] == 3 ) { k3.SetPosition( map_x, map_y ); App.Draw( k3 ); } map_x += 32; } map_y += 32; } while( App.GetEvent( event ) ) { if( event.Type == Event::Closed ) App.Close(); if( event.Type == Event::KeyPressed && event.Key.Code == Key::Escape ) App.Close(); } const Input & sterowanie = App.GetInput(); if( sterowanie.IsKeyDown( Key::A ) || sterowanie.IsKeyDown( Key::Left ) ) { pacman[ 0 ].przesun( - 5, 0 ); } else if( sterowanie.IsKeyDown( Key::D ) || sterowanie.IsKeyDown( Key::Right ) ) { pacman[ 0 ].przesun( 5, 0 ); } else if( sterowanie.IsKeyDown( Key::W ) || sterowanie.IsKeyDown( Key::Up ) ) { pacman[ 0 ].przesun( 0.5, - 1.5 ); } else if( sterowanie.IsKeyDown( Key::S ) || sterowanie.IsKeyDown( Key::Down ) ) { pacman[ 0 ].przesun( 0.5, 1.5 ); } for( VObiektyT::const_iterator i = pacman.begin(); i != pacman.end(); ++i ) App.Draw( Shape::Circle( i->x, i->y, 16, Color::Yellow ) ); for( VObiektyT::iterator i = pacman.begin(); i != pacman.end(); ++i ) i->aktualizujPolozenie(); App.Display(); } return 0; }
|
|
Mrovqa |
» 2012-10-26 21:10:55 Kod umieść w znacznikach [cpp][/cpp], Twój post będzie wyglądał dużo lepiej. |
|
DejaVu |
» 2012-10-26 21:30:02 for( VObiektyT::const_iterator i = pacman.begin(); i != pacman.end(); ++i ) App.Draw( Shape::Circle( i->x, i->y, 16, Color::Yellow ) );
Hm... tak w zasadzie to nadal nie wiem o co Ci chodzi (i zapewne reszta też nie wie). |
|
Capitan Temat założony przez niniejszego użytkownika |
» 2012-10-27 10:06:15 Chodzi mi o to by pacman chodził tylko po czarnym tle(w mapie 1), a nie po całej mapie ;] if( mapa[ y / 32 ][( x - 32 ) / 32 ] != 1 ) pacman[ 0 ].przesun( 5, 0 ); Jeśli zrobie tak, to jest napisane, że nie mam zadeklarowanych zmiennych x,y. Chodzi mi o pobranie informacji o współrzędnych x i y, mojego kółka(pacmana) w danym miejscu na mapie. Dobra mam chyba lepszy pomysł ;] zmieniłem Shape na Sprite. Obecnie zrobiłem takie cóś ;] if( mapa[( p2.GetPosition().y + 32 ) / 32 ][( p2.GetPosition().x - 32 ) / 32 ] != 1 ) pacman[ 0 ].przesun( 5, 0 ); Tylko teraz wyskakuje błąd ;C "error: invalid types 'float [15][20][float]' for array subscript" I jeszcze dokładam pytanie to prawda, że GetPosition wskazuje takie współrzędne: _ _ _ | | |_____ /\ | (GetPosition.x,GetPosition.y) Jeszcze inaczej pokombinowałem xD #include <SFML/Graphics.hpp> #include <iostream> #include <cstdio>
using namespace sf; using namespace std; int znak, znak2; Image kafelka1, kafelka2, kafelka3, pacman2; Sprite k1, k2, k3, p2;
struct polorzenie { double x; double y; double fPredkosc; polorzenie( double f_x = 0.0, double f_y = 0.0, double f_fPredkosc = 1.0 ) : x( f_x ) , y( f_y ) , fPredkosc( f_fPredkosc ) { } double ruchX; double ruchY; void aktualizujPolozenie() { if( ruchX > fPredkosc ) ruchX = fPredkosc; if( ruchX <- fPredkosc ) ruchX =- fPredkosc; if( ruchY > fPredkosc ) ruchY = fPredkosc; if( ruchY <- fPredkosc ) ruchY =- fPredkosc; p2.Move( ruchX, ruchY ); } void przesun( int X, int Y ) { ruchX = X; ruchY = Y; } };
int main() { RenderWindow App( VideoMode( 640, 480, 32 ), "PACMAN" ); App.SetFramerateLimit( 60 ); typedef std::vector < polorzenie > VObiektyT; VObiektyT pacman; pacman.push_back( polorzenie( 32, 32, 1.0 ) ); Event event; Clock timer; int map_x = 0, map_y = 0; float d; kafelka1.LoadFromFile( "1.bmp" ); kafelka2.LoadFromFile( "2.bmp" ); kafelka3.LoadFromFile( "3.bmp" ); pacman2.LoadFromFile( "2.bmp" ); k1.SetImage( kafelka1 ); k2.SetImage( kafelka2 ); k3.SetImage( kafelka3 ); p2.SetImage( pacman2 ); p2.SetPosition( 32, 32 ); p2.SetScale( 0, 0 ); pacman2.CreateMaskFromColor( Color( 255, 0, 255 ), 0 ); short int mapa[ 15 ][ 20 ] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 3, 1, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 1 }, { 1, 3, 1, 3, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1 }, { 1, 3, 1, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 1 }, { 1, 3, 1, 3, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 1 }, { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, { 1, 1, 1, 1, 3, 3, 1, 1, 1, 3, 3, 1, 1, 1, 3, 3, 1, 1, 1, 1 }, { 1, 1, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 3, 3, 1, 1, 1, 1 }, { 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1 }, { 1, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 1 }, { 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 1 }, { 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 1 }, { 1, 3, 1, 3, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1 }, { 1, 3, 1, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }; while( App.IsOpened() ) { d = App.GetFrameTime(); timer.Reset(); map_y = 0; for( int i = 0; i < 15; i++ ) { map_x = 0; for( int j = 0; j < 20; j++ ) { if( mapa[ i ][ j ] == 1 ) { k1.SetPosition( map_x, map_y ); App.Draw( k1 ); } if( mapa[ i ][ j ] == 2 ) { k2.SetPosition( map_x, map_y ); App.Draw( k2 ); } if( mapa[ i ][ j ] == 3 ) { k3.SetPosition( map_x, map_y ); App.Draw( k3 ); } map_x += 32; } map_y += 32; } while( App.GetEvent( event ) ) { if( event.Type == Event::Closed ) App.Close(); if( event.Type == Event::KeyPressed && event.Key.Code == Key::Escape ) App.Close(); } znak = p2.GetPosition().x; znak2 = p2.GetPosition().y; const Input & sterowanie = App.GetInput(); if( sterowanie.IsKeyDown( Key::A ) || sterowanie.IsKeyDown( Key::Left ) ) { if( mapa[ znak2 / 32 ][( znak - 32 ) / 32 ] != 1 ) pacman[ 0 ].przesun( - 1, 0 ); } else if( sterowanie.IsKeyDown( Key::D ) || sterowanie.IsKeyDown( Key::Right ) ) { if( mapa[ znak2 / 32 ][( znak + 32 ) / 32 ] != 1 ) pacman[ 0 ].przesun( 1, 0 ); } else if( sterowanie.IsKeyDown( Key::W ) || sterowanie.IsKeyDown( Key::Up ) ) { if( mapa[( znak2 - 32 ) / 32 ][ znak / 32 ] != 1 ) pacman[ 0 ].przesun( 0, - 1 ); } else if( sterowanie.IsKeyDown( Key::S ) || sterowanie.IsKeyDown( Key::Down ) ) { if( mapa[( znak2 + 32 ) / 32 ][ znak / 32 ] != 1 ) pacman[ 0 ].przesun( 0, 1 ); } for( VObiektyT::iterator i = pacman.begin(); i != pacman.end(); ++i ) i->aktualizujPolozenie(); App.Draw( p2 ); App.Display(); } return 0; }
Tu jest kodzik, ale teraz pacman chodzi w cały świat ;x Wrzucam jeszcze pliki graficzne, może wreszcie ktoś mi pomoże ;)) http://imageshack.us/gal.php?id=q5qtkqKonKGwmKmcmePU06g |
|
« 1 » 2 |