R0ut4 Temat założony przez niniejszego użytkownika |
[SFML] Kolizja z użyciem getpixel() » 2019-11-09 22:50:25 Witam, (pekfos mam nadzieje że pomożesz:) ), na jakiej zasadzie działa implementacja funkcji getPixel(usignet x, usignet y) const? Próbowałem już wielu rzeczy, sprawdzałem w oryginalnej dokumentacji SFML, szukałem na tym forum oraz 4programmers jak i forach anglojęzycznych... Może jestem upośledzony, a może to ciężko wyjaśnić, ale proszę może ktoś spróbować? |
|
pekfos |
» 2019-11-09 22:57:49 |
|
R0ut4 Temat założony przez niniejszego użytkownika |
» 2019-11-09 23:02:19 To znaczy, chyba najlepiej będzie w takim sensie, że prawie kompletnie jej nie ogarniam :,( Wiem że jest to z klasy Image, i że pobiera kolor piksela ze współrzędnych z nawiasów, ale próbowałem to różnie zrobić i nic mi się nie udało zrobić... |
|
pekfos |
» 2019-11-09 23:05:03 Do teorii nie mam nic do dodania. Może podaj jakiś kod z tych nieudanych prób. |
|
R0ut4 Temat założony przez niniejszego użytkownika |
» 2019-11-09 23:07:51 Problem jest przy poruszaniu postacią Cały kod: #include <SFML/Graphics.hpp> #include <SFML/Window.hpp>
void move(); void setPosition();
enum Stan { menu, wybor, pauza, swiat1, eq };
int main() { sf::RenderWindow platformowka( sf::VideoMode( 1000, 700, 32 ), "Platformowka" ); platformowka.setFramerateLimit( 60 ); Stan stan = menu; sf::Texture texture_player; sf::Texture textura_menu; sf::Texture textura_wskaznika; sf::Texture text_swiat1; texture_player.loadFromFile( "wojownik.png" ); textura_menu.loadFromFile( "menu_glowne.png" ); textura_wskaznika.loadFromFile( "wskaznik.png" ); text_swiat1.loadFromFile( "map1.png" ); sf::Sprite player; sf::Sprite menu_glowne; sf::Sprite wskaznik; sf::Sprite sp_swiat1; player.setTexture( texture_player ); menu_glowne.setTexture( textura_menu ); wskaznik.setTexture( textura_wskaznika ); sp_swiat1.setTexture( text_swiat1 ); wskaznik.setPosition( 240, 400 ); player.setPosition( 200, 100 ); sf::Event event; while( platformowka.isOpen() ) { while( platformowka.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) { platformowka.close(); } } switch( stan ) { case menu: if( wskaznik.getPosition().x == 240 && wskaznik.getPosition().y == 400 ) if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) { wskaznik.setPosition( 240, 550 ); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Enter ) ) { stan = swiat1; } if( wskaznik.getPosition().x == 240 && wskaznik.getPosition().y == 550 ) { if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) { wskaznik.setPosition( 240, 400 ); } } break; case wybor: break; case pauza: break; case swiat1: if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) ) { player.move( - 5, 0 ); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) ) { player.move( 5, 0 ); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) ) { if( sp_swiat1.getColor().Black == player.getColor().Black ) { player.move( 0, - 5 ); } else { player.setPosition( 100, 100 ); } } if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) ) { player.move( 0, 5 ); } break; case eq: break; } platformowka.clear(); switch( stan ) { case menu: platformowka.draw( menu_glowne ); platformowka.draw( wskaznik ); break; case wybor: break; case pauza: break; case swiat1: platformowka.draw( sp_swiat1 ); platformowka.draw( player ); break; case eq: break; } platformowka.display(); } return 0; }
|
|
R0ut4 Temat założony przez niniejszego użytkownika |
» 2019-11-09 23:11:15 Zły przykład dałem próby, to już było "ratunkowa próba" do poprzednich nie wrócę niestety... :( Wybacz proszę |
|
pekfos |
» 2019-11-09 23:23:10 No dobra, ale co z getPixel()? I może bardziej do rzeczy sf::Image. Nie masz nic takiego w kodzie. Żeby używać kolorów pikseli do obliczania kolizji, musisz mieć obrazy załadowane sf::Image i do wyświetlania załadowane do sf::Texture (najlepiej przez loadFromImage()). Musisz też mieć przyjęte, jakie kolory co znaczą. Przykładowo kolor sf::Color::Transparent jako niekolidująca część postaci i wszystko inne jako kolidująca, wtedy masz szanse mieć teksturę i maskę kolizji w jednym. Zwykle tak się nie da, z powodu animacji, albo elementów tekstury które nie powinny kolidować. if( sp_swiat1.getColor().Black == player.getColor().Black )
Ten warunek jest zawsze prawdziwy, bo Black nie jest składową koloru, tylko stałą definiującą kolor czarny i porównujesz ją samą ze sobą. Nawet jakbyś napisał sp_swiat1.getColor() == player.getColor() warunek jest zawsze prawdziwy w tym kodzie, bo getColor() zwraca kolor, jaki się samemu ustawi przez setColor(). To służy do 'koloryzowania' sprajta - kolor każdego piksela sprajta jest mnożony przez ten kolor podczas renderowania. |
|
R0ut4 Temat założony przez niniejszego użytkownika |
» 2019-11-09 23:30:37 no właśnie z getPixel nic mi nie wychodziło (tamte próby przepadły niestety). Próbowałem nawet z copytoimage(), loadfromimage() też próbowałem i nie wyszło. a z getpixel() to próbowałem mniej więcej tak: if( sf::Image::GetPixel( 0, 0 ) ==(...) )
gdzies dawałem jeszcze nazwę obrazka, nawet tworzyłem przedmiot klasy image (sf::Image coś) Mógłbyś podać jakiś kod z zastosowaniem getpixel()? Albo jak inaczej mógłbym wykywać kolizje? ( getlocalbounds() nie jest zbyt precyzyjne :/ ) PS. Będą animacje jeszcze... |
|
« 1 » 2 3 |