miro741 Temat założony przez niniejszego użytkownika |
» 2015-03-15 19:15:56 #include <iostream> #include <cstdlib> #include <cmath> #include <SFML/Graphics.hpp> #define wxmx 800 #define wymy 600 #define ilosc 5 using namespace std;
int main() { char kwadraty[ 5 ]; int x; sf::RenderWindow okno( sf::VideoMode( wxmx, wymy ), "SFML kwadraty" ); while( okno.isOpen() ) { sf::Event zdarzenie; while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed ) okno.close(); int aktywny = - 1; for( int i = 0; i < 5; i++ ) { sf::RectangleShape x( sf::Vector2f( 82, 50 ) ); x.setPosition( 200, 10 ); if( x.getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left &&( i ) ) aktywny = i; } if( aktywny != - 1 ) { if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) { kwadraty[ aktywny ].move( 0, - 1 ); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) { kwadrat[ aktywny ].move( 0, 1 ); } okno.clear(); okno.draw( x ); okno.display(); return 0; }
zacząłem od nowa mówię zrobię najpierw aby po kliknięciu ruszał się jeden a później będę rozbudowywał to. ||=== Build: Debug in to (compiler: GNU GCC Compiler) ===| In function ‘int main()’:| error: request for member ‘move’ in ‘kwadraty[aktywny]’, which is of non-class type ‘char’| error: no matching function for call to ‘sf::RenderWindow::draw(int&)’| note: void sf::RenderTarget::draw(const sf::Drawable&, const sf::RenderStates&)| note: no known conversion for argument 1 from ‘int’ to ‘const sf::Drawable&’| note: void sf::RenderTarget::draw(const sf::Vertex*, unsigned int, sf::PrimitiveType, const sf::RenderStates&)| to mi wywaliło takie błędy choć zrobić aby to działało dla 1 to dalej już zrobię. |
|
Lora |
» 2015-03-15 19:33:05 Ta tablica miała być tablicą sf::RectangleShape , a nie char . return 0 ma być pod koniec maina a nie w pętli. I coś z tymi pętlami pomieszałeś, w pętli zdarzeń ma być tylko obsługa zdarzeń (obsługa kliknięcia na kwadrat i zamykania okna w tym przypadku), reszta ma być poza tą pętlą. sf::RectangleShape x( sf::Vector2f( 82, 50 ) ); x.setPosition( 200, 10 ); if( x.getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left &&( i ) ) aktywny = i;
To nie ma w ogóle sensu, przecież x będzie miał ciągle tę samą pozycje niezależną od pozycji kwadratów. Tak miało być: for( int i = 0; i < 5; i++ ) { if( kwadraty[ i ].getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left ) aktywny = i; }
i deklarację int aktywny = - 1; daj przed rozpoczęciem głównej pętli gry (żeby się nie zmieniała z każdym obiegiem pętli z powrotem na -1). edit: i funkcje draw, clear i display mają być poza ifem, one mają się wykonywać w każdym obiegu głównej pętli gry. |
|
miro741 Temat założony przez niniejszego użytkownika |
» 2015-03-15 19:45:12 #include <iostream> #include <cstdlib> #include <cmath> #include <SFML/Graphics.hpp> #define wxmx 800 #define wymy 600 #define ilosc 5 using namespace std;
int main() { int aktywny = - 1; sf::RectangleShape kwadraty[ 5 ]; sf::RenderWindow okno( sf::VideoMode( wxmx, wymy ), "SFML kwadraty" ); sf::Event zdarzenie; sf::RectangleShape x( sf::Vector2f( 80, 40 ) ); for( int i = 0; i < 5; i++ ) { if( kwadraty[ i ].getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left ) aktywny = i; } while( okno.isOpen() ) { while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed ) okno.close(); if( aktywny != 0 ) { if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) { kwadraty[ aktywny ].move( 0, - 1 ); } } okno.clear(); okno.draw( x ); okno.display(); } } return 0; }
No oki poprawiłem i kompiluje wyświetla mi go ale nadal po kliknięciu nic się nie dzieje |
|
Lora |
» 2015-03-15 19:48:22 Po co ci ten x? Normalnie zdefiniuj te kwadraty jak robiłeś to za pierwszym razem: kwadraty[ 0 ] = sf::RectangleShape( sf::Vector2f( x2, x1 ) ); kwadraty[ 0 ].setPosition( 200, 10 );
I zamiast okno.draw( x ) : for( int i = 0; i < 5; i++ ) { okno.draw( kwadraty[ i ] ); }
I ma być aktywny != - 1 , a nie aktywny != 0 EDIT: Wciąż masz źle tą pętle |
|
Lora |
» 2015-03-15 19:53:20 while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed ) okno.close(); for( int i = 0; i < 5; i++ ) { if( kwadraty[ i ].getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left ) aktywny = i; } }
Tak ma wyglądać pętla zdarzeń. Reszta kodu który masz w tej pętli ma być za nią (ale wciąż ma być w głównej pętli gry, główna pętla gry to ta pętla while( okno.isOpen() ) ). |
|
miro741 Temat założony przez niniejszego użytkownika |
» 2015-03-15 19:54:31 #include <SFML/Graphics.hpp> #define wxmx 800 #define wymy 600 #define ilosc 5 using namespace std; int aktywny = - 1; int main() { sf::RectangleShape kwadraty[ 5 ]; sf::RenderWindow okno( sf::VideoMode( wxmx, wymy ), "SFML kwadraty" ); sf::Event zdarzenie; kwadraty[ 0 ] = sf::RectangleShape( sf::Vector2f( 40, 50 ) ); kwadraty[ 0 ].setPosition( 200, 10 ); while( okno.isOpen() ) { while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed ) okno.close(); for( int i = 0; i < 5; i++ ) { if( kwadraty[ i ].getGlobalBounds().contains(( sf::Vector2f ) sf::Mouse::getPosition( okno ) ) && zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left ) aktywny = i; } } if( aktywny != - 1 ) { if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) { kwadraty[ aktywny ].move( 0, - 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) kwadraty[ aktywny ].move( 0, 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) kwadraty[ aktywny ].move( - 1, 0 ); okno.clear(); for( int i = 0; i < 5; i++ ) { okno.draw( kwadraty[ i ] ); } okno.display(); return 0; } }
działa po kliknięciu rusza się ok wielkie dzięki wszystkim za pomoc a w szczególności LORA. Teraz tylko go rozbuduje. zamykam temat |
|
Lora |
» 2015-03-15 19:55:59 Popatrz wyżej. |
|
Lora |
» 2015-03-15 20:06:18 Możesz też poczytać o pętli stałokrokowej, bo na razie te kwadraty poruszają się z szybkością zależną od szybkości procesora. |
|
1 2 3 4 « 5 » 6 |