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

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

26.11.2013, 13:27

Du kannst natürlich auch selbst dafür sorgen dass verschachtelte Strukturen wie vector<vector> immer die passende Größe haben. Du kapselst das ganze einfach in eine Klasse und gibst dieser dann passende Methoden. Als Beispiel wären da ResizeWidth(int newSize), ResizeHeight(int newSize) um die Größe zu verändern. In diesen Methoden passt du dann den internen vector, bzw die internen vector-Datenstrukturen an. Für die Zugriffe schreibst du dir dann passende Methoden. So möchtest du dir zum Beispiel eine Zelle zurück geben lassen können, wobei du dafür x und y Koordinaten angibst. Hier kannst du zusätzlich noch eine Fehlerüberprüfung einbauen, ob die Werte für x und y nicht zu groß, bzw zu klein sind. Bin mir nicht ganz sicher, vector überprüft das glaube ich sonst auch schon für dich. Ansonsten wirst du noch einen Wert an Stelle x, y setzen wollen und möglicherweise Höhe und Breite abfragen wollen. Das ganze sollte recht einfach umzusetzen sein und nicht all zu lange dauern. Von der Bedienung ist es dann einfacher zu handhaben als selbst mit vector<vector> rum zu fuchteln.
Aber guck ruhig erst mal mit deiner Idee:) Vielleicht teilst du sie ja hier mit uns.
„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.“

Gelöschter Benutzer

unregistriert

12

26.11.2013, 15:53

danke Schorsch, für deine Antwort! Leider kann ich noch nichts sagen, wie deins ist, weil ich selber noch nicht fertig bin, weil ich dazu eine Frage habe. Wie kann ich ein 2D-Array, welches in einer Funktion deklariert und definiert worden ist, an eine Funktion einer Klasse übergeben? Hier der genaue Fall: m_pMap->Render(*WAS MUSS HIER REIN?*); was muss dann noch in den Prototypen (darf man das sagen?) der klasse rein? [EDIT:]hat sich erledigt

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »alex41018« (26.11.2013, 19:36)


13

27.11.2013, 11:46

Vielleicht hilft das hier noch:

http://zfx.info/viewtopic.php?f=4&t=3250

dot hat in seiner Antwort eine ganz hübsche Zusammenfassung. Es ist vermutlich gut zu wissen, wie 2D-C-Arrays funktionieren, aber benutzen sollte man sie trotzdem nicht.
Lieber dumm fragen, als dumm bleiben!

Gelöschter Benutzer

unregistriert

14

27.11.2013, 14:27

Danke, Jonathan, ich werde mir das aufjedenfall mal durchlesen, aber nun zu meiner lösung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Map updaten und rendern
        int xPosition = 0;
        int yPosition = 0;
        for (int i=0; i<Array2dHeight; i++)
        {
            yPosition = 0;
            yPosition = (i*60);
            for (int i2=0; i2<Array2dWidth; i2++)
            {
                xPosition = 10+(i2*60);
                int array_wert = array2d[i][i2];
                m_pMap->Render(array_wert, xPosition, yPosition);
                xPosition = 0;
            }
        }

Diese Funktion gibt die nötigen Werte an die Funktion über, die die Tilemap rendert. Die Tilemap, also das Array, ist global in der Funktion "game.cpp" gespeichert. Dieser Schritt befindet sich in der Hauptschleife, also in der "game.cpp".

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »alex41018« (27.11.2013, 14:40)


15

27.11.2013, 15:18

Joah, nicht gerade wunderschön, aber es ist ja auch sehr wichtig, dass man eigene Lösungen finden kann, auch wenn diese nicht so elegant sind, wie Lösungen die man sich von woanders her kopiert hat (und dabei dann nichts lernt). Von daher :thumbsup:

Aber ein bisschen was möchte ich schon noch dazu sagen: Du weißt vielen Variablen Werte zu, die du nie benutzt (wenn ein geschriebener Wert niemals gelesen wird, war es sinnlos ihn zu schreiben). Und du deklarierst Variablen zu früh. "xPosition" Beispeilsweise hat außerhalb der innersten Schleife keine sinnvolle Bedeutung. Es verwirrt nur, dass außen mehr Variablen "sichtbar" sind, die man aber nicht benutzen sollte. Stattdessen könnte man schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
// Map updaten und rendern
        for (int i=0; i<Array2dHeight; i++)
        {
            const int yPosition = (i*60);
            for (int i2=0; i2<Array2dWidth; i2++)
            {
                const int xPosition = 10+(i2*60);
                int array_wert = array2d[i][i2];
                m_pMap->Render(array_wert, xPosition, yPosition);
            }
        }

Wie du siehst sind unnötige Zuweisungen entfernt worden und die Variablen sind erst dort deklariert, wo man sie auch benutzt. Zusätzlich habe ich noch const benutzt. Im Grunde ist xPosition und yPosition ja jeweils nur eine kleine Hilfsvariable; ein hübscher Name für die Berechnung die ihr zugewiesen wird. Es dient durchaus der Lesbarkeit des Codes, Zwischenergebnisse Werte zu geben, dadurch werden Formeln kürzer und man hat eine bessere Intuition, was welcher Teil jetzt bedeuten soll.
Du willst ja im Grunde xPosition nicht ändern. Es soll die Bedeutung (10+(i2*60)) haben, und die ändert sich bis zum nächsten Schleifendurchlauf ja nicht. Die Zuweisung ist nicht irgendein Startwert, sondern du hast im Grunde für jedes Objekt in der Map eine eigene X-Position, die du berechnest.

Was ich damit sagen will: Der Code ist jetzt nicht nur kürzer, sondern auch von der Bedeutung her sinnvoller. Und dazu musste man von der ursprünglichen Idee nur ein paar Kleinigkeiten ändern.
Lieber dumm fragen, als dumm bleiben!

Gelöschter Benutzer

unregistriert

16

27.11.2013, 15:21

Nochmals vielen Dank! werde es sofort in mein Projekt übernehmen :thumbsup:

Werbeanzeige