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

20.03.2013, 20:45

SFML Selbsterstellte Animationsklasse funktioniert nicht.

Abend mal wieder. Versuche gerade mir eine eigene Animationsklasse zu erstellen. Im Quellcode wird nichts rot unterstrichen, aber wenn ich versuche den Konstruktor der Klasse in meiner main.cpp aufzurufen wird meine Parameterliste nicht angezeigt, stadtdessen sagt er er erwarte (const Name der Klasse &) .

Suche jetzt glaube ich anderthalb Tage den Fehler, bin aber noch nicht fündig geworden. Schreibe jetzt mal hier meinen Code. Wenn jemand einen Fehler sieht wäre es nett wenn er es schreibt. Verbesserungsvorschlägen bin ich auch nicht abgeneigt.


Animation.hpp

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
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
#ifndef C_EASYANIMATION_HPP
#define C_EASYANIMATION_HPP


#include <SFML/Graphics.hpp>
#include <iostream>
#include <string>

class EasyAnimation
{
private:

    sf::Clock m_AniClock;               //  Misst die Zeit zwischen den Frames.
    sf::Time  m_AniTime;                //  Nimmt vergangene Zeit zwischen den Frames auf.

    sf::Time  m_AniSpeed;               //  Nimmt die Geschwindigkeit in Sekunden auf, in der die Animation ablaufen soll.

    int m_Pictures_per_Line;            //  Sagt aus wie viele Bilder die Animation pro Reihe hat.
    int m_Lines;                        //  Sagt aus wie viele Reihen die Animation hat.

    int m_PictureStop;                  //  Hier kann angegeben werden an welchem Bild der Reihe gestoppt werden soll.
    int m_LineStop;                     //  Hier kann angegeben werden in welcher Reihe die Animation anhalten soll.

    int  m_Left;
    int  m_Top;
    int  m_Wight;
    int  m_Hight;

    std::string m_TexturName;           //  Enthält den Pfad zur Textur.

    sf::Texture  m_Texture;             //  Zur aufnahme der Textur;
    sf::Sprite     m_Sprite;            //  Nimmt die geladene Textur auf.

    bool  m_AniRunning;                 // Sagt aus ob die Animation laufen soll oder nicht. 


public:

    // Konstruktor
    EasyAnimation (std::string & s , int Wight, int Hight, int Pictures, int Lines, sf::Time & Time);

    // Funktion zum durchlaufen des gesamten Sprites.
    void RunFullAnimation ();

    // Funktion zum durchlaufen einer gewünschten Reihe des Sprites.
    void RunLine (int Line);

    // Funktion zum sofortigen anhalten der Animation.
    void StopAnimation ();

    //  Funktion um die Animation zu stoppen und stadtdessen ein gewünschtes Bild des Sprites anzuzeigen.
    void StopAnimation_on_Rect (int Picture, int Line);

    //  Funktion zum zeichnen der Animation
    void DrawAnimation (sf::RenderWindow & window);

    //  Funktion um die Position des Sprites zu setzen.
    void SetAniPosition (int Wight, int Hight);
};


#endif




Animation.cpp



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
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include "Animation.hpp"
#include <SFML/Graphics.hpp>
#include <iostream>
#include <string>


// Konstruktor

EasyAnimation::EasyAnimation (std::string & s , int Wight, int Hight, int Pictures, int Lines, sf::Time & Time)
{
    m_TexturName = s;
    if (!m_Texture.loadFromFile (s) )
{
        std::cout << "Could not load the Texture";
}
    m_Sprite.setTexture (m_Texture);

    m_Wight = Wight;
    m_Hight = Hight;

    m_Left  = 0;
    m_Top  =  0;

    m_Pictures_per_Line = Pictures;
    m_Lines   = Lines;

    m_PictureStop  =  0;
    m_LineStop   =  0;

    m_AniSpeed  =  Time;
}



// Funktion zum durchlaufen des gesamten Sprites.

