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

FSA

Community-Fossil

  • Private Nachricht senden

11

05.04.2013, 15:37

Lade mal dein Projekt hoch.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

TigerClaw25

unregistriert

12

05.04.2013, 15:43

Hab jetzt alle Daten in meinem Projekt gelöscht und anschließend alle Elemente aus den beiden Verzeichnissen, die aktuell waren, neu hinzugefpgt und Projektmappe neu erstellt, scheint jetzt zu gehen.

Vielen Dank!

TigerClaw25

unregistriert

13

06.04.2013, 17:29

Was bedeutet diese Fehlermeldung: CSound::m_audiochannels': muss in der Basisklassen/Element-Initialisierungsliste des Konstruktors initialisiert werden

Hab eine Sound.h, mit der Klasse CSound. Darin befindet sich unter anderem m_audiochannels. Dann habe ich eine Sound.cpp, wo ich unter anderem folgenden Konstruktor habe:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
CSound::CSound(int audiorate, Uint16 audioformat, const int audiochannels, 
               const int audiochunksize)
{
   // Membervariablen setzen 
   m_audiorate = audiorate; 
   m_audioformat = audioformat; 
   m_audiochannels = audiochannels; 
   m_audiochunksize = audiochunksize;

   //Zeiger auf Null setzen 
   m_psound = NULL;
   m_pmusic = NULL; 
} // Konstruktor


Wenn ich in meiner game folgendes mache:

C-/C++-Quelltext

1
2
3
4
5
    // Sound laden
    m_pmusic = NULL; 
    m_pmusic = new CSound (44100, AUDIO_S16SYS, 2, 4096);
    m_pmusic->LoadMusic("Data/test.wav",100);
    m_pmusic->PlayMusic();


bekomme ich die oben genannte Fehlermeldung. Hängt das damit zusammen, dass meine Membervariablen in CSound const int und nicht int sind?


