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

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

1

20.05.2012, 01:22

C++ Programmier-stil

Hey Leute,
nun entlich seit langem habe ich mich dazu durchgerungen mal wieder mit einem größeren
Projekt anzufangen. :thumbsup:
Soweit erstmal nichts spektakuläres , allerdings war ich beim letzten Projekt nicht mit meinem
Programmierstil zufrieden, ja ich war sogar verwundert wie dieser Haufen Code funktionieren
konnte :rolleyes:

Momentan schreibe ich an einer art Basisklasse für das Spiel (CFramework) und wollte
mal einfach fragen was ihr dazu sagt, ob ihr Tipps habt oder was noch rein sollte/könnte und wie ihr eure Basisklasse
aufbaut!

MfG Marcel

Nachfolgen die Klasse:
(Sollte einer sie gut finden , könnt ihr sie gerne verwenden
auf Wunsch poste ich dann eben schnell die HPP Datei)

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//Eigene Includes
//
#include "CFramework.hpp"

//Konstruktor
//
CFramework::CFramework()
{
    //Laufzeitvariabeln setzen
    //
    running = true;

    //SFML Attribute setzen
    //
    pWindow = new sf::RenderWindow(sf::VideoMode(1366,768,32),"Project_S",sf::Style::Titlebar); //Fenster initialisieren
    pWindow->SetFramerateLimit(60);
    pEvent  = new sf::Event();                                                                  //Event   initialisieren
    pInput  = new sf::Input();                                                                  //Eingabe initialisieren

    //Laden aller relevanten Daten , ausgenommen Sprites
    //
    void Load();
}

//Destruktor
//
CFramework::~CFramework()
{
    //SFML Attribute freigeben
    //
    delete pEvent;
    delete pInput;
    delete pWindow;

    pEvent  = NULL;
    pInput  = NULL;
    pWindow = NULL;
}

//Run Funktion
//
void CFramework::Run()
{
    //Main-loop
    //
    while(running == true)
    {
        //Funktionen aufrufen
        //
        Draw       ();
        GetState   ();
        CheckEvents();
    }
}

//Quit Funktion
//
void CFramework::Quit()
{
    //Laufzeitvariable ändern
    //
    running = false;
}

//Load Funktion
//
void CFramework::Load()
{
    //Savestats etc. laden
    //
}

//CheckEvents Funktion
//
void CFramework::CheckEvents()
{
    //Event an Fenster übergeben & auf tastendruck prüfen
    while(pWindow->GetEvent(*pEvent))
    {
     // Escape key pressed
     //
     if ((pEvent->Type == sf::Event::KeyPressed) && (pEvent->Key.Code == sf::Key::Escape))
      {
         Quit();
      }
    }
}

//GetState Funktion
//
void CFramework::GetState()
{
    //State vom StateManager holen
    //
}

//Draw Funktion
//
void CFramework::Draw()
{
    //Window clearen & zeichnen lassen je nach State
    //
    pWindow->Clear(sf::Color::Blue);
    pWindow->Display();
}


Naja bis jetzt nichts spektakuläres^^
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FreezingEngine« (20.05.2012, 01:27)


Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

20.05.2012, 01:58

Also wir haben schonmal unterschiedliche Definitionen von "Basisklasse".
Eine Basisklasse ist für mich eher sowas wie IUnknown, also wirklich eine Klasse, von der alles (oder ein Großteil) erbt.
Wenn überhaupt hab ich sowas aber auch nur für Debugging-Zwecke (um zb einem Objekt einen Namen zu geben).

Ich versuche auch immer aussagekräfitge Namen für Klassen/Methoden/Variablen/Parameter zu benutzen, was schon viel zur lesbarkeit (und damit auch der Wartbarkeit) beiträgt.

"CFramework" fällt da zb imho nicht drunter. Halte deine Klassen so klein wie möglich. Das sorgt automatisch dafür, dass man sich Gedanken darüber macht, was jetzt wo eigentlich hingehört.

Was soll diese Klasse den tun/können? Weil für mich wird das gerade irgendwie nicht ersichtlich. Von dem Code her würde ich eher denken, dass da "CGame" ein besserer Name für wäre ;)

Und zum Schluss (auch wenn das wahrscheinlich wieder in nem Flamewar endet): Was genau hast du davon, dass du ein "p" vor den Namen deiner Variablen packst? Jede vernünftige IDE zeigt dir doch schon im Autocomplete Fenster den Typen der Variable an, die du da grade tippst.

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

3

20.05.2012, 02:05

Also ich versuch es immer so zu machen das ich ein Gerüst schreibe , also die Basisklasse xD , und darauf den rest aufbaue.
Alle Klassen bekommen nur per Referenz/Pointer die Objekte die sie benötigen.

Bis jetzt war meine Struktur:

Basisklasse -> StateManager -> Game und Game hat -> Spieler , -> KI ,-> World, -> TextureManager.
Wobei Spieler und KI jeweils eine Instanz des Einheitentyps besitzen.
Also wenns ein Spiel mit Weltraum-setting ist hat der Spieler ein Raumschiff und jede KI (logischer weise).