void EasyAnimation::RunFullAnimation ()
{
    m_AniRunning  =  true;
    m_Left = 0;
    m_Top = 0;

if (m_AniRunning = true)
{

        m_Sprite.setTextureRect (sf::IntRect ( m_Left * m_Wight, m_Top *m_Hight, m_Wight, m_Hight ) ); 

        m_AniTime =  m_AniClock.getElapsedTime ();

if (m_AniTime >=  m_AniSpeed )
{
            m_Left++; 
            m_AniClock.restart ();
if (m_Left >= m_Pictures_per_Line )
{
                m_Left = 0;
                m_Top ++;
                m_AniClock.restart ();
if (m_Top >=  m_Lines )
{
                    m_Left = 0;
                    m_Top = 0;
}
}


}

}

}



// Funktion zum durchlaufen einer gewünschten Reihe des Sprites.

void EasyAnimation::RunLine (int Line)
{
    m_AniRunning  =  true;
    m_Left = 0;
    m_Top = Line;

if (m_AniRunning = true)
{
        m_Sprite.setTextureRect (sf::IntRect ( m_Left * m_Wight, m_Top *m_Hight, m_Wight, m_Hight ) );

        m_AniTime =  m_AniClock.getElapsedTime ();
if (m_AniTime >=  m_AniSpeed )
{
            m_Left++; 
            m_AniClock.restart ();
}
if (m_Left >= m_Pictures_per_Line )
{
                m_Left = 0;
                m_AniClock.restart ();
}
}
}


// Funktion zum sofortigen anhalten der Animation.

void EasyAnimation::StopAnimation ()
{
    m_AniRunning = false;
}


//  Funktion um die Animation zu stoppen und stadtdessen ein gewünschtes Bild des Sprites anzuzeigen.

void EasyAnimation::StopAnimation_on_Rect (int Picture, int Line)
{
    m_AniRunning = false;
    m_Sprite.setTextureRect (sf::IntRect ( Picture * m_Wight, Line *m_Hight, m_Wight, m_Hight ) );
}


//  Funktion zum zeichnen der Animation

void EasyAnimation::DrawAnimation (sf::RenderWindow & window)
{
    window.draw (m_Sprite);
}


//  Funktion um die Position des Sprites zu setzen.


void EasyAnimation::SetAniPosition (int Wight, int Hight)
{
    m_Sprite.setPosition (Wight, Hight);
}

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

2

20.03.2013, 21:21

stadtdessen sagt er er erwarte (const Name der Klasse &) .

Wer ist "er"? Der Compiler oder IntelliSense? Derjenige sagt auch sicher mehr als nur "erwarte (const Name der Klasse &)". Würdest du die ganze Fehlermeldung posten, bekämst du sicher schneller Hilfe als mit zweihundert Codezeilen. Außerdem fehlt deine main.cpp, in der du ja den Konstruktor aufrufen willst.

Aber ein paar Verbesserungsvorschläge kann ich schon geben:
  • Const correctness: Übergib wann immer möglich Parameter als const& statt nur &.
  • In der Implementierung des Konstruktors solltest du Initialisierungslisten statt Zuweisungen verwenden.
  • if (m_AniRunning = true): Hier weist du zu, du willst aber wohl vergleichen (==). Aber vergleiche mit true oder false sind grundsätzlich überflüssig. Schreib einfach if (m_AniRunning)
  • Kommentare wie // Funktion zum sofortigen anhalten der Animation. sind völlig überflüssig, das Gesagte ergibt sich hier z.B. aus dem Namen der Funktion.
  • Es heißt height nicht hight.
  • m_Pictures_per_Line müsste nach deiner sonst angewandten Namenskonvention m_PicturesPerLine heißen.
  • Die Einrückung ist kaputt.

V.a. aufgrund des letzten Punktes hab ich mir die Logik jetzt nicht angesehen.

3

20.03.2013, 21:34

Eine Fehlermeldung kommt erst gar nicht zustande da der Aufruf des Konstruktors ja schon fehlschlägt. Es erscheint eben das was ich gesagt habe. Wenn ich versuche ihm die Parameter zu übergeben die der Konstruktor haben soll sagt er "die IDE" das keine Instanz des Konstruktors mit dieser Parameterliste übereinstimmt.

