DanielSC Temat założony przez niniejszego użytkownika |
» 2013-01-03 09:27:47 Dzieki wam za wszellką pomoc kolizja zachodzi kod: #include <iostream> #include <math.h> #include <SFML/Graphics.hpp> using namespace std; using namespace sf; int main() { RenderWindow Aplikacja( VideoMode( 600, 800, 32 ), "Kolizje" ); Shape kolo1 = Shape::Circle( 10, 10, 10, Color::Red ); Shape kolo2 = Shape::Circle( 100, 100, 50, Color::Green ); float pozycja1X = 10; float pozycja1Y = 10; float pozycja2X = 100; float pozycja2Y = 100; while( Aplikacja.IsOpened() ) { Event zdarzenie; while( Aplikacja.GetEvent( zdarzenie ) ) { if( zdarzenie.Type == Event::Closed ) Aplikacja.Close(); } kolo1.GetPosition(); kolo2.GetPosition(); cout << "Roznica " << sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) << endl; const Input & sterowanie = Aplikacja.GetInput(); if( sterowanie.IsKeyDown( sf::Key::Left ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= 60 ) { kolo1.Move( - 0.2, 0 ); pozycja1X -= 0.2; } else kolo1.Move( 0, 0 ); if( sterowanie.IsKeyDown( sf::Key::Right ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= 60 ) { kolo1.Move( + 0.2, 0 ); pozycja1X += 0.2; } else kolo1.Move( 0, 0 ); if( sterowanie.IsKeyDown( sf::Key::Up ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= 60 ) { kolo1.Move( 0, - 0.2 ); pozycja1Y -= 0.2; } else kolo1.Move( 0, 0 ); if( sterowanie.IsKeyDown( sf::Key::Down ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= 60 ) { kolo1.Move( 0, + 0.2 ); pozycja1Y += 0.2; } else kolo1.Move( 0, 0 ); Aplikacja.Clear( Color( 0, 0, 255 ) ); Aplikacja.Draw( kolo1 ); Aplikacja.Draw( kolo2 ); Aplikacja.Display(); } return 0; }
|
|
Mrovqa |
» 2013-01-03 10:58:00 Kod umieszczaj w znacznikach [cpp][/cpp]. |
|
DanielSC Temat założony przez niniejszego użytkownika |
» 2013-01-03 17:09:33 Co to znaczy w znacznikach i ? Nasunął mi się jeszcze jeden problem otóż po wykryciu kolizji kolo1 zatrzymuje się w miejsu (bo tak wynika z kodu aplikacji)A ja chciałbym aby można bylo po wykryciu dalej poruszsac kolo1 tylko nie na kolo2 tak jagby tam była sciana przez którą nie da rady przejść. |
|
DejaVu |
» 2013-01-03 18:32:32 Przed przesunięciem obiektu sprawdź czy wystąpi kolizja gdybyś przesunął obiekt na daną pozycję. Jeżeli kolizja nie zachodzi zaktualizuj pozycję. |
|
DanielSC Temat założony przez niniejszego użytkownika |
» 2013-01-03 19:29:00 Aha mniej więcej rozumiem i sprubuje zgodnie z twoimi wskazówkami rozwiącać mój problem .Dzięki
|
|
DanielSC Temat założony przez niniejszego użytkownika |
» 2013-01-03 21:04:11 Mniej więcej idąc za twoją wskazówką wyskrobałem taki kod.Działa ale z małymi błedami (kolo1 czasami przeskakuje jak nacisne jeden po drugim w małym odstępie czasu klawisz up-down lub right-left przez kolo2) : #include <iostream> #include <math.h> #include <SFML/Graphics.hpp> using namespace std; using namespace sf;
int main() { int promienk1 = 10; int promienk2 = 50; RenderWindow Aplikacja( VideoMode( 600, 800, 32 ), "Kolizje" ); Shape kolo1 = Shape::Circle( 10, 10, promienk1, Color::Red ); Shape kolo2 = Shape::Circle( 100, 100, promienk2, Color::Green ); float pozycja1X = 10; float pozycja1Y = 10; float pozycja2X = 100; float pozycja2Y = 100; float warX = 10; float warY = 10; bool CzyWarunekSpelniony; while( Aplikacja.IsOpened() ) { Event zdarzenie; while( Aplikacja.GetEvent( zdarzenie ) ) { if( zdarzenie.Type == Event::Closed ) Aplikacja.Close(); } if( sqrt((( warX - pozycja2X ) *( warX - pozycja2X ) +( warY - pozycja2Y ) *( warY - pozycja2Y ) ) ) <= promienk1 + promienk2 ) CzyWarunekSpelniony = false; else CzyWarunekSpelniony = true; kolo1.GetPosition(); kolo2.GetPosition(); cout << "czy" << pozycja1X << endl; const Input & sterowanie = Aplikacja.GetInput(); if( CzyWarunekSpelniony == false ) { if( sterowanie.IsKeyDown( sf::Key::Left ) ) { kolo1.Move( + 0.5, 0 ); pozycja1X += 0.5; warX += 0.5; } if( sterowanie.IsKeyDown( sf::Key::Right ) ) { kolo1.Move( - 0.5, 0 ); pozycja1X -= 0.5; warX -= 0.5; } if( sterowanie.IsKeyDown( sf::Key::Up ) ) { kolo1.Move( 0, 0.5 ); pozycja1Y += 0.5; warY += 0.5; } if( sterowanie.IsKeyDown( sf::Key::Down ) ) { kolo1.Move( 0, - 0.5 ); pozycja1Y -= 0.5; warY -= 0.5; } } if( sterowanie.IsKeyDown( sf::Key::Left ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= promienk1 + promienk2 ) { kolo1.Move( - 0.1, 0 ); pozycja1X -= 0.1; warX -= 0.1; } if( sterowanie.IsKeyDown( sf::Key::Right ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= promienk1 + promienk2 ) { kolo1.Move( + 0.1, 0 ); pozycja1X += 0.1; warX += 0.1; } if( sterowanie.IsKeyDown( sf::Key::Up ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= promienk1 + promienk2 ) { kolo1.Move( 0, - 0.1 ); pozycja1Y -= 0.1; warY -= 0.1; } if( sterowanie.IsKeyDown( sf::Key::Down ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= promienk1 + promienk2 ) { kolo1.Move( 0, + 0.1 ); pozycja1Y += 0.1; warY += 0.1; } Aplikacja.Clear( Color( 0, 0, 255 ) ); Aplikacja.Draw( kolo1 ); Aplikacja.Draw( kolo2 ); Aplikacja.Display(); } return 0; } |
|
1 « 2 » |