• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SFML Kolizja przy użyciu Bounding Box-Nie działa

VPS Starter Arubacloud
0 głosów
324 wizyt
pytanie zadane 18 kwietnia 2016 w C i C++ przez DualOxygen Użytkownik (810 p.)


#include <SFML/Graphics.hpp>
#include<iostream>
using namespace std;
int main()
{
    sf::RenderWindow oknoAplikacji(sf::VideoMode(800, 600), "Okno!");
    sf::RectangleShape gracz(sf::Vector2f(50, 100));
    sf::RectangleShape gracz_02(sf::Vector2f(50, 100));
    sf::FloatRect boundingBox = gracz.getGlobalBounds();
    sf::FloatRect boundingBox_02 = gracz_02.getGlobalBounds();


    while(oknoAplikacji.isOpen())
    {

        sf::Event zdarzenie;
        while(oknoAplikacji.pollEvent(zdarzenie))
        {
            if( zdarzenie.type == sf::Event::Closed )
                 oknoAplikacji.close();

        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
                gracz.move(0, -1);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
                gracz.move(0, 1);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
                gracz.move(-1, 0);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                gracz.move(1, 0);
         gracz_02.setPosition( 200, 100 );
        if (boundingBox.intersects(boundingBox_02))
        {
            cout<<"Kolizjaaa !!!!!!!"<<endl;
        }

        oknoAplikacji.clear();
        oknoAplikacji.draw(gracz);
        oknoAplikacji.draw(gracz_02);
        oknoAplikacji.display();
    }
    return 0;
}
Witam niedawno zabrałem się za robienie kolizji we sfml wie ktoś czemu program nie działa jak należy :/(przy kolizji 2 kształtów program miałby wypisywać cout w konsoli natomiast on to robi cały czas nawet jak kolizji nie ma).
1
komentarz 18 kwietnia 2016 przez DualOxygen Użytkownik (810 p.)
Nie wiem czemu mój komentarz zamieścił się jakby zwykły kod ale dla pewności wrzuce go jeszcze tu :

Witam niedawno zabrałem się za robienie kolizji we sfml wie ktoś czemu program nie działa jak należy :/(przy kolizji 2 kształtów program miałby wypisywać cout w konsoli natomiast on to robi cały czas nawet jak kolizji nie ma).

2 odpowiedzi

+2 głosów
odpowiedź 18 kwietnia 2016 przez criss Mędrzec (172,590 p.)
wybrane 23 kwietnia 2016 przez DualOxygen
 
Najlepsza
Być może masz jakieś przyzwyczajenia z innego języka..

W każdym razie: getGlobalBounds zwraca ci obiekt Rect stosowny do pozycji w jakiej znajdował się kształt przy wywołaniu metody. To nie jest referencja, to jest zupełnie nowy, niezależny obiekt. Także za każdym razem musisz prosić o nowy rect, żeby mieć pewność, że reprezentuje on odpowiedni "teren" do pozycji kształtu.
komentarz 23 kwietnia 2016 przez DualOxygen Użytkownik (810 p.)
Sorki że dopiero teraz odpowiadam ale c++ jest moim pierwszym jako takim językiem programowania ;)
0 głosów
odpowiedź 23 kwietnia 2016 przez DualOxygen Użytkownik (810 p.)

Okej sprawdzanie bounding boxów znajduje się teraz w pętli aplikacji(kod poniżej). Mam natomiast kilka pytań odnośnie tego kodu ;) :

1.Jak mógłbym usunąć obiekt gracz _02 przy użyciu kolizji ?

2.Mam kilka pytań odnośnie konstruktorów które użyłem we sfml(przez 2 pytanie nie moge jakoś też wypróbować wskaźnikowego sposobu usuwania obiektu) jakoś dziwie się że wcześniej to ominołem ale czemu Konstruktory wiedząc z lekcji od pana mirosława mają swoje nazwy dowolne(wtf ;/) a nie tylko takie jakie definiuje klasa. Czyli czemu:

sf::RectangleShape gracz_02(sf::Vector2f(20, 50));

a nie :

sf::RectangleShape(sf::Vector2f(20,50));

Nie wiem tylko jak by się miało później do takiego obiektu odwoływać :P Ale mimo wszystko prosze o wyjaśnienie !

 

#include <SFML/Graphics.hpp>
#include<iostream>
using namespace std;
int main()
{
    unsigned int licznikKolizji=0;
    sf::RenderWindow oknoAplikacji(sf::VideoMode(800, 600), "Okno!");
    sf::RectangleShape gracz(sf::Vector2f(50, 100));
    sf::RectangleShape gracz_02(sf::Vector2f(20, 50));
    while(oknoAplikacji.isOpen())
    {

        sf::Event zdarzenie;
        while(oknoAplikacji.pollEvent(zdarzenie))
        {
            if( zdarzenie.type == sf::Event::Closed )
                 oknoAplikacji.close();

        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
                gracz.move(0, -1);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
                gracz.move(0, 1);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
                gracz.move(-1, 0);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                gracz.move(1, 0);
        gracz_02.setPosition( 200, 100 );
        sf::FloatRect boundingBox = gracz.getGlobalBounds();
        sf::FloatRect boundingBox_02 = gracz_02.getGlobalBounds();

        if (boundingBox.intersects(boundingBox_02))
        {
            ++licznikKolizji;
            if (licznikKolizji==1)
            {
            cout<<"Kolizjaaa !!!!!!!"<<endl;
            }
        }

        oknoAplikacji.clear();
        oknoAplikacji.draw(gracz);
        oknoAplikacji.draw(gracz_02);
        oknoAplikacji.display();
    }
    return 0;
}

 

komentarz 23 kwietnia 2016 przez criss Mędrzec (172,590 p.)

1. Emm no jak chcesz. Sposobów jest tyle ile wymyślisz. Najlepiej jakby oba obiekty były w jakimś kontenerze (pewnie vector) a rysowanie odbywało się w pętli. Wtedy możesz po prstu wyrzucać obiekty z kontenera i... tyle. Rysować się będzie tylko to co jest w kontenerze.

2. Nie wiem o co ci chodzi, że mają nazwy dowolne XD Chodzi ci o  to, że gracz_02 jest nazwą konstruktora? Nie, nie jest. To jest nazwa obiektu. Konstruktora się nie wywołuje jawnie (nie da się) - automatycznie jest wywoływany w chwili tworzenia obiektu.

sf::RectangleShape(sf::Vector2f(20,50));

To też nie jest wywołanie konstruktora, tylko utworzenie obiektu bez nazwy. Nie odwołasz się do neigo bo jest bez nazwy, a poza tym przestaje istnieć po średniku (wstaw jakiegoś cout-a w destruktor i sam zobacz). Jeśli chcesz utworzyć bezimienny obiekt i pozostawić go w pamięci musisz użyc operatora new.

Podobne pytania

0 głosów
1 odpowiedź 250 wizyt
pytanie zadane 2 kwietnia 2017 w C i C++ przez 10kw10 Pasjonat (22,880 p.)
0 głosów
2 odpowiedzi 636 wizyt
pytanie zadane 13 maja 2015 w C i C++ przez figorin Bywalec (2,040 p.)
0 głosów
1 odpowiedź 445 wizyt
pytanie zadane 4 listopada 2016 w C i C++ przez Emil Panecki Bywalec (2,100 p.)

93,012 zapytań

141,977 odpowiedzi

321,266 komentarzy

62,354 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...