wojownik266 Temat założony przez niniejszego użytkownika |
[SFML 1.6] Proste strzelanie » 2012-07-16 15:25:30 Witam. W programie mam dwa Sprity statek i pocisk. Statek i pocisk poruszają się jednocześnie przy pomocy strzałek... Teraz chciałbym żeby po naciśnieciu Spacji pocisk poleciał do góry a statek niezaleznie od pocisku dalej się poruszał swoim torem. Co źle zrobiłem w poniższym programie? Proszę o wskazówki, przykłady itp.
#include <SFML/Graphics.hpp> #include <iostream>
const int SCREEN_W = 640; const int SCREEN_H = 480;
struct Player { int x; int y; };
int main() { sf::RenderWindow App( sf::VideoMode( SCREEN_W, SCREEN_H, 32 ), "Proste strzelanie" ); sf::Image statek, pocisk; statek.LoadFromFile( "statek.bmp" ); pocisk.LoadFromFile( "laser.bmp" ); sf::Sprite Statek( statek ); sf::Sprite Pocisk( pocisk ); Player stat, poc; stat.x = Statek.GetPosition().x + 320; stat.y = Statek.GetPosition().y + 420; poc.x = Pocisk.GetPosition().x + 320; poc.y = Pocisk.GetPosition().y + 420; Statek.SetPosition( stat.x, stat.y ); Pocisk.SetPosition( poc.x, poc.y ); while( App.IsOpened() ) { float ElapsedTime = App.GetFrameTime(); sf::Event Event; while( App.GetEvent( Event ) ) { if( Event.Type == sf::Event::Closed || Event.Key.Code == sf::Key::Escape ) App.Close(); if(( Event.Key.Code == sf::Key::Back ) == 0 ) { Pocisk.SetPosition( poc.x, poc.y-- * ElapsedTime ); } } if( App.GetInput().IsKeyDown( sf::Key::Left ) ) { Statek.Move( - stat.x * ElapsedTime, 0 ); Pocisk.Move( - poc.x * ElapsedTime, 0 ); } if( App.GetInput().IsKeyDown( sf::Key::Right ) ) { Statek.Move( stat.x * ElapsedTime, 0 ); Pocisk.Move( poc.x * ElapsedTime, 0 ); } App.Clear(); App.Draw( Pocisk ); App.Draw( Statek ); App.Display(); } }
|
|
diego997 |
» 2012-07-16 16:03:01 Przecież jak poruszasz statkiem to pocisk też się porusza if( App.GetInput().IsKeyDown( sf::Key::Left ) ) { Statek.Move( - stat.x * ElapsedTime, 0 ); Pocisk.Move( - poc.x * ElapsedTime, 0 ); } if( App.GetInput().IsKeyDown( sf::Key::Right ) ) { Statek.Move( stat.x * ElapsedTime, 0 ); Pocisk.Move( poc.x * ElapsedTime, 0 ); }
Podczas naciśnięcia przycisku strzału w tym wypadku jak widzę strzałka w dół, musisz uniezależnić poruszanie pocisku od poruszania statkiem. Np wprowadzając dodatkową zmienną bool. :D |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2012-07-16 16:10:49 No i w tym cały problem bo nie wiem jak to zrobić! Moze jakiś kawałek przykładowego kodu a o gotowcu to już nie będę wspominał. |
|
diego997 |
» 2012-07-16 16:26:59 Myślę, że coś w tym stylu by zadziałało bool shoot = 0;
if(( Event.Key.Code == sf::Key::Back ) == 0 )
{ shoot = 1; }
if( App.GetInput().IsKeyDown( sf::Key::Left ) ) { Statek.Move( - stat.x * ElapsedTime, 0 ); if( !shoot ) Pocisk.Move( - poc.x * ElapsedTime, 0 ); } if( shoot ) { Pocisk.SetPosition( poc.x, poc.y-- * ElapsedTime ); if( poc.y < 0 ) { shoot = 0; Pocisk.SetPosition( poc.x, stat.y ); } }
|
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2012-07-17 09:18:38 Ten kod który podałeś działa niemal tak samo jak ten który podałem wyżej. Trochę popracowałem nad nim i wyprodukowałem kod który jest poniżej. Ten kod działa trochę bardziej tak jak bym sobie tego życzył. Niestety też posiada mankamenty w postaci takiej że jak uruchomię program to pocisk sam strzela a naciskanie spacji nic nie daje. A ja chciałbym żeby pocisk strzelał po na cisnieciu spacji a po dotarciu do górnej krawędzi okna wracał do punktu wyjscia. Ma ktoś w związku z tym jakiś pomysł jak tego dokonać? Przykłady, Gotowce itp. mile widziane!
if( App.GetInput().IsKeyDown( sf::Key::Back ) == 0 ) { poc.y -= 1; } else { poc.x = stat.x; poc.y = stat.y; } if( App.GetInput().IsKeyDown( sf::Key::Left ) ) { Statek.Move( - stat.x * ElapsedTime, 0 ); } if( App.GetInput().IsKeyDown( sf::Key::Right ) ) { Statek.Move( stat.x * ElapsedTime, 0 ); }
Pocisk.Move( 0, poc.y * ElapsedTime );
|
|
RazzorFlame |
» 2012-07-17 13:06:44 Dźizys :P Jaaaa. Ruch pocisku to jedno a statku to drugie. Chodzi ci o to zeby ruszac sie statkiem i kiedy wcisnie sie spacje to ma wystrzelac pocisk? Jesli tak to zróbmy tak: -Powiedzmy że zmienne "statek" i "pocisk" odpowiadają twoim zmiennym. -Stwórzmy sobie jeszcze jedną zmienną o typie bool "czyWystrzelony" i ustawmy go na początek na false (fałsz). -Pomyślmy logicznie: *Trzeba najpierw sprawdzić czy naciśnięto Spacje i żeby uniknąć niewłaściwych działan(np podwójnemu wystrzeleniu) dodajemy w tym ifie że nie może być wtedy pocisk wystrzelony. Jezeli spacja została naciśnieta wtedy ustawiamy czyWystrzelony na true. *Sprawdzamy czy zmienna czyWystrzelony jest ustawiona na true. Jesli tak to zmniejsz pozycje w osi Y o 1. Jesli nie to nadpisujemy pozycje pocisku na pozycje statku aby za kazdym razem pocisk wylatywal ze statku. *Sprawdzamy czy pocisk wyszedl poza ekran. Jesli tak to czyWystrzelony dajemy na false. *Dalej musimy obsłużyć ruch statku. Żeby nie było pokaże ci jak to powinno wygladać: bool czyWystrzelony = false; while( app.IsOpened() ) { while( app.GetEvent( ev ) ) { } const sf::Input & in = app.GetInput(); if( in.IsKeyDown( sf::Key::Space ) && czyWystrzelony == false ) { czyWystrzelony = true; } if( czyWystrzelony == true ) { app.Draw( pocisk ); pocisk.y--; } else { pocisk.x = statek.x; pocisk.y = statek.y; } if( pocisk.y <= 0 - < wysokosc pocisku > ) { czyWystrzelony = false; } }
I Voila!!! Masz juz to co chcialeś. Jesli moge zadać pytanie to czy robisz coś typu Chicken Invaders? |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2012-07-17 13:49:09 Jakiś czas temu zabrałem się do robienia strzelanki kosmicznej w Allegro 4.2, której nie skończyłem. Ponieważ teraz mam trochę wolnego czasu chciałbym ją przenieść na SFML. Dlatego was tak męczę. Projekt gry znajduje się w katalogu programowanie -> Gry Projekty niedokończone pt."Allegro projekt gry wojownik266". Na tej stronie http://chomikuj.pl/wojownik266 Przepraszam że na chomikuj ale akurat tylko to miałem pod ręką. Gra waży niecałe 2MB, gdyby ktoś chciał rzucić okiem to bardzo proszę i jednocześnie dziękuję za poświęcony mi czas! |
|
diego997 |
» 2012-07-17 15:19:27 Fajne tylko te gwiazdy powinny lecieć w przeciwną stronę bo ma się wrażenie że statek leci na wstecznym :D Troche tylko wkuzajace są dzwięki strzelania no i uważać przy naciskaniu spacji :)
Btw. ale pomysł świetny dokończ to zrób coś ala warblade dużo poziomów itp :D |
|
« 1 » 2 3 |