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

TigerClaw25

unregistriert

11

13.05.2013, 15:27

Das einzige, was mir unklar ist, ist die Verwendung von Framework und Sprite Klassen. Hab noch Probleme damit, alle Klassen entsprechend zu unterteilen, wie ich Buch von Heiko beschrieben. Wuesste am Beispiel des
Tutorials nicht, wie ich das am besten unterteilen wuerde ...

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

12

13.05.2013, 16:13

Ist auch die Frage ob das alles so zusammen passt. Das Buch von Heiko zeigt ja nur einen der unendlich vielen Möglichen Wege. Da ich das Buch selbst nicht besitze kann ich jetzt wenig dazu sagen, wie du das ganze einbinden kannst. Ich selbst baue Tilemaps meistens so, dass ich mir eine Klasse für ein einzelnes Tile anlege. Dieses bekommt bei mir eine Grafik (manchmal auch mehrere, je nachdem was ich genau brauche), und eine Position. Die Position entspricht nicht des Indexes in der Datenstruktur, sondern der eigentlichen Position in der Welt. Also die Position an welche das Tile gerendert werden soll. Als nächsten bau ich mir eine Klasse für die Map selbst. Dort ist intern eine Datenstruktur welche die Tiles verwaltet. Zum Beispiel kann man hier ein 2dimensionales Array nehmen. Ein Array mit einer Dimension funktioniert auch. Andererseits geht aber auch std::vector oder was auch immer. Geschmackssache. Diese Klasse bekommt jetzt zusätzlich ein paar Funktionen. Dabei gucke ich was ich so brauche. Normalerweise benötigt man Funktionen um auf einzelne Tiles zuzugreifen um Eigenschaften abzufragen, eine Funktion zum laden der Karte, eine zum rendern der Karte und was einem alles so einfällt. Die Sache dabei ist, solange du etwas nicht brauchst, brauchst du es auch nicht. Soll heißen, wenn dir eine Funktion einfällt die du grad unbedingt brauchst oder haben möchtest, dann bau dir diese. Wenn du eine Funktion aber grad für dein Spiel nicht benötigst, dann musst du sie ja auch nicht für deine Karte entwickeln. Also siehst du selbst mit der Zeit was deine Klassen so alles brauchen. Halt allein aus deinen eigenen Anforderungen. Halt dich nicht zu lange mit Tutorials und der Suche nach solchen Dingen auf. Oft hilft es viel mehr wenn man sich einfach mal selbst dran setzt und es einfach versucht. Wenn es nicht klappt wird noch mal versucht. Und zur Not ein drittes mal. Dabei lernst du ungemein viel und es bringt dich ein gutes Stück weiter. Diese Tutorials zeigen dir zwar direkt einen möglichen Weg, die anderen Lerneffekte zögerst du damit aber hinaus.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

TigerClaw25

unregistriert

13

13.05.2013, 16:50

.Ok, werde mich dran setzen. Dachte auch an eine Klasse fuer ein Tile und eine Klasse Map, die dann die jeweiligen Maps enthaelt. Framework und Spriteklasse aus dem Buch kann ich dann eventuell auch verwenden, muss das nur so schreiben,dass ich nicht eine Spriteklasse fuer die Spielobjekte habe und zusaetzlich auch noch fuer die TileMaps etwas schreibe. Ich versuche es einfach und wenn ich ein Ergebnis habe, kann ich hier nochmal schreiben.

Timer brauche ich derzeit noch nicht, wenn ich kein bewegliches Objekt oder Events abfrage. Eventuell benoetige ich nichteinmal die Sdl_imag Bibliothrk, wenn ich nur mit bmp Format arbeite. Wie du schon sagtest, klein anfangen und Schritt fuer Schritt, danke!

EDIT: hab mir ueberlegt diese clips Geschichte komplett wegzulassen. Lade einfach jeweils eine Grafik mit einem Index und je nach Map wird dann das entsprechende Sprite gesetzt.
Das funktioniert mit der Frameworkklasse Heikos Buch wunderbar.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (13.05.2013, 18:01)


14

13.05.2013, 18:38

Falls das noch ein Thema ist: Ich nehme an, dass bei dir im Verzeichnis die libpng12-0.dll fehlt. Deswegen beendet sichs gleich wieder.

TigerClaw25

unregistriert

15

14.05.2013, 20:34

Könnte an libpng12-0.dl gelegen haben, danke!

Kurze Verständnisfrage noch: Warum kann ich das hier nicht direkt über meine CGame Klasse in der CGame.hpp einbinden, sondern lediglich in CGame.cpp zwischen #include "CGame.hpp" und den Funktionsdeklarationen von CGame

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
const unsigned int map_breite = 4;
const unsigned int map_hoehe = 4;

// Map selbst
unsigned int tilemap[map_hoehe][map_breite] =  
  { 1,1,0,0,
  1,1,1,1,
  1,1,1,1,
  1,1,1,1
};


Und meine zweite Frage: Gebe ich den Speicher von CSprite Spritemap[12] so wieder frei?


