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

21

01.11.2009, 12:19

Ok, du hast recht. Ich hab das einfach weggelassen.
Jedoch wollte ich jetzt wie du gesagt hast versuchen eine
Funktion fürs laden der Sprites schreiben.
Nur muss ich zugeben das ich biss jetzt noch nicht solche
Funktionen geschrieben hab. Also ich noch nicht so genau weiß wie
das in dem Fall geht. Ich habs jedoch probiert, vielleicht könnt ihr
mir ja ein bissian helfen.
Ich möchte also das man per

C-/C++-Quelltext

1
2
CKlasse Klasse;
Klasse.ImageLoad(BildName, SpiritName);

Sprites Laden kann, bis jetzt seht die Funktion so aus,
nur geht die natürlich nicht so wie ich es mir erhoffen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
//.....Klasse

public:
    void ImageLoad(const char *FileName, const char *SFileName);
//usw...

//-> .cpp Datei der Klasse

void CPlayer::ImageLoad(const char *FileName, const char *SFileName)
{
    sf::Image FileName;
    if(!FileName.LoadFromFile(FileName))
    cout<<"Fehler beim laden von"<<FileName<<endl;
    sf::Sprite SFileName;

}

Das Problem ist erstmal das ich durch das sf::Image und das
sf::Sprite die beiden Variablen neu defeniere, was leider ja nicht
funktioniert.

Zitat

1>.\loadsprite.cpp(9) : error C2082: Neudefinition des formalen Parameters "FileName"
1>.\loadsprite.cpp((10) : error C2228: Links von ".LoadFromFile" muss sich eine Klasse/Struktur/Union befinden.
1> Typ ist 'const char *'
1>.\loadsprite.cpp((12) : error C2082: Neudefinition des formalen Parameters "SFileName"
------------------------ main.cpp ----------------------------
1>.\main.cpp(11) : error C2065: 'ImageName': nichtdeklarierter Bezeichner
1>.\main.cpp(11) : error C2065: 'SpriteName': nichtdeklarierter Bezeichner

Jaja, ich lese gerade nochmal über Funktionen in meinen C++
Buch nach, um das wieder aufzufrischen. Aber sowas
in der Art was ich versuche wird da leider weniger erklärt. :?
Ich glaube mir fehlt es eher noch an Erfahrung.

22

01.11.2009, 13:13

So macht das tendentiell nur wenig sinn.
Nutz doch die Möglichkeit in C++, der Klasse auch Membervariablen zu geben. Eine Variable kann alles sein, eine Zahl, ein Pointer oder eben ein Sprite.

Ich skizzier dir hier mal kurz, wie mein Vorschlag gemeint war:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 class cDrawableObject
{
public:
  Load (std::string FileName, sf::Color Transparent)
  {
    m_Image.LoadFromFile ( FileName );
    m_Image.CreateMaskFromColor ( Transparent, 0 );
    m_Sprite.SetImage(m_Image);
    m_Sprite.SetCenter ( m_Sprite.GetSize ().x /2, m_Sprite..GetSize ().y /2 );
  }
  
inline const sf::Sprite& const GetSprite ( void) { return m_Sprite;};

void Move ( sf::vector2f ToMove ) {...};
private:
sf::Image m_Image;
sf::Sprite m_Sprite;
};


Diese Klasse kannst du nun z.B. für deinen Player verwenden.

Quellcode

1
2
3
4
5
6
class cPlayer
{
public:
 cDrawableObject m_DrawObj;
...
};


Laden kannst du dann damit wie folgt:

Quellcode

1
2
3
4
5
cPlayer Spieler1;
Spieler1.m_DrawObj.Load ( "data/Spieler.bmp", sf::color(2550,255, 0 ) );

sf::RenderWindow App (...);
App.Draw ( Spieler1.m_DrawObj.GetSprite() );


Der Vorteil dieser Methode ist, dass du nun eine Funktion hast, die dir viel Arbeit abnimmt. Wenn du ein Bild lädst, wills du es ja normalerweise gleich in ein Sprite haben, was dir die Funktion ermöglicht. Zusätzlich hast du einen Sicheren Zugriff auf dein Sprite, über GetSprite(). Das const in verbindung mit privateverhindert, dass irgendeine Funktion, die grade lustig ist, das Sprite manipuliert. Stichwort Kapselung.

Das ganze kannst du dann eben noch mit dem ResourceManager aus dem SFML wiki verbinden oder Kollision für diese Objekte implementieren oder was auch immer.

Deine Fehlermeldung kommt wohl irgendwie daher, dass du zu oft den Variablennamen Filename benutzt.
Und tu dir den Gefallen und nimm keine const char*, sondern std::string.

So Far...

Laguna

23

01.11.2009, 13:33

Zitat

Und tu dir den Gefallen und nimm keine const char*, sondern std::string.


Müsste dann ja auch const char * const :badgrin: heißen, damit der Zeiger auch noch konstant ist. Ansonsten sind ja nur die Daten konstant

24

01.11.2009, 14:04

Ach jetzt verwirr ihn halt nicht noch mehr, als ich das schon tu xD

25

01.11.2009, 15:06

Zitat

Ach jetzt verwirr ihn halt nicht noch mehr, als ich das schon tu xD


:badgrin: da kennst du mich aber schlecht :evil:

Werbeanzeige