Ach und meine zweite Frage. Darf man innerhalb einer Klasse wie CGame eine Zeiger aauf eine andere Klasse deklarieren wie z.B. CSound *m_pSound? Sonst kann ich diesen ja in der Funktion Gane.Init(9 nicht verwenden. Bin etwas durcheinander ...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (06.04.2013, 17:37)


TigerClaw25

unregistriert

14

06.04.2013, 18:32

apropos sound. meine Instanz sowie den aufruf der funktionen zum abspielen rufe ich dort auf, wo der asteroid zerstoert wird. sollte ich innerhalb der if Bedingung das ganze wieder freigeben oder die instanz beim initialisieren des spiels einmalig erzeugen und innerhalb der if bedinung nur per pla funktion aufrufen?

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

15

06.04.2013, 20:34

Mach einfach das, was dir die Fehlermeldung sagt: In der Initialisierungsliste initialisieren:

C-/C++-Quelltext

1
2
3
4
CSound::CSound(int audiorate, Uint16 audioformat, const int audiochannels, 
               const int audiochunksize) : m_audiochannels(audiochannels)
{
// ...

TigerClaw25

unregistriert

16

06.04.2013, 22:26

Hab const einfach entfernt.

Kann mir den jemand noch sagen, warum ich ib meiner Gameklasse einen Zeiger vom Typ CSound erzeugen kann und ueber diesen in meiner GameInit Funktion auf Funktionen der CSound Klasse zugreifen kann? Wenn ich es im Buch richtig verstanden habe, muesste ich dazhu in meiner CSound Klasse die Klasse Game dazu als friend Klasse angeben oder?

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

17

06.04.2013, 23:35

Nicht wenn diese Methoden als public deklariert sind.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

18

07.04.2013, 08:53

Der Ansatz an sich ist komplett falsch herum. CSound hat auf nichts zuzugreifen, was in einer anderen Klasse erzeugt wurde. Und erstrecht nicht, wenn CSound etwas tun will, was eigentlich nur für sie selbst interessant ist. Ein Objekt ist ein für sich abgeschlossenes System. Es wird wird erzeugt, initialisiert sich dabei und verwaltet sich dann selbst, kann aber natürlich durch Anfragen von Außen das aktuelle Verhalten ändern.
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]

TigerClaw25

unregistriert

19

07.04.2013, 09:23

ALso bei mir sieht die Klasse wie folgt aus:

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
class CSound
{
public:
    CSound(int audiorate, Uint16 audioformat, 
        int audiochannels, int audiochunksize);
    ~CSound(); 
    
    // Funktionen für einzelne Sounds
    void LoadSound(const std::string sFilename, int Volume);
    void PlaySound();
    
    // Funktionen für Hintergrundmusik
    void LoadMusic(const std::string sFilename, int Volume);
    void PlayMusic();

private:
    int m_audiorate;        // Abtastfrequenz (je höher, desto besserer Sound und mehr Rechenleistung
    Uint16 m_audioformat;       // Audio-Format
    int m_audiochannels;    // Kanäle: 1 = mono, 2 = stereo
    int m_audiochunksize;   //Audio_Puffer
    
    Mix_Chunk *m_psound;        //Instanz für den Sound
    Mix_Music *m_pmusic;        //Instanz für die Hintergrundmusik 
};

#endif


Dann habe ich natürlich in meiner Game-Klasse eine Zeiger "CSound *m_pMusic". Diesen nutze ich dann an der Stelle, wo mdie Asteroiden zerstört werden.

Wahrscheinlich funktioniert das mit dem Zeiger aber auch nur, weil meine Funktionen von CSound öffentlich gehalten sind und auch die Parameterliste in der Funktion öffentlich ist. Würde ich über die Funktionen von CSound aber auf private Membervariablen vVeränderungen vornehmen, dann würde das nur mit einer friend Methode gehen, richtig?

Also solange Funktionen öffentlich sind oder über diese nicht auf private Membervariablen zugegriffen wird, brauche ich kein "friend"?

Was meintest du genau mit dem Ansatz? Welche Möglichkeiten habe ich in meinem Fall denn noch?

Meine Game sieht wie folgt aus:

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
void CGame::Init ()
{
    // Neuen Spieler initialisieren
    m_pPlayer = new CPlayer;
    m_pPlayer->Init ();
    m_pPlayer->Reset ();

    // Hintergrundbild (Sprite) laden
    m_pSpriteBackground = new CSprite;
    m_pSpriteBackground->Load ("Data/Background.bmp");

    // Sprite für Asteroiden laden
    m_pSpriteAsteroid = new CSprite;
    m_pSpriteAsteroid->Load ("Data/Asteroid.bmp", 20, 64, 64);
    m_pSpriteAsteroid->SetColorKey (255, 0, 255);

    // Sound laden
    m_pMusic = NULL; 
    m_pMusic = new CSound (44100, AUDIO_S16SYS, 2, 4096);
    m_pMusic->LoadMusic("Data/test.wav",100);
    m_pMusic->PlayMusic();

    // Sound für Asteroiden-Explosion laden
    m_pSoundAsteroid = NULL;
    m_pSoundAsteroid = new CSound (44100, AUDIO_S16SYS, 2, 4096);
    m_pSoundAsteroid->LoadSound("Data/Asteroid_Explosion.wav", 100);

    // Timer für Asteroiden zurücksetzen
    m_fAsteroidTimer = 0.0f;

    // Spiel läuft
    m_bGameRun = true;
} // Init


und an der Stelle, wo CheckCollison stattfindet, rufe ich die PlayFunktion auf ...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

20

07.04.2013, 09:32

Wozu willst Du dann da irgendwas private machen und friends benutzen? Welchen genauen Sinn oder Vorteil hätte das Deiner Meinung nach? Wieso sollte eine Game-Klasse ein Friend einer Sound-Klasse sein und deren private Methoden aufrufen dürfen?
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]

Werbeanzeige