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

Dreat

Frischling

  • »Dreat« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

1

01.04.2012, 23:03

Zeiger auf Klasse?

Hallo ich stoße gerade auf ein Problem,

ich habe eine Klasse CSprite und habe in einer anderen Klasse einen Zeiger auf CSprite

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef SPRITE_H
#define SPRITE_H
#include <SFML/Graphics.hpp>
#include "Framework.h"


class CSprite
{
    public: 
 void LoadImage(std::string szFilename);    
 void SetPos(float X, float Y); 
 void RenderSprite();
    private:
 sf::Image  Image;
 sf::Sprite Sprite; 
 void CreateSprite();   
};

#endif


und die Klasse CFramework mit dem Zeiger

C-/C++-Quelltext

1
2
3
4
5
6
7
        private:
            CSprite *m_pBackground;  //<--- HIER DER ZEIGER
            sf::Event Event;
            bool m_bRunning;
    };

#endif


Wenn ich kompiliere wird mir in der Zeile mit dem Zeiger ein Fehler ausgegeben undzwar

Quellcode

1
2
3
4
5
1>c:\users\documents\visual studio 2008\projects\tictactoe sfml\framework.h(25) : error C2143: Syntaxfehler: Es fehlt ';' vor '*'
1>c:\users\documents\visual studio 2008\projects\tictactoe sfml\framework.h(25) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++
 nicht unterstützt.
1>c:\users\documents\visual studio 2008\projects\tictactoe sfml\framework.h(25) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht
 unterstützt.


es ging komischerweise zwischendrin 3-4 mal und dann wieder nicht. Wäre gut wenn mir da jemand helfen könnte

valentin

Treue Seele

Beiträge: 212

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

2

01.04.2012, 23:33

Sieht ganz danach aus, als ob bei dir zirkuläre inkludes vorhanden sind ;). (sprite.h inkludiert framework.h und umgekehrt.)
visit me on deviantArt!
http://v-alentin.deviantart.com/

There is no programming language, no matter how structured, that will prevent programmers from making bad programs. //Larry Flon

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

02.04.2012, 08:55

Für Zeiger reicht eine Forward Declaration der Klasse.
Schreib einfach:

class CSprite;

an den Anfang von CFramework.h

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

02.04.2012, 10:10

Abgesehen davon ist die CSprite Klasse überflüssig. Die SFML bietet ja schon eine Spriteklasse.
Versuch lieber ein eigenes Spiel mit Hilfe der Tutorials auf der SFML Seite zu entwickeln. Mach dafür sehr kleine Schritte und versuch nicht das Spiel aus C++ für Spieleprogrammierer Zeile für Zeile nachzubauen. Du kannst erstmal ganz auf Klassen und Funktionen verzichten bis die Mainfunktion zu groß wird.

Das Sprite und das Image sollten getrennt voneinander gespeichert werde, da du sonst für jedes Objekt das Image neu laden musst. Du brauchst es aber nur einmal.
"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?

Dreat

Frischling

  • »Dreat« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

5

02.04.2012, 12:45

Danke für die massige Hilfe, valentin lag richtig mit dem zirkulären Inklude daran lags ^^ ich habs zwar irgendwo schonmal gelesen aber nicht mehr dran gedacht.

@NachoMan

Ich versuche grade ein Spiel zu schreiben, ich hab das Buch nicht mal neben mir liegen ^^

Wie meinst du das mit Sprite und Image? Jeweils eine Klasse für Image und eine für Sprites? Ich komm da nicht ganz mit :/

Sp3iky

Treue Seele

Beiträge: 232

Beruf: Entwicklungsingenieur

  • Private Nachricht senden

6

02.04.2012, 13:11

