miro741 Temat założony przez niniejszego użytkownika |
SFML Poruszanie obiektów/aktywacja obiektów » 2015-03-14 21:08:25 Siemanko siedzę na tym już parę dni i chcę aby wyświetliło mi 5 kwadratów,[][][][][] po czym jak kliknę np drugiego to żebym mógł nim sterować za pomocą strzałek. Mam zrobione wyświetlanie i poruszanie. Tylko brakuje mi tej aktywacji myszką #include <iostream> #include <cstdlib> #include <cmath> #include <SFML/Graphics.hpp> #define wxmx 800 #define wymy 600 #define ilosc 5 using namespace std;
class kwadrat { private: float x1, x2, q1, q2, w1, w2, e1, e2, r1, r2; public: void wspolrzedne() { x1 = 50; x2 = 50; q1 = 40; q2 = 40; w1 = 60; w2 = 60; e1 = 80; e2 = 80; r1 = 30; r2 = 30; } void rysuj() { void wspolrzedne(); sf::RenderWindow okno( sf::VideoMode( wxmx, wymy ), "SFML kwadraty" ); sf::Mouse myszka; sf::RectangleShape x( sf::Vector2f( x2, x1 ) ); x.setPosition( 200, 10 ); sf::RectangleShape q( sf::Vector2f( q2, q1 ) ); q.setPosition( 0, 10 ); sf::RectangleShape w( sf::Vector2f( w2, w1 ) ); w.setPosition( 100, 10 ); sf::RectangleShape e( sf::Vector2f( e2, e1 ) ); e.setPosition( 300, 10 ); sf::RectangleShape r( sf::Vector2f( r2, r1 ) ); r.setPosition( 400, 10 ); while( okno.isOpen() ) { sf::Event zdarzenie; while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed ) okno.close(); } while( okno.pollEvent( zdarzenie ) ) if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) q.move( 0, - 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) q.move( 0, 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) q.move( - 1, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) q.move( 1, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) x.move( 0, - 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) x.move( 0, 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) x.move( - 1, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) x.move( 1, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) w.move( 0, - 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) w.move( 0, 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) w.move( - 1, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) w.move( 1, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) e.move( 0, - 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) e.move( 0, 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) e.move( - 1, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) e.move( 1, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) r.move( 0, - 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) r.move( 0, 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) r.move( - 1, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) r.move( 1, 0 ); okno.clear(); okno.draw( x ); okno.draw( q ); okno.draw( w ); okno.draw( e ); okno.draw( r ); okno.display(); } } }; int main() { kwadrat pp; { pp.wspolrzedne(); pp.rysuj(); } return 0; }
i dalej nie wiem jak zrobić |
|
Lora |
» 2015-03-14 21:29:47 Po co tyle tych if-ów? Wystarczyłyby cztery. Kliknięcie myszki możesz sprawdzać funkcją sf::Mouse::isButtonPressed( sf::Mouse::Left ) , a jej pozycję funkcją sf::Mouse::getPosition( okno ) . |
|
miro741 Temat założony przez niniejszego użytkownika |
» 2015-03-14 21:36:40 No ok powiedz mi gdzie umieścić i jak te 2 funkcje aby one zadziałały. I których if się pozbyć ? |
|
Lora |
» 2015-03-14 21:50:09 if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) { q.move( 0, - 1 ); x.move( 0, - 1 ); w.move( 0, - 1 ); e.move( 0, - 1 ); r.move( 0, - 1 ); }
Sprawdzaj kliknięcie każdego kwadratu i przechowuj gdzieś który kwadrat został kliknięty. if( q.getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && sf::Mouse::isButtonPressed( sf::Mouse::Left ) ) { }
I po co ci te dwie komendy while( okno.pollEvent( zdarzenie ) ) ? Wyrzuć tę drugą. @EDIT: Tylko jeśli te kwadraty mogą zostać kliknięte i później odkliknięte to jako, że dzieje się to w pętli może się zdarzyć, że chciałeś kliknąć kwadrat jeden raz, a w rzeczywistości został on kliknięty kilka razy, ponieważ w czasie klikania pętla zrobiła kilka obiegów. Żeby to trochę spowolnić możesz dodać dodatkowy warunek: if( q.getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && sf::Mouse::isButtonPressed( sf::Mouse::Left ) && time.getElapsedTime().asSeconds() > 0.1 ) { time.restart(); }
time to obiekt klasy sf::Clock. |
|
miro741 Temat założony przez niniejszego użytkownika |
» 2015-03-14 22:03:59 Gdzie mogę przechowywać to kliknięcie ? |
|
Brunon3 |
» 2015-03-14 22:08:26 W tablicy zmiennych typu bool . :P -BD. |
|
Lora |
» 2015-03-14 22:10:31 Możesz też użyć kontenera map<char, bool>, żeby przypisać nazwę każdego kwadratu do informacji czy jest zaznaczony. Będzie to bardziej czytelne. |
|
miro741 Temat założony przez niniejszego użytkownika |
» 2015-03-14 22:34:55 czyli tworze bool * kw = & tablica[ 0 ]; if( * kw );
wsk++; if( * kw );
wsk++; if( * kw );
i gdzie to umie ś ci ć ? i czy dobrze my ś l ę ?
|
|
« 1 » 2 3 4 5 6 |