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

[SFML] Pacman, problem.

Ostatnio zmodyfikowano 2012-10-30 12:57
Autor Wiadomość
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.
P-67561
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.
P-67565
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 ;]
P-67569
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...
P-67573
Capitan
Temat założony przez niniejszego użytkownika
» 2012-10-26 20:51:38
Kod w SFML:
C/C++
#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;
       
       
        //ruchX=0;
        //ruchY=0;
    }
   
    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 ) )
        {
            //if(mapa[5][5]==1)
            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();
        //getch();
    }
    return 0;
}
P-67575
Mrovqa
» 2012-10-26 21:10:55
Kod umieść w znacznikach [cpp][/cpp], Twój post będzie wyglądał dużo lepiej.
P-67577
DejaVu
» 2012-10-26 21:30:02
C/C++
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).
P-67584
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 ;]

C/C++
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óś ;]

C/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
C/C++
#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;
    }
   
};
/*struct polorzenie_duch
{
    double x;
    double y;
    double fPredkosc;
    polorzenie_duch(double f_x=0.0,double f_y=0.0,double f_fPredkosc=1.0)
        :x(f_x)
        ,y(f_y)
        ,fPredkosc(f_fPredkosc)
    {}

    void RuchDuch(double idzDoX, double idzDoY)
    {
        if( x < idzDoX )
        {
            x += fPredkosc;
            if( x > idzDoX )
                 x = idzDoX;

        } else
        if( x > idzDoX )
        {
            x -= fPredkosc;
            if( x < idzDoX )
                 x = idzDoX;

        }

        if( y < idzDoY )
        {
            y += fPredkosc;
            if( y > idzDoY )
                 y = idzDoY;

        } else
        if( y > idzDoY )
        {
            y -= fPredkosc;
            if( y < idzDoY )
                 y = idzDoY;

        }
    }
};*/



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 ) );
   
    /*    typedef std::vector < polorzenie_duch > duszek;
        duszek duch;
        duch.push_back(polorzenie_duch(100,100,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 );
            // p2.Move(-32,0);
        }
       
        else if( sterowanie.IsKeyDown( Key::D ) || sterowanie.IsKeyDown( Key::Right ) )
        {
            if( mapa[ znak2 / 32 ][( znak + 32 ) / 32 ] != 1 )
            //if(p2.GetPosition().x<100)
                 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 );
           
        }
       
        //znak=p2.GetPosition().x;
        //
        //znak2=p2.GetPosition().y;
        //cout << znak << " "<< znak2 << endl;
        //duch[0].RuchDuch(300,300);
       
       
        /*for(duszek::const_iterator i = duch.begin(); i != duch.end(); ++i )
                     App.Draw( sf::Shape::Circle( i->x, i->y, 16, sf::Color::Red ) );*/
        for( VObiektyT::iterator i = pacman.begin(); i != pacman.end(); ++i )
             i->aktualizujPolozenie();
       
        App.Draw( p2 );
        App.Display();
        //getch();
    }
    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

P-67631
« 1 » 2
  Strona 1 z 2 Następna strona