Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 1.6] Proste strzelanie

Ostatnio zmodyfikowano 2012-07-19 09:30
Autor Wiadomość
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.

C/C++
#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() )
    {
        // Get elapsed time
        float ElapsedTime = App.GetFrameTime();
        sf::Event Event;
        while( App.GetEvent( Event ) )
        {
            // Close window : exit
            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 );
               
            }
        }
       
       
        // Move the sprite
        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();
       
    }
   
}
P-60182
diego997
» 2012-07-16 16:03:01
Przecież jak poruszasz statkiem to pocisk też się porusza

C/C++
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
P-60186
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ł.
P-60187
diego997
» 2012-07-16 16:26:59
Myślę, że coś w tym stylu by zadziałało

C/C++
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 );
    }
}
P-60188
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!

C/C++
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 );
P-60292
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ć:
C/C++
//tutaj deklaracja zmiennych statek i pocisk
bool czyWystrzelony = false; //ustawiamy na falsz
while( app.IsOpened() ) // pętelka :D
{
    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 ); //jezeli zostal wystrzelony to go rysujemy
        pocisk.y--; //zmniejszamy o 1
    }
    else
    {
        pocisk.x = statek.x;
        pocisk.y = statek.y;
    }
    if( pocisk.y <= 0 - < wysokosc pocisku > )
    {
        czyWystrzelony = false;
    }
    //Tutaj ruchy statkiem :D
   
}
I Voila!!! Masz juz to co chcialeś. Jesli moge zadać pytanie to czy robisz coś typu Chicken Invaders?
P-60320
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!
P-60330
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
P-60354
« 1 » 2 3
  Strona 1 z 3 Następna strona