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

15.05.2010, 16:29

[Erledigt] Highscore zu Breakanoid

Hi Leute,

Nachdem ich nun schon ein paar Items und eine Environment-Map in dem ersten Spiel des Buches einprogrammiert habe, stellt sich mir nun ein Problem beim Programmieren einer dauerhaften Highscore-Liste. Mein erster Gedanke war, dass ich mir eine neue Klasse (CHighScore) schreibe, in der 10 Einträge der Struktur SHighScoreEntry Platz haben. Zusätzlich befinden sich dort noch zwei Variablen, eine, die die Datei "Highscore.txt" repräsentiert vom Typ fstream und die andere um die Anzahl benutzter Einträge festzuhalten. Als Methoden dachte ich an write zum Schreiben in die Datei, read zum Lesen aus der Datei, addNewEntry zum Hinzufügen eines Eintrages und einem Konstruktor, der die ersten Erledigungen macht.
Gesagt, getan.
Dann habe ich der Klasse CMainMenu eine Varible vom Typ der neuen Klasse verpasst und soweit klappte auch noch alles, d.h. es gab keine Fehlermeldungen. Doch wenn ich nun das Spiel beende, dann stürzt das Programm ab. Ich weiß nicht woran es liegt, aber dachte, dass ihr das bestimmt wisst. Hier mal der Quellcode:

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
/*
**  BREAKANOID
**  ==========
**
**  HighScore.h
**  ------
**  Alles, was mit dem Highscore zu tun hat
*/

// __________________________________________________________________
// Verwendete Symbole vordeklarieren
class CGame;

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

struct SHighScoreEntry
{
    string  strName;
    DWORD   dwPoints;
};

class CHighScore
{
public:
    // Variablen
    SHighScoreEntry     m_asHighScore[10];  // der Highscore
    DWORD               m_dwNumEntrys;      // Anzahl Einträge
    fstream             m_fHighScore;       // Speicherdatei

    // Methoden
    tbResult    addNewEntry(string strName,DWORD dwPoints);
    fstream&    write(fstream& os);
    fstream&    read(fstream& is);

    // Konstruktor
    CHighScore()
    {
        for(int i=0;i<10;i++)
        {
            m_asHighScore[i].strName = "";
            m_asHighScore[i].dwPoints = 0;
        }
        m_dwNumEntrys = 0;
        m_fHighScore.open("Highscore.txt",ios::out|ios::app|ios::binary);
        m_fHighScore.close();
    }
};


Und die Definitionen:

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
/*
**  BREAKANOID
**  ==========
**
**  HighScore.cpp
**  ------
**  Alles, was mit dem Highscore zu tun hat
*/

#include "Breakanoid.h"
using namespace std;

tbResult CHighScore::addNewEntry(string strName,DWORD dwPoints)
{
    m_asHighScore[m_dwNumEntrys].strName = strName;
    m_asHighScore[m_dwNumEntrys].dwPoints = dwPoints;
    m_dwNumEntrys++;
    return TB_OK;
}
fstream& CHighScore::write(fstream& os)
{
    os.open("Highscore.txt",ios::out|ios::binary);
    for(int iEntry = 0;iEntry < m_dwNumEntrys;iEntry++)
    {
        os << m_asHighScore[iEntry].strName << '\0';
        os.write((char*)&m_asHighScore[iEntry].dwPoints,sizeof(DWORD));
    }
    os.close();
    return os;
}
fstream& CHighScore::read(fstream& is)
{
    is.open("Highscore.txt",ios::in|ios::binary);

    int i=0;
    is.seekg(0L, ios::end);
    unsigned long count = is.tellg();
    is.seekg(0L);
    while(is.tellg() < count)
    {
        getline(is, m_asHighScore[i].strName,'\0');
        is.read((char*)m_asHighScore[i].dwPoints,sizeof(int));
        i++;
    }

    is.close();
    return is;
}


So, das wärs dann von meiner Seite. Ich wäre froh, wenn ihr mir antworten könntet,
Euer 3D-Anfaenger

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »3D-Anfaenger« (16.05.2010, 12:41)


2

15.05.2010, 16:57

Gibts noch eine Fehlermeldung beim Abstürzen?

3

15.05.2010, 17:23

Also ich find ja mal wieder, dass es ein perfekter Fehler für den Debugger ist. Benutz den doch mal und schau nach wo der Fehler auftritt.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

4

15.05.2010, 19:51

