Kolizja ze ścianą SFML
Ostatnio zmodyfikowano 2016-06-23 22:42
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. 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' ) { } } } 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; } }
|
|
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). |
|
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 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; }
|
|
marcolo2307 |
» 2016-06-23 21:29:32 No to skorzystaj z tego, co napisałem wyżej. |
|
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 |
|
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>}')" 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; } } } }
|
|
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 |
|
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. |
|
« 1 » 2 |