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

Gelöschter Benutzer

unregistriert

1

25.11.2013, 07:03

2D-Array in einer Klasse

Guten morgen (bei mir ist es jetzt 6:56), da ich nun das Laden der Bilder in der SDL dank euch "behersche", möchte ich nun weiter programmieren. Ich komme mal gleich zur Frage, wie ich ein 2D-Array in einer Klasse deklarieren und im Konstruktor definieren kann. Ich habe schon viel im Internet "gebingt" (was sagt man wenn man Bing benutzt :) ), und festgestellt, dass ich mit dieser Art Hilfe nicht weiter komme, zusätzlich waren die 2D-Arrays dort konstant, was sie bei mir nicht sein sollten, weil ich das Array für eine veränderbare Map (ich meine gelesen zu haben, dass man so etwas "Tilemap" nennt) benutzen möchte. Ich möchte mich schon im Voraus für eure stets sehr freundlichen und kompetenten Antworten bedanken,
alex41018

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

25.11.2013, 07:15

Schau mal hier:
https://www.spieleprogrammierer.de/18-c-…usplus-2d-array
Dort gibt es viele Vorschläge auch für dynamische Größen. Der von Jonathan_Klein dürfte für Dich wohl am geeignetsten sein.
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

3

25.11.2013, 10:37

Dynamische Array würde ich mal sagen ;) Mit const maps habe ich leider keinen Erfolg gehabt, lag aber auch daran, dass ich das SDL Spiel aus dem Buch verändert habe. Besser ist es selbst von Null anzufangen. Wie sind deine Kenntnisse in C++?

4

25.11.2013, 10:44

const maps?
Ich hoffe damit ist std::array gemeint und nicht das was ich darunter verstehe. :crazy:

MfG
Check

Gelöschter Benutzer

unregistriert

5

25.11.2013, 14:33

Vielen Dank für eure Antworten! Ich glaube ich werde mir die Idee von BlueCobold zu Herzen legen. Der Haken: ich habe noch Fragen. Zu meinem Projekt und den Kenntnissen: ich habe mir das C++ für Spieleprogrammierer gekauft, lerne dieses, und bin jetzt im 12. Kapitel, obwohl ich zugeben muss, dass ich einiges nur überflogen habe. Das Projekt habe ich mir aus Code-Teilen von dem 12. Listing zusammengebastelt. Nun zu den Fragen, bei Jonathan_Klein's Beispiel. Ich verstehe nicht ganz, wie ich so eine Tilemap erstellen kann, oder einzelne Felder mit Werten füllen kann. Hier habe ich mal probiert, dass irgendwie zu erforschen:CTest.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <vector>

class CTest
{
public:
    CTest();
    std::vector<int> Map;
    int Width; int Height;
    int& Access(int x, int y)
    {
        return Map[x+y*Width];
    }
};

die main.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include "CTest.hpp"
using namespace std;
extern CTest Test;
int main ()
{
    int Wert = 0;
    CTest Test;
    Test.Access (5, 7) = Wert;
    cout << "Wert: " << Wert << endl;
    cin.get ();
    return 0;
}

und zu guter letzt noch die CTest.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
#include "CTest.hpp"

// Konstruktor
//
// Aufgabe: Allgemeine Initialisierungen
//
CTest::CTest()
{
} // Konstruktor

Leider kommt es bei diesem Beispiel zu Fehlern, ich werde in ca. einer Stunde den Beitrag nachbearbeiten, weil ich jetzt zum Zahnarzt muss.

6

25.11.2013, 14:43

Es kommt zu Fehlern ist keine sinnvolle Angabe, die sagen nämlich was nicht passt. Also exakt angeben ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
// ...

extern CTest Test;   // Wozu? Weg damit.

// ...

CTest Test;
Test.Access (5, 7) = Wert; // Zugriffsverletzung, dein vector in der Klasse hat die Länge 0 und Test::Width ist undefiniert.
// Übergib Höhe und Breite im Konstruktor und initialisiere deine Variablen und den vector.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

25.11.2013, 14:50

Ja, eine Initialisierung für die Größe des Vektors fehlt bei Jonathan natürlich noch. Ein Konstruktor mit Höhe und Breite bietet sich da sicher an, vielleicht auch noch Methoden zum Re-Sizen. Allerdings ist die Variante von Jonathan nicht sonderlich re-size-freudig. Da müsste man immer wieder neue Vektoren erstellen und die Inhalte kopieren oder die Größe des bestehenden ändern und dann die Inhalte verschieben.
Mit einem vector<vector>> gäbe es das Problem nicht, aber niemand würde dann garantieren, dass die Map auch noch rechteckig ist, also dass jede Zeile (bzw. Spalte) dieselbe Anzahl Elemente hat.
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]

Gelöschter Benutzer

unregistriert

8

25.11.2013, 17:25

Also ich blick langsam garnicht mehr durch :dash: wenn die Vektoren sowieso nicht immer rechteckig sind, kann ich sie doch nicht für eine tilemap verwenden? Gibt es keine Möglichkeit irgendwie ein 2D-Array in einer Klasse zu initialisieren? Oder sowas ähnliches? Muss auch keine schöne lösung sein, nur sie soll funktionieren :) wie kann man sonst eine tilemap initialisieren, wenn sie nicht in einer klasse ist? oder wie würdet ihr an die Sache herangehen?

9

25.11.2013, 17:37

Initialisierungsliste
Trotzdem kannst du Vektoren verwenden.

MfG
Check

Gelöschter Benutzer

unregistriert

10

25.11.2013, 21:42

Vielen Dank für eure Antworten, aber bevor ihr euch jetzt noch mehr arbeit macht, antworten auf diese fragen zu finden, wartet bitte , weil mir gerade eine gute idee kam. ich werde euch benachrichtigen wenn diese funktioniert, bzw. nicht funktioniert hat :)

Werbeanzeige