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

03.04.2008, 16:49

[C / C++] Allgemeine fragen zu meinem Testprojekt

Hi Folks,

Erstmal tolles Forum das ihr hier habt. Nachdem ich mir vor einiger Zeit das Buch 'C++ für Spieleprogrammierer' gekauft habe und angefangen habe C / C++ zu lernen, bin ich nun der Meinung, so einigermaßen die Grundlagen von C / C++ zu beherrschen. Vorgestern hab ich mich dann mal hingesetzt mit dem Ziel, etwas nützliches zu programmieren. Ich gehe mal davon aus, das jeder von euch das Spiel 'Half-Life 1' kennt. Ich habe mir zum Ziel gesetzt, eine Klasse zum Laden / Bearbeiten / Konvertieren / Speichern dessen Sprites zu erstellen. Spezifikationen dafür gibts genügend im Netz zu finden. Nun würde ich euch gerne darum bitten, mir Tipps zu geben, in hinsicht auf Programmierstil, Korrektheit des Codes, Verbesserungen etc.

Hier findet ihr alle meine bisherigen Versuche / 'Projekte'.

Die Projektdaten befinden sich in den 'Half Life Sprite' und 'Half Life Sprite Tool' Ordnern. Als Entwicklungsumgebung verwende ich MS Visual C++ 6 Professional

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

03.04.2008, 17:08

Hast du einen bestimmten Abschnitt, oder sonst etwas, wo du fragen hast? Ich denke sonst kommt "besserer" Stil durch eigenen grössere Projekte. Dann siehst du selber, welche Fehler du gemacht hast und was man besser machen kann.

Aber ein paar grundlegende Sachen.

if (var == NULL) ist das gleiche, wie if(!var)

Dann würde ich IMHO die C++ Standard Bibliothek benutzen und nicht C Sachen. Also std::cout, std::ofstream usw.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

03.04.2008, 17:17

Zitat von »"drakon"«


Dann würde ich IMHO die C++ Standard Bibliothek benutzen und nicht C Sachen. Also std::cout, std::ofstream usw.


Darüber kann man sich streiten. Ich finde die printf Syntax z.B. wesentlich schöner als das Ganze cout gedöns...

@Poster: Half life nutzte keine Sprites mehr. Wenn du also genau weißt was du machen willst und konkrete Fragen hast, dann immer her damit! ;)

Willkommen im Forum!
@D13_Dreinig

4

03.04.2008, 17:29

Ich finde die printf Syntax auch wesentlich schöner. Ich meine auch irgendwo mal gelesen zu haben, das man printf dem ganzen cout Sachen vorziehen sollte. Ich weiß aber nichtmehr wo und wieso. Half-Life 1 nutzt sehrwohl noch sprites ;) Bitte nicht mit Half-Life 2 verwechseln. Wie stehts um meinen Code-Stil ? Is das ok so ? Gut meine erste Frage:

Wie würdet ihr das einlesen des Sprites realisieren ?
Mehr Infos über Half-Life Sprites gibts hier.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

03.04.2008, 17:38

Echt? Half Life nutzte noch Sprites? Ist wohl zu lang her, dass ich das Spiel gespielt hab! ;) Nunja, printf hat den "Nachteil" das es Typenunsicher ist. Dafür aber schöner. :)

Zur Frage:
Das Einlesen ist einfach. Im Grund brauchst du nur eine Klasse die sämtliche Spriteeigenschafen abbildet. Zum Teil gibts ja schon Beispielcodes auf der, von dir genannten, Seite.
@D13_Dreinig

6

03.04.2008, 17:40

In etwa so ?

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
51
52
53
54
int CHL_Sprite::loadSprite ( char *path )
{
    FILE *stream;

    if ( ( stream = fopen ( path, "rb" ) ) == NULL )
    {
        fprintf ( stderr, "Konnte Daten nicht laden.\n" );
        return 1;
    }

    mainData->header = new struct hed_key;
    fread ( mainData->header, sizeof(struct hed_key), 1, stream );

    mainData->palette = new struct pal_key;
    mainData->palette->data = NULL;
    fread ( &mainData->palette->colors, sizeof(mainData->palette->colors), 1, stream );

    mainData->palette->data = new struct rgb_key[mainData->palette->colors];
    for ( int i = 0; i <= ( mainData->palette->colors - 1 ); i++ )
    {
        fread ( &mainData->palette->data[i], sizeof(struct rgb_key), 1, stream );
    };

    mainData->frames = new struct frm_key[mainData->header->frames];
    for ( i = 0; i <= ( mainData->header->frames - 1 ); i++ )
    {
        fread ( &mainData->frames[i].frameType, sizeof(int32_t), 1, stream );

        if ( mainData->frames[i].frameType == SINGLEFRAME )
        {
            mainData->frames[i].numIntervall = NULL;
            mainData->frames[i].intervall = NULL;

            fread ( &mainData->frames[i].frameOriginX, sizeof(int32_t), 1, stream );
            fread ( &mainData->frames[i].frameOriginY, sizeof(int32_t), 1, stream );
            fread ( &mainData->frames[i].frameWidth, sizeof(int32_t), 1, stream );
            fread ( &mainData->frames[i].frameHeight, sizeof(int32_t), 1, stream );

            mainData->frames[i].data = new uint8_t[(mainData->frames[i].frameWidth * mainData->frames[i].frameHeight)];
            for ( int c = 0; c <= (mainData->frames[i].frameWidth * mainData->frames[i].frameHeight - 1); c++ )
            {
                fread ( &mainData->frames[i].data[c], sizeof(uint8_t), 1, stream );
            }
        };
        if ( mainData->frames[i].frameType == GROUPFRAME )
        {
            fprintf ( stderr, "Oho ! Ein Groupframesprite ... leider noch nicht implementiert.\n" );
        };
    };
    
    fclose ( stream );
    printf ( "Konnte Daten erfolgreich laden.\n" );
    return 0;
};

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

03.04.2008, 17:57

Jo, wenn die Daten korrekt eingelesen werden, wieso nicht so? :)

Einige Kleinigkeiten fallen aber auf den ersten Blick sofort auf:

C-/C++-Quelltext

1
int CHL_Sprite::loadSprite ( char *path )


Hier wird meist ein const char* gemeint weil sogut wie immer Stringliterale übergeben werden. Übersetzt wird das zwar, aber es ist dennoch falsch, zumal der schreibende Zugriff auf den String undefinierbare Folgen hätte! ;)

C-/C++-Quelltext

1
mainData->header = new struct hed_key; 


Das Schlüsselwort struct ist in C++ nicht mehr von nöten. Kannst du, an dieser Stelle, getrost weglassen.

C-/C++-Quelltext

1
for ( int i = 0; i <= ( mainData->palette->colors - 1 ); i++ ) 


Es tut auch for ( int i = 0; i < mainData->palette->colors; i++ ).

Und nicht vergessen die Daten wieder freizugeben, wenn du sie nicht mehr brauchst.
@D13_Dreinig

8

03.04.2008, 18:01

Beim schließen von geschweiften Klammer kommt kein ; hin.
Lieber dumm fragen, als dumm bleiben!

9

03.04.2008, 18:02

Das freigeben sieht dann so 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
34
35
36
37
CHL_Sprite::~CHL_Sprite ()
{
    if ( !mainData )
    {
        if ( !mainData->frames )
        {
            for ( int i = 0; i <= ( mainData->header->frames - 1 ); i++ )
            {
                delete[] mainData->frames[i].data;
                mainData->frames[i].data = NULL;
            };
            delete[] mainData->frames;
            mainData->frames = NULL;
        };

        if ( !mainData->palette )
        {
            if ( mainData->palette->data != NULL )
            {
                delete[] mainData->palette->data;
                mainData->palette->data = NULL;
            }
            delete[] mainData->palette;
            mainData->palette = NULL;
        };

        if ( !mainData->header)
        {
            delete mainData->header;
            mainData->header = NULL;
        };

        delete mainData;
        mainData = NULL;
    };
    printf ( "Sprite erfolgreich gelöscht.\n" );
};

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

03.04.2008, 18:11

Zitat von »"Jonathan_Klein"«

Beim schließen von geschweiften Klammer kommt kein ; hin.


Ist zwar nicht üblich, stört aber nicht.
@D13_Dreinig

Werbeanzeige