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

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

11

15.02.2012, 10:05

Ich benutze jetzt für meine Klasse Präprozessor-Direktiven aber leider hapert es noch bei der Image Übergabe. Es soll ein Gelber ball von meiner CRessourcen klasse in die CBall klasse übergeben werden aber da ist auch schon das Problem. Ich Poste mal mein derzeitigen Code:

CRessourcen.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef CRESSORCEN_HPP
#define CRESSORCEN_HPP

class CRessorcen
{
    private:
        std::vector<sf::Image> m_vImages;
        sf::Image m_Image_Ball_Yellow;

    public:
        CRessorcen ();
        sf::Image &GetImage (int Image_ID) {return m_vImages.at(Image_ID);}
};
#endif


CRessourcen.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
#include <SFML/Graphics.hpp>
#include <vector>
#include "CRessorcen.hpp"

CRessorcen::CRessorcen ()
{
    m_vImages.push_back (m_Image_Ball_Yellow);
    m_Image_Ball_Yellow.LoadFromFile ("gfx/Balls/Yellow.png");
}


Das geschätzte eigentliche Problem im Konstruktor der Klasse CBall.cpp (CBall benutzt auch die Präprozessor-Direktiven):

C-/C++-Quelltext

1
m_Image_Ball_Yellow = m_Ressorcen.GetImage (m_vImages(0));


Fehler:
Fehler 1 error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'm_Ressorcen' c:\users\kevin\dropbox\black-game studios\projekte\bloopit\bloopit\cball.hpp 15

Ich habe nirgends in der CBall klasse die CRessourcen klasse eingebunden, mir wurde gestern gesagt das die Images wieder jedesmal geladen werden wenn ein neuer Ball Spawnt und suche jetzt eine Lösung.


MFG:
Raidenkk

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

15.02.2012, 10:11

Wie die Fehlermeldung schon sagt, "m_vImages" ist nicht definiert in CBall. Die Variable gibt es nicht.
Persönlich finde ich es übrigens besser nicht mit Ressourcen-IDs zu arbeiten, sondern direkt mit Namen, weil sich IDs durch irgendwas ändern können, Namen aber immerhin lesbar und verständlich sind und man Fehler somit deutlich schneller findet. Außerdem braucht man bei Identifikation über Namen keine Tabellen, welche Namen zu IDs übersetzten. Kann man natürlich trotzdem einführen, muss man aber nicht unbedingt. Somit wäre ein Ressourcen-Manager eher eine Art Cache. Ist natürlich nur meine persönlich bevorzugte Methode.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

13

15.02.2012, 10:15

Ja jetzt bin ich zwar genau so schlau wie vorher aber hast recht mit den Namen aber wollte es erstmal so Simpel halten wie es geht.


EDIT:
habe jetzt mal was vertauscht und jetzt werden die Images übergeben nur frage ich mich wie prüfe ich das wirklich nur 1 Image geladen wurde?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Raidenkk« (15.02.2012, 10:25)


Saik0

Treue Seele

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

14

15.02.2012, 11:28

Das müsstest du eigentlich gut im Debugger sehen können.

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

15

15.02.2012, 11:38

hmm trotz präprozessor direktiven scheint das image immer wieder geladen zu werden vielleicht liegt das an meiner vorgehensweise vom Ball.

CBall.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
#ifndef CBALL_HPP
#define CBALL_HPP
#include "CRessorcen.hpp"

class CBall
{
    private:
        int m_X, m_Y, m_Farbe;
        float m_AnimX, m_AnimY;
        bool m_Fall;
        bool m_Destroy;
        sf::Image m_Image_Ball_Yellow;
        sf::Image m_Image_Ball_Blue;
        sf::Image m_Image_Ball_Red;
        sf::Sprite m_Sprite_Ball;
        CRessorcen m_Ressorcen;

