Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.04.2011, 14:24

c++/sfml 2D schussanimation

heyho,
Also ich will zum einstieg in sfml einen kleinen weltraum shooter schreiben.
Jetzt hänge ich bei der Schussanimation.
Ich habe eine Klasse schiessen über die das ganze ablaufen soll.
Hier mal mein Quellcode.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>


class schiessen
{

private:
    sf::Sprite schuss;
public:
    schiessen()
    {   
    }

    schiessen(float x, float y)
    {
        schuss.SetPosition(x,y);
    }

    void abschuss()
    {
        schuss.Move(0,+10);     
    }

};


int main()
{
    float x;
    float y;
    bool schifflinks;
    bool schiffrechts;
    schiessen A;
    schiessen B;



    // Fenstereinstellungen
    sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML Graphics");

    //Lade Bild
    sf::Image Bild1, Bild2, Bild3;
    Bild1.LoadFromFile("hintergrund.png");
    Bild2.LoadFromFile("schiff.png");
    Bild3.LoadFromFile("schuss.png");

    //Wandle Bild zu Sprite
    sf::Sprite hintergrund, schiff, schuss;
    schuss.SetImage(Bild3);
    hintergrund.SetImage(Bild1);
    schiff.SetImage(Bild2);
    schiff.SetPosition(190,535);


    
    while (App.IsOpened())
    {
        
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            //Steuerung
            if(App.GetInput() .IsKeyDown(sf::Key::Right)&& schiffrechts == true) schiff.Move(+10,0);
            if(App.GetInput() .IsKeyDown(sf::Key::Left) && schifflinks == true) schiff.Move(-10,0);
            if(App.GetInput() .IsKeyDown(sf::Key::Q))B.abschuss();
        }

        //Kollision mit Wand
        if(schiff.GetPosition().x < 425)
        {   schiffrechts = true;
        }
        else schiffrechts = false;
        if(schiff.GetPosition().x > 20)
        {   schifflinks = true;
        }
        else schifflinks = false;
        
        //Position des Schiffes
        x = schiff.GetPosition().x+32;
        y = schiff.GetPosition().y;

        App.Draw(hintergrund);
        App.Draw(schuss);
        App.Draw(schiff);
        App.Display();
    }

    return EXIT_SUCCESS;
}


Nur passiert jetzt nichts wenn ich Q drücke.
Der Sprite wird nicht gezeichnet oder sonstiges.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

2

03.04.2011, 14:32

Ja das ist nicht sonderlich verwunderlich. Du hast eine Klasse »schießen«, welche einen Sprite hat, der aber weder initialisiert, noch gezeichnet wird. Bei dem Befehl »abschuss« wird einfach nur die Position geändert. Hier im Übrigen noch ein Fehler, auf den du aufpassen musst. Selbst, wenn es mal funktionieren sollte, dann wird sich der Schuss noch nicht bewegen. Bzw. nur, wenn »Q« gedrückt gehalten wird. Das ist denke ich nicht das, was du willst.
Zum anderen hast du einen Sprite Schuss, welcher zwar ein Bild hat und vmtl. an der Position (0,0) gezeichnet werden dürfte. Dieser Sprite hat aber gar nichts mit dem Sprite aus »schiessen« zu tun, sondern ist ein eigenes Objekt.
Ein »App.Clear()« solltest du in jedem Frame übrigens auch noch aufrufen.

EDIT:
So könnte in etwa eine Klasse aussehen(ganz ganz grober Code)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class projectile
{
public:
    projectile( const sf::Image& image, sf::Vector2f position ) : projectile_sprite()
    {
        projectile_sprite = new sf::Sprite( image, position );
    }
    ~projectile()
    {
        delete projectile_sprite;
    }

    void update()
    {
        projectile_sprite->Move( 10, 0 );
    }
    void draw( const sf::RenderWindow& App )
    {
        App.Draw( *projectile_sprite );
    }

private:
    sf::Sprite* projectile_sprite;
}


Und dann erstellst du einfach immer, wenn Q gedrückt wird ein solches Objekt. Speichers alle in einem std::vector<projectile*> und aktualisierst und zeichnest sie dann alle. Der Update-Funktion könnte man natürlich noch eine Richtung mitgeben, in die sich der Schuss bewegen soll, aber das ist jetzt erst mal nebensächlich.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Fred« (03.04.2011, 14:40)