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

[SFML] Kolizja z użyciem getpixel()

Ostatnio zmodyfikowano 2019-11-10 01:30
Autor Wiadomość
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ć?
P-175508
pekfos
» 2019-11-09 22:57:49
Nie rozumiem pytania. Pytasz, patrząc jak jest zaimplementowana, czy co?
P-175509
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ć...
P-175510
pekfos
» 2019-11-09 23:05:03
Do teorii nie mam nic do dodania. Może podaj jakiś kod z tych nieudanych prób.
P-175511
R0ut4
Temat założony przez niniejszego użytkownika
» 2019-11-09 23:07:51
Problem jest przy poruszaniu postacią
Cały kod:

C/C++
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
//#include "postac.h"

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;
   
    //TWOREZNIE SPRITÓW
    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" );
   
    //TWORZENIE SPRITOW
    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:
            //OBSLUGA ZDARZEN W 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:
            //OBSLUGA ZDARZEN W WYBORZE POSTACI
           
            break;
        case pauza:
            //OBSLUGA ZDARZEN W PAUZIE
           
            break;
        case swiat1:
            //OBSLUGA ZDARZEN W GRZE
            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:
            //ZDARZENIA W EKWIPUNKU
           
            break;
        }
        platformowka.clear();
        switch( stan )
        {
        case menu:
            //WYSWIETLANIE W MENU
            platformowka.draw( menu_glowne );
            platformowka.draw( wskaznik );
            break;
        case wybor:
            //WYSWIETLANIE W WYBORZE POSTACI
           
            break;
        case pauza:
            //WYSWIETLANIE W PAUZIE
           
            break;
        case swiat1:
            //WYSWIETLANIE W GRZE
            platformowka.draw( sp_swiat1 );
            platformowka.draw( player );
            break;
        case eq:
            //WYSWIETLANIE EKWIPUNKU
           
            break;
        }
        platformowka.display();
    }
    return 0;
}
P-175512
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ę
P-175513
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ć.

C/C++
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.
P-175514
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:
C/C++
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...
P-175515
« 1 » 2 3
  Strona 1 z 3 Następna strona