C-/C++-Quelltext

1
2
3
4
5
if (Spritemap[12] != NULL)
    {
        delete (Spritemap[12]);
        Spritemap[12] = NULL;
    }


oder mit free (Spritemap)? Hab dazu nicht wirklich etwas brauchbares gefunden :(

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »TigerClaw25« (14.05.2013, 22:57)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

16

14.05.2013, 23:15

Für dein Include Problem brauchen wir schon etwas mehr Code. Ich zumindest. So kann ich da nichts zu sagen. Und was ist Spritemap. Ein Array? Sollte in deinem Buch nichts über Zeiger, dynamische Speicherreservierung bzw Freigabe etc stehen? Diese Kapitel solltest du dir noch mal genauer angucken.

C-/C++-Quelltext

1
2
3
4
5
int *p = new int;
int *a = new int[5];

delete p;
delete[] a;
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

TigerClaw25

unregistriert

17

15.05.2013, 00:02

Das habe ich, aber wenn ich jetzt mein Array mit NULL initialisieren moechte, muss ich ja nicht mit einer for Schleife alle Inhalte durchgehen oder?

Was ich oben geschrieben habe Spritema[12]=NULL ist ja sowieso bloedsinn, da ich damit nicht das gesamte Array mit NULL initialisiere ....

Habe das doch unterschaetzt. Sollte mir dafuer mal ein paar Wochen Zeit nehmen.


Zum include Problem. Die Game.hpp, in der ich es zuvor eingetragen hatte, ist sowohl in der Game.cpp als auch in der Main.cpp eingebunden. Eventuell ging es deshalb nicht.
Aber warum das so ist, keine Ahnung :|

EDIT: Habe das jetzt wie folgt gelöst:

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
// Init
//
// Aufgabe: Hintergrund initialisieren
//
void CGame::Init ()
{

    // Hintergrundbild (Sprite) laden
    p_Spritemap = new CSprite [TOTAL_TILES];

    p_Spritemap[0].Load ("Data/red.bmp");
    p_Spritemap[1].Load ("Data/green.bmp");
    p_Spritemap[2].Load ("Data/yellow.bmp");
    p_Spritemap[3].Load ("Data/blue.bmp");


    // Spiel läuft
    m_bGameRun = true;

} // Init

// Quit
//
// Aufgabe: Instanzen freigeben
//
void CGame::Quit ()
{
        // Hintergrundsprite freigeben
    if (p_Spritemap != NULL)
    {
        delete[] p_Spritemap;
        p_Spritemap = NULL;
    }
} // Quit


Wobei ich irgendwie immer wieder verwirrt bin, da ich hier den Punktoperator verwende.

Würde ich jedcoh folgendes schreiben, würde ich den "->" Operator verwenden

C-/C++-Quelltext

1
2
3
4
5
6
CSprite Sprites[4]
...
...
...
Sprite[0] = new CSpirte;
Sprite[0]->Load ...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (15.05.2013, 10:29)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

18

15.05.2013, 11:13

Das Include Problem lässt sich vermutlich lösen indem du Include-Guards verwendest. "->" ist ein Operator auf Zeiger. Dieser dereferenziert den Zeiger bevor er auf Member Zugriff gewährt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
class Test
{
public:
    int Value;
};


Test *test = new Test;
// test.Value = 0; // Fehler, da falscher Zugriff. Ein Zeiger auf Test kennt Value nicht.
(*test).Value = 7; // Setzt Value auf 7
test->Value = 19; // Setzt Value auf 19


Sowas sollte aber eigentlich auch in einem C++ Lehrbuch drin stehen. Wenn du bei C++ bleiben möchtest empfehle ich dir allgemein ein wenig weiterführende Lektüre. Allein als Nachschlagewerk.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

TigerClaw25

unregistriert

19

15.05.2013, 11:25

Danke dir. Aber bei meinem Beispiel oben funktioniert es nur mit Punktoperator, steht auch so in Heikos Buch, hat etwas mit der Zuweisung des arrays zutun.

Kurze sache noch, lade ja vier Tiles. Aber wenn ich den Bildschirm richtig fuellen moechte und spaeter Kollisionen etc einbau, waere es doch sinnvoler mir noch ein Array mit der Anzahl an zu nutzenden Tiles zu deklarieren und darin dann meine geladenen Bildchen zu speichern oder?

Also einmal dann Anzahl an Tiles und dann noch ein Array mit der Anzahl der Tiles, die ich insgesamt verwenden moechte.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

20

15.05.2013, 12:37

Naja zu der Array Geschichte sei nochmal gesagt, ein Buch mit mehr als 300 Seiten zu C++ sollte schon drin sein;)
Was das zweite angeht, da verstehe ich nicht genau was du meinst. Willst du die möglichen Tiles in einem Array speichern und die Map in einem weiteren Array? Das wäre natürlich eine Möglichkeit. Dabei solltest du so vorgehen, dass die Zahl in der gespeicherten Map dem Index des Tilearrays entspricht. Wenn du was anderes meinst dann erklär bitte noch mal was genau.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige