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

Kolizja ze ścianą SFML

Ostatnio zmodyfikowano 2016-06-23 22:42
Autor Wiadomość
abdel123
Temat założony przez niniejszego użytkownika
Kolizja ze ścianą SFML
» 2016-06-23 20:31:28
Witam, napisałem funkcję która wykrywa kolizje. Nie mam tylko pojęcia co wstawić w IFie, aby po zderzeniu obiekt się zatrzymywał i po zmianie zwrotu na inny niż ten który jest obecnie nie stał w miejscu.
C/C++
void hit( Pacman p1, Mapa mapa )
{
   
    for( int y = 0; y < kafle_y - 1; y++ )
    {
        for( int x = 0; x <= kafle_x - 1; x++ )
        {
           
            if( p1.bb_pacman.intersects( mapa.kafelek[ x ][ y ].getGlobalBounds() ) && mapa.type[ x ][ y ] == '1' /* typ 1 to ściana */ )
            {
               
            }
        }
    }
   
    //przenioslem tutaj mechanizm chodzenia
    //zwrot up=1 down=2 right=3 left=4
    switch( zwrot )
    {
    case 1: posy -= p1.speed;
        break;
    case 2: posy += p1.speed;
        break;
    case 3: posx += p1.speed;
        break;
    case 4: posx -= p1.speed;
        break;
    }
   
}
P-149420
marcolo2307
» 2016-06-23 21:19:22
Najlepiej przed wykonaniem ruchu sprawdzaj czy np. x+speed==ściana.getPosition() i nie pozwalaj na wchodzenie w ścianę. BTW nie łatwiej byłoby sterować strzałkami/WSAD'em? (sf::Keyboard albo ASCII).
P-149422
abdel123
Temat założony przez niniejszego użytkownika
» 2016-06-23 21:26:36
Sterowanie jest wsadem ale w innej funkcji. Chodzi o to ze po wcisnieciu W obiekt ciagle ma isc do przodu itd
C/C++
void ruch()
{
   
    switch( zdarzenie.type )
    {
       
       
    case sf::Event::Closed:
       
        break;
       
    case sf::Event::KeyPressed:
        switch( zdarzenie.key.code )
        {
           
        case sf::Keyboard::Escape:
            okno.close();
            break;
           
        case sf::Keyboard::W:
            if( zwrot != 1 )
            {
                zwrot = 1;
            }
           
            break;
           
        case sf::Keyboard::S:
            if( zwrot != 2 )
            {
                zwrot = 2;
               
            }
           
            break;
           
           
        case sf::Keyboard::D:
            if( zwrot != 3 )
            {
                zwrot = 3;
               
            }
           
            break;
           
           
        case sf::Keyboard::A:
            if( zwrot != 4 )
            {
                zwrot = 4;
            }
           
            break;
            default: break;
        }
        break;
    }
P-149423
marcolo2307
» 2016-06-23 21:29:32
No to skorzystaj z tego, co napisałem wyżej.
P-149424
abdel123
Temat założony przez niniejszego użytkownika
» 2016-06-23 21:38:57
Dzięki, właśnie wdrażam do kodu :P
P-149425
abdel123
Temat założony przez niniejszego użytkownika
» 2016-06-23 21:57:16
Zamieniłem switch na zwykłe ify, ale po dopisaniu tej funkcji wyskakupe mi error " no match for 'operator==' (operand types are 'int' and 'const Vector2f {aka const sf::Vector2<float>}')"
C/C++
void ink( Pacman p1, Mapa mapa )
{
   
   
    for( int y = 0; y <= kafle_y - 1; y++ )
    {
        for( int x = 0; x <= kafle_x - 1; x++ )
        {
            if( zwrot == 1 && mapa.type[ x ][ y ] == '1' && posx + p1.speed == mapa.kafelek[ x ][ y ].getPosition() ) { posy -= p1.speed; }
            if( zwrot == 2 && mapa.type[ x ][ y ] == '1' && posx + p1.speed == mapa.kafelek[ x ][ y ].getPosition() ) { posy += p1.speed; }
            if( zwrot == 3 && mapa.type[ x ][ y ] == '1' && posy + p1.speed == mapa.kafelek[ x ][ y ].getPosition() ) { posx += p1.speed; }
            if( zwrot == 4 && mapa.type[ x ][ y ] == '1' && posy + p1.speed == mapa.kafelek[ x ][ y ].getPosition() ) { posx -= p1.speed; }
        }
    }
    /*switch(zwrot)
                        {
                            case 1: posy-=p1.speed;
                            break;
                            case 2: posy+=p1.speed;
                            break;
                            case 3: posx+=p1.speed;
                            break;
                            case 4: posx-=p1.speed;
                            break;
                        }*/
}
P-149427
abdel123
Temat założony przez niniejszego użytkownika
» 2016-06-23 22:01:00
dodam ze posx i posy to zmienne typu int i okreslaja pozycje pacmana
P-149428
marcolo2307
» 2016-06-23 22:17:08
::getPosition() zwraca ci sf::Vector2f, masz to napisane w błędzie... Tu masz dokumentację SFML'a, poczytaj sobie.
P-149430
« 1 » 2
  Strona 1 z 2 Następna strona