Und was soll die main bringen ? Da steht halt der ganz gewöhnliche Code. Fenster Initialisierung und solche Sachen. Und eben der #include Befehl.

Die Anderen Ratschläge werde ich versuchen einzubauen. Zu dem letzten. Inwiefern kaputt ? Falls es dir durch den Code noch nicht aufgefallen ist, ich bin Anfänger.

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

4

20.03.2013, 21:56

Das "kaputt" bezog sich hauptsächlich auf die Einrückung der Anweisungen innerhalb der if-Abfragen. Ich dachte, dass dir hier das Forum vielleicht beim Copy & Paste die Einrückung zerstört hat, deshalb der Ausdruck.

Zitat

Eine Fehlermeldung kommt erst gar nicht zustande da der Aufruf des Konstruktors ja schon fehlschlägt.

Eine Fehlermeldung gibt es wohl, die zitierst du ja immer (in Teilen). ;) Ich denke hier auch nicht an eine Laufzeit-Fehlermeldung deines Programmes sondern an den Compiler Fehler. Drück doch in Visual Studio mal F5 und kopier die im Ausgabefenster erscheinende Fehlermeldung (lehne ggf. das Ausführen des letzten erfolgreichen Builds ab).

Zitat

wenn ich versuche den Konstruktor der Klasse in meiner main.cpp aufzurufen

Für mich klingt das, als ob der Knackpunkt eben hier läge.

5

20.03.2013, 22:26

Hab den Konstruktor jetzt einfach mal in der main gefüllt. Mit & nimmt er die Referenzen komischerweise nicht an, ohne schon, bzw. kommt zumindest keine Fehlermeldung.

So sieht das aus.

C-/C++-Quelltext

1
EasyAnimation Animation_A (String_A, 32, 32, 3, 4, Time_A);



Wenn ich das Programm debugge bekomme ich keine Fehlermeldung, das Programm wird erfolgreich erstellt, aber nichts gezeichnet. Noch dazu ist das Fenster trotz clear und display weiss. Das Ausgabefenster besteht größtenteils aus diesen Meldungen.

"SFML 2.0 Neuer Prototype.exe": "C:\Windows\SysWOW64\hid.dll" geladen, Cannot find or open the PDB file
Der Thread 'Win32-Thread' (0xbb8) hat mit Code -1073741510 (0xc000013a) geendet.
Der Thread 'Win32-Thread' (0x1118) hat mit Code -1073741510 (0xc000013a) geendet.
Der Thread 'Win32-Thread' (0x9ac) hat mit Code -1073741510 (0xc000013a) geendet.
Das Programm "[4692] SFML 2.0 Neuer Prototype.exe: Systemeigen" wurde mit Code -1073741510 (0xc000013a) beendet.

Verwende ich & im Konstruktor vor String_A und Time_A bekomme ich diese Fehler.


Fehler 1 error C2664: 'EasyAnimation::EasyAnimation(const std::string &,int,int,int,int,const sf::Time &)': Konvertierung des Parameters 1 von 'const std::string *' in 'const std::string &' nicht möglich c:\users\user\desktop\programmieren\eigene programme\sfml\sfml 2.0 einfache animation\sfml 2.0 neuer prototype\main.cpp 14

2 IntelliSense: Keine Instanz des Konstruktors ""EasyAnimation::EasyAnimation"" stimmt mit der Argumentliste überein. c:\users\user\desktop\programmieren\eigene programme\sfml\sfml 2.0 einfache animation\sfml 2.0 neuer prototype\main.cpp 14

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

6

20.03.2013, 22:31

Zu der Sache mit dem & vor String_A/Time_A. In dem Fall gibst du Adressen, also Pointer an die Funktion. Die will aber Referenzen ;)
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

7

20.03.2013, 22:38

Achso ja, hab ne Weile nichts mehr mit Referenzen gemacht. ^^ Aber dann is ja die erste Lösung theoretisch richtig.

Werbeanzeige