Naja so ging ich bisher vor, aber wie gesagt bin offen für alles und lasse mich gerne
überzeugen wenn es bessere,praktischere,logischere Wege gibt :)


Edit: Also anstatt Klassen per Referenzen und Pointer das zu übergeben was sie brauchen
einfach alle von dieser Basisklasse erben lassen?

Zitat

also wirklich eine Klasse, von der alles (oder ein Großteil) erbt.
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

20.05.2012, 11:05

Wenn du deinen Programmierstil wirklich verbessern willst solltest du dir die entsprechenden Bücher kaufen und durcharbeiten(ein Nachschlagewerk, Effective C++, Designpatterns, Refactoring usw.).
Diese Bücher haben zusammen viele hundert Seiten. Das können wir dir schlecht alles in einem Forenthread vermitteln. Soetwas würde nur Sinn machen, wenn du schon recht weit wärst. In dem Code gibt es aber mehr zu bemängeln, als es Zeilen gibt(bzw. geben sollte). ;)
"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?

Beiträge: 721

Wohnort: /dev/null

Beruf: Software-Entwickler/Nerd

  • Private Nachricht senden

5

20.05.2012, 11:16

Stetiges Hinterfragen des Codes und viel Programmieren ist meiner Meinung nach mit Abstand das beste Mittel.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

20.05.2012, 11:24

Die meisten die noch nicht soviel Plan haben und dann so ein tolles Buch vorgesetzt bekommen, wollen gleich alles was sie da lernen irgendwo reinquetschen. Das macht dann auch nicht soviel Sinn.
Also wirklich am besten das Buch lesen, Füße still halten und bei jedem Problem oder Design überlegen: "was wäre hier angebrachter?". Dazu muss man natürlich auch, wie Supreme schon sagt, sehr viel programmieren, um zum nötigen Wissen des Buches auch die Erfahrung zu bekommen, _wann_ was angebracht ist.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

7

20.05.2012, 11:35

Hab ja nichts dagegen, dass er programmiert und seinen Code hinterfragt. Allerdings macht dieser Thread kaum sinn, weil wir ihm die Fehler/den "schlechten Stil" zwar berichtigen können, ihnen aber unmöglich zu jedem Punkt eine ausführliche Erklärung geben können. Er weiß also was er falsch macht, aber nicht wieso. Stattdessen sollte er erstmal lernen seinen eigenen Stil zu hinterfragen und ihn an neue Erkenntnisse anzupassen.
"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?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

20.05.2012, 11:42

Ein paar Anmerkungen:

1) Ist natürlich geschmackssache, aber CKlassenname ist eine Konvention die in den 90ern mal in war, obwohl es schon damals keine besonders tolle Idee war. Ich finds hässlich, aber ist am Ende natürlich deine Entscheidung.

2) Von ungarischer Notation (zumindest Systems Hungarian, also so Zeug wie pEvent) halt ich persönlich auch sehr wenig.

3) Gibt es einen Grund wieso du all die Unterobjekte per new anlegst? Wenn ja solltest du zumindest Smartpointer benutzen (std::unique_ptr bietet sich an).

4) Verwend Initialisierungslisten.

5) Das in Zeile 22 ist kein Funktionsaufruf, sondern eine lokale Funktionsdeklaration.

6) Die Pointer im Destruktor auf NULL setzen ist sinnlos.

7) In C++ verwendet man besser nullptr oder früher eher einfach 0 und nicht NULL. (NULL ist in C++ nur dein #define für 0 oder 0U)

8) Sollte running nicht eigentlich erst in Run auf true gesetzt werden und anfangs eher false sein?


Edit: Also anstatt Klassen per Referenzen und Pointer das zu übergeben was sie brauchen
einfach alle von dieser Basisklasse erben lassen?

Zitat

also wirklich eine Klasse, von der alles (oder ein Großteil) erbt.

Um Gottes Willen nein!

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (20.05.2012, 11:53)


FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

9

20.05.2012, 15:45

edit: upps doppelpost
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FreezingEngine« (20.05.2012, 16:09)


FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

10

20.05.2012, 15:45

@Nacho
Größtenteils nehme ich mir das Buch C++ für Spieleprogrammierer als Vorbild.
Dort wird unter anderem die ungarische notation verwendet und auch das C vor dem Klassenamen.
Ich wollte jetzt auch nicht das du hier 100Seiten zum Programmierstil schreibst , sondern nur Tipps
wobei ich nicht wusste das mein Stil so schlecht ist weil dieser hier schon der überarbeitete ist.

@dot
zu Punkt 1) und 2) Dieser Stil wird in dem Buch C++ für Spieleprogrammierer vermittelt.
Also CKlassename , m_iGeld etc.

3) Habs mir bei Leuten abgeguckt die besser sind als ich , von smartptr hab ich nochnie was gehört^^

4) init. listen sagen mir grade auch nichts

5)war sehr spät als ich die klasse geschrieben habe :sleeping:

6) Ohne kommt es zu fehlern!

7) C++ für Spieleprogrammierer

8)stimmt^^
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FreezingEngine« (20.05.2012, 15:51)


Werbeanzeige