    public:
        CBall (int X, int Y, int Farbe);
        void Draw (sf::RenderWindow &Game);
        void SetX (int X) {m_X = X;}
        void SetY (int Y) {m_Y = Y;}
        void SetFarbe (int Farbe) {m_Farbe = Farbe;}
        void SetAnimX (float AnimX) {m_AnimX = AnimX;}
        void SetAnimY (float AnimY) {m_AnimY = AnimY;}
        void SetFall (bool Fall) {m_Fall = Fall;}
        void SetDestroy (bool Destroy) {m_Destroy = Destroy;}
        int GetX () {return m_X;}
        int GetY () {return m_Y;}
        int GetFarbe () {return m_Farbe;}
        float GetAnimX () {return m_AnimX;}
        float GetAnimY () {return m_AnimY;}
        bool GetFall () {return m_Fall;}
        bool GetDestroy () {return m_Destroy;}
};
#endif


CBall.cpp (bis Konstruktor)

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
#include <SFML/Graphics.hpp>
#include <vector>
#include "CBall.hpp"


enum m_Farbe
{
    Yellow,
    Blue,
    Red
};

CBall::CBall (int X, int Y, int Farbe)
    : m_X (X)
    , m_Y (Y)
    , m_Farbe (Farbe)
    , m_AnimX (m_X*64.f)
    , m_AnimY (m_Y*64.f)
    , m_Fall (true)
    , m_Destroy (false)
{
    m_Image_Ball_Yellow = m_Ressorcen.GetImage (0);
    m_Image_Ball_Blue = m_Ressorcen.GetImage (1);
    m_Image_Ball_Red = m_Ressorcen.GetImage (2);
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

15.02.2012, 11:40

Der Präprozessor ist das, was der Name sagt. Er verarbeitet Deinen Code bevor der Compiler es macht.
Der hat mit dem Laufzeit-Verhalten Deines Codes und wie *oft* etwas geladen also nichts zu tun. Er kann weder festlegen, dass etwas zur Laufzeit nur einmal geschieht, noch dass es 5mal passiert.
(geht schon, aber nicht in dem Kontext, den Raidenkk hier sucht - nur falls jemand auf die Idee kommt diese Aussage korrigieren zu wollen)

Präprozessor-Anweisungen sind zur Laufzeit *nicht* mehr vorhanden!
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

17

15.02.2012, 16:32

Stell dir den Präprozessor als dummen Chinesen vor, der ganz einfache Befehle ausführt. Er ist der erste dem du deinen Code gibst wenn du das Programm erstellen willst(daher das "prä-" im Namen :pillepalle: ).
Als erstes stellt er seine Sufu so ein, dass sie immer das nächste # sucht.
Wenn der Chinese ein '#include "datei.h"' sieht, sucht er die Datei "datei.h", öffnet sie, markiert alles, kopiert, geht zum '#include "datei.h"', markiert die Zeile und drückt einfügen.
Wenn der Chinese ein '#define blub fu' sieht, nutzt er die Suchen und Ersetzen funktion der IDE, gibt bei suchen "blub" und beim "ersetzen mit" "fu" ein und führt das ganze für die restliche Quelldatei aus.
Wenn der Chinese ein '#ifndef blub' sieht, schaut er ob vorher irgendwo '#define blub x'(hier steht das x für irgendwas oder garnichts) steht. Wenn er ein '#define blub x' findet löscht er alles von der Zeile mit '#ifndef blub' bis zum nächsten '#endif'. Findet er nichts macht er auch nichts. Anders herum mit '#ifdef blub'.

Wenn du also in die Datei "blub.h" ein '#include "fu.h"' schreibst und in die Datei "fu.h" ein '#include "blub.h"', wird er immer wieder hin und her kopieren -> du hast eine Endlosschleife.

In dem Fall fall ists halt kein billiger Chinese sondern ein Programm, der Präprozessor...
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

18

15.02.2012, 19:47

Nacho, die Erklärung hat selbst mich etwas verwirrt. Bin mir nicht sicher, ob das das Richtige für Raidenkk war ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

19

15.02.2012, 20:04

Nja... dann soll er halt nen Buch lesen in dem das besser/anders erklärt wird. :P
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

20

15.02.2012, 20:19

Ich habe nur leider so viel neues das ich nicht weis was ich anwenden soll bin verwirrt, das kann doch nicht so schwer sein nur 1 Image zu laden. Früher bei Blitz habe ich das in 1 min gemacht^^.
Ich werde es mir gleich nochmal in ruhe anschauen und weiter versuchen bis es klappt.

Werbeanzeige