Was ermeint ist, dass man Ressourcen und explizite Instanzen trennen sollte. Du hast zum Beispiel ein Bild, was du mehrmals verwenden möchtest (als Sprite, als Texture usw.). Machst du es so, wie du es gezeigt hast, lädst du das gleiche Bild immer wieder für jedes Objekt, das es benutzt, nochmal in den Speicher. Übergibst du stattdessen eine Referenz auf das Bild, muss es nur einmal im Speicher liegen und alle Objekte können es gemeinsam verwenden.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

7

02.04.2012, 13:23

Die SFML bietet doch schon Klassen für Sprites und Images.

Das Image enthält ein Array mit dem Bild. Das ist in der Regel ziemlich groß und das Kopieren dauert sehr lang.

Das Sprite enthält eine Referenz auf das Image, die Position, Rotation usw. mit der es gezeichnet werden soll.
"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?

Dreat

Frischling

  • »Dreat« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

8

02.04.2012, 14:36

Klingt logisch und du hast recht :D aber ich glaub ich weiß schon wie ich das mache...danke dafür ^^

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

9

02.04.2012, 15:00

Ich weiß schon was du vor hast. Anstatt für jedes Objekt ein Sprite zu haben zeichnest du es einfach mehrmals. Das wird für TicTacToe vielleicht reichen. Sobald es etwas komplexer wird ist der Programmieraufwand aber viel zu hoch. :rolleyes:
In der SFML ist es nicht grundlos so geregelt.

noch zwei kleine Tipps:
- hier solltest du eine konstante Referenz übergeben, da sonst eine unnötige Kopie des strings erzeugt wird: void LoadImage(std::string szFilename);
- sf::Event Event; kannst du auch lokal definieren.
"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?

Dreat

Frischling

  • »Dreat« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

10

02.04.2012, 15:26

Ich weiß was du meinst jetzt würde jedes Feld des Spiels so geladen werden

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
m_pField[0] = new CSprite;

m_pField[0]->LoadImage("field.bmp");  //<--- Hier wird das Bild geladen

 m_pField[0]->SetPos(250.f,150.f);

 m_pField[0]->RenderSprite();



        m_pField[1] = new CSprite;
 m_pField[1]->LoadImage("field.bmp");  //<--- Hier nochmal
 m_pField[1]->SetPos(350.f,150.f);
 m_pField[1]->RenderSprite();


        m_pField[2] = new CSprite;  
 m_pField[2]->LoadImage("field.bmp"); // <-- und nochmal
 m_pField[2]->SetPos(450.f,150.f);  
m_pField[2]->RenderSprite();


        m_pField[3] = new CSprite;  
m_pField[3]->LoadImage("field.bmp");  //<--- und schon wieder
m_pField[3]->SetPos(250.f,250.f);   
m_pField[3]->RenderSprite();

        m_pField[4] = new CSprite;  
m_pField[4]->LoadImage("field.bmp");  //<--- Ja da klingelts bei mir ^^
m_pField[4]->SetPos(350.f,250.f);
m_pField[4]->RenderSprite();


Naja wenn ich jetzt das 3x3 Feld zeichnen würde müsste ich 9 mal das gleiche Bild laden...Fazit: Nicht sehr ressourcensparend stimmts? :D

Also sollte ich dann das so aussehen lassen?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
sf::Image FeldBMP
FeldBMP.LoadFromFile("field.bmp"); //<--- Also einmal laden und in der Instanz speichern...
m_pField[0]->CreateSprite(FeldBMP); // <-- Das geladene Image benutzen um ein Sprite zu erstellen
m_pField[0]->SetPos(250.f,150.f);    // <-- Position setzenm_pField[0]->RenderSprite();       // <-- Rendern
//und beim nächsten
m_pField[1]->CreateSprite(FeldBMP); //<-- Wieder die Instanz nehmen so lade ich es doch nur einmal oder?
m_pField[1]->SetPos(350.f,150.f);    //<-- Wieder Position setzen
m_pField[1]->RenderSprite()      // <-- Und rendern

Werbeanzeige