Ja, dass stimmt zwar, nur hatte ich mit dem Debugger einige Probleme, als ich mit dem Buch angefangen bin. Mit Müh' und Not hab ich es dann hingekriegt, dass DirectX in der Releaseversion funktioniert, aber leider nicht in der Debugversion. Und da ich denke, dass es einfacher ist mein erstes Problem zu lösen als das mit der Debugversion erspare ich mir da ein bisschen Arbeit...

------------------------

Das muss aber nicht heißen, dass ich das nicht auch gern wüsste! Es ist nämlich so, dass beim Kompilieren in der Debugversion folgende Fehlermeldung (in einer Messagebox) kommt:

Breakanoid.exe-Systemfehler

Das Programm kann nicht gestartet werden, da d3dx9d_30.dll auf dem Computer fehlt. Installieren Sie das Programm erneut, um das Problem zu beheben.

Ehrlich gesagt kenne ich mich mit dlls nicht so gut aus, ich weiß nur, dass sie zum Programm gelinkt werden müssen. Deshalb habe ich die besagte Datei auf meinem Computer gesucht, aber sie ist nicht vorhanden. Vielleicht muss ich sie ja einfach nur downloaden.

--------------------------

Noch mal zurück zu meinem anderen Problem. Dort kommt keine Fehlermeldung, aber eine Messagebox:

Breakanoid.exe funkioniert nicht mehr
Es wird nach einer Lösung des Problems gesucht...

Und dann kann ich warten und warten, aber es ändert sich (natürlich) nichts. :(

Trotzdem danke für eure Antworten,
Euer 3D-Anfaenger

5

15.05.2010, 20:05

Das liegt daran, dass du nicht das richtige SDK auf dem PC installiert hast. Ich weiß nicht, ob diese DLL's beim DX Web Setup dabei sind, glaube aber eher nicht. Installier doch einfach das SDK von David's Buch.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

6

15.05.2010, 20:08

Ja, das hab' ich installiert, nur auch ein ganz neues (February 2010).
Ich weiß nicht, ob es eine so gute Idee wäre, das neuere zu deinstalliern...

7

15.05.2010, 20:12

Dann kopier mal die dll aus "C:\Programme\Microsoft DirectX SDK (Datum)\Developer Runtime\x86" in den system32 Ordner oder dort wo die .exe ist. Die müsste in dem alten SDK, welches David benutzt hatte eigentlich dabei sein. Ansonsten google einfach nach der dll und lad sie dir woanders runter.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

8

15.05.2010, 20:16

Da sind bei mir unterschiedliche Dateien drin, die vielversprechendsten sind wohl:
d3dx9d.dll
d3dx9d_28.dll
Soll ich die benutzen oder mir lieber die echte runterlanden?

Edit: Hab grad festgestellt, dass die beide schon im system32 Ordner sind. Ich such mal im INet
Edit²: Hier hatte jemand genau dasselbe Problem wie ich:
Problem mit D3DX9D_30.DLL
Aber was bedeutet es, "die TriBase Engine neu zu kompilieren" ?
Edit³:Ich hab mal einfach gemacht, was es bedeutet, und zwar die Engine neu kompiliert. Da gab es einige Fehlermeldungen, aber mein Programm braucht nun anscheinend die dll nicht mehr.
Was muss ich jetzt mit diesem Debugger machen? Wie arbeitet man mit ihm?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »3D-Anfaenger« (15.05.2010, 20:32)


BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

9

15.05.2010, 21:12

Also wenn dir eine d3dx9d_xx.dll fehlt, funktioniert es meistens eine gleichnamige DLL (bei der andere Zahlen für xx stehen als gefordert wird) einfach umzzubenennen und in den Debug-Ordner des Projektes zu kopieren. Wichtig ist aber, dass das d vor dem Unterstrich angibt, ob es sich um eine Debug- oder um eine Release-Variante handelt.

Mit dem Debuger arbeitest du so: http://dotnetperls.com/debugging-1

10

15.05.2010, 21:17

Ich würde dir davon abraten die DLL's einfach umzubenennen. Solltest du Funktionen verwenden, die in der anderen DLL neu definiert wurden, kann es zu Problemen kommen.
Debuggen ist ganz einfach, ich kopier mal kurz meinen FAQ Eintrag:

Zitat

Das ist ganz einfach, mit F5 startet man den Debugger oder springt zum nächsten Breakpoint, bzw. lässt das Programm weiterlaufen, wenn kein Breakpoint vorhanden ist, mit F10 geht man den Code Schritt für Schritt durch und mit F11 springt man in Funktionen. Wenn man beim Debuggen den Mauszeiger über Variablen hält, werden deren Werte angezeigt, ansonsten gibt es unten auch noch eine Liste mit einigen verfügbaren Variablen.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

Werbeanzeige