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

xXSlayerXx

Treue Seele

  • »xXSlayerXx« ist der Autor dieses Themas

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

1

25.03.2013, 21:08

[C++] Map Datei auslesen

Hi Leute,

ich habe mal ein Frage.
Undzwar möchte ich in nächster Zeit Pacman in 3D Programmieren. (Rein zu Übungszwecken)
Ich dachte mir, dass ich für die verschiedenen Maps Datei schreibe.
Villeicht als beispiel dachte ich mir das so:

xxxxxxxxxoxxxxxx
xoooooooooooooox
xooooooooxooooox
xooooooooxooooox
xooooooooxxxxxxx
xoooooooooooooox
xoooooooooooooox
xooxxxxxxxxoooox
xoooooooooooooox
xoooooooooooooox
xxxxxxxxxoxxxxxx
(Fiktiv)

Nun ist die Frage, wie solche Maps gelesen werden.
Wird da eine For Schleife gestartet, welche mit Hilfe von fstream die Buchstaben ausliest und dann If abfragen.
z.B.:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
if (Eingelesenertext == x) 
{ 
// Create Block on Pos... 
} 
else 
{ 
//Feld frei lassen. 
}


Liege ich da richtig oder macht man soetwas vollkommen anders?
Villeicht könnte mir jemand mal im Ansatz sagen, wie Große 3deminsionale Maps eingelesen werden.

Ich hoffe ihr könnt mir das ein wenig näherbringen und villeicht auch ein paar Stichworte nennen, nach denen ich Suchen sollte, um soetwas zu verwirklichen.

Mit freundlichem Gruß
xXSlayerXx
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »xXSlayerXx« (25.03.2013, 22:48)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

26.03.2013, 00:29

Kannst du genau so machen. Du liesst deine Map Zeile für Zeile, Zeichen für Zeichen ein und erstellst je nach Zeichen ein Objekt, oder eben keins. Im Prinzip genau das, was du selbst vorgeschlagen hast. Und so baust du dir dann deine Map zusammen. Die Welt ist ja im Prinzip 2D und du renderst nur 3d Objekte.
„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.“

xXSlayerXx

Treue Seele

  • »xXSlayerXx« ist der Autor dieses Themas

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

3

26.03.2013, 12:38

super

mich würde auch interessieren, wie 3D map formate im Allgemeinen aufgebaut sind.
Arbeitet man da mit Vectoren und Modellbezeichnungen?
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

26.03.2013, 13:44

Da kannst du dir doch selbst mal ein paar Dinge überlegen. Das was du hier grad gemacht hast war ein Ansatz für Tilebasierte Maps. Du schreibst Tile für Tile in die Datei. Ein anderer Ansatz wäre die Welt zu serialisieren. Dabei wird das Objekt aus dem Speicher selbst gespeichert und hinterher wieder geladen. Für Serialisierung kannst du mal Google durchsuchen, falls dich das weiter interessiert. Ein weiterer Ansatz der sowohl für 2D als auch 3D funktioniert wäre alle Objekte einzeln pro Zeile zu speichern. Du könntest eine ObjektId, oder einen Objektnamen speichern und dazu dann die benötigten Koordinaten, Rotation und alles was du so brauchst. Andererseits könntest du die Map einfach in einem Programm wie Blender erstellen und als Modell laden. Da kannst du dann nur keine Informationen außer der Geometrie selbst einbringen.
Je nach Datenstruktur mit welcher du deine Welt verwaltest kannst du dein Format anders aufbauen. Da ist es sicher sinnvoll einfach mal selbst zu überlegen was man für sinnvoll hält. Ansonsten ist ein Blick in andere schon vorhandene Formate sicherlich auch immer interessant. Als Beispiel könntest du mal nach BSP gucken. Das wäre so ein Format.
„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.“

xXSlayerXx

Treue Seele

  • »xXSlayerXx« ist der Autor dieses Themas

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

5

30.03.2013, 15:42

Hi

ich habe nochmal ne frage, was die Map angeht.
Ich habe nun ein Mapformat, welches wie folgt aussieht:

C-/C++-Quelltext

1
2
3
4
Y 0 X 90    X 90    X 90    X 90    X 90    X 90    X 90    X 90    X 90    X 90    X 90    X 90    X 90    X 90    Y 90    LE  
X 0 C 0 C 0 C 0 C 0 C 0 C 0 X 180   X 0 C 0 C 0 C 0 C 0 C 0 C 0 X 180   LE  
X 0 P 0 Y 0 X 270   X 270   Y 90    C 0 X 180   X 0 C 0 Y 0 X 0 C 0 Y 90    P 0 X 180   LE
Q

(Extrem abgespeckt)

Dieses Format lese ich auch super ein und speichere alle Koordinaten und Rotationswinkel in eine Struktur ein. (Übrigens sind die Zahlen im Format Rotationswinkel^^)
Bei LE wird eine neue Zeile (z Koordinate) angefangen.
Wenn input = Q ist, ist die Datei am ende angelangt. (Dies ermöglicht es Komentare und Erklärungen mit in die MapDatei zu schreiben.)

So nun geht es ans erstellen der Modelle und Rendern.
Doch da habe ich ein Problem.
Die Mittelpunkte der 3D Modelle sind nicht richtig positioniert.
Ich benutze .X Datein.
Ich habe schon viel in 3DsMax rumprobiert, um den Pivot an die richtige stelle zu bekommen.
Doch irgendwie ist er nie da, wo ich ihn haben möchte.

Meine Frage:
Kann ich den Pivot manuel über Koordinaten setzten?
In der Datei oder villeicht sogar im Code?

Ich hoffe dass sich da jemand auskennt.
Mit freundlichem Gruß
xXSlayerXx
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

30.03.2013, 17:37

Naja in der Datei ist das nur bedingt möglich. Die Koordinaten von einem Vertex sind im Format ja normal relativ zum Ursprung, welcher gleichzeitig der Mittelpunkt ist. Wenn du den Punkt nachträglich setzen können möchtest, so kannst du ihn ja auch genau so gut in 3DS Max setzen. Ob du nun die Koordinate im Code angibst, nachträglich was an der .x Datei änderst oder das direkt in deinem Modelprogramm baust macht da eigentlich keinen unterschied. Hört sich eher so an, als sei da ein anderes Problem.
Zu deinem Format. Du musst normal nicht selbst "LE" schreiben um ein Ende der Zeile anzugeben. Oft kann man direkt eine Zeile einlesen, weshalb man sich das am Ende sparen könnte. Und für das Dateiende würde ich auch kein Zeichen festlegen. Normal willst du Kommentare ja mitten durch das Format verteilen. Eine Möglichkeit die es da sehr einfach machen würde, wäre ein bestimmtes Zeichen am Anfang einer Zeile festzulegen. Zum Beispiel Zeilen die mit einer Raute "#" beginnen sind Kommentarzeilen. Ansonsten kannst du Dokumentierende Texte ja nur ans Ende des Formats legen. Das ist ja eigentlich quatsch.
„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.“

xXSlayerXx

Treue Seele

  • »xXSlayerXx« ist der Autor dieses Themas

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

7

31.03.2013, 00:45

Achso

ich dachte mir, dass der Pivot ausschlag gebend ist.
Wenn es jedoch der Mittelpunkt in 3Ds Max muss ich das alles nochmal ein wenig ändern.

Auch habe ich noch ein Problem damit, wo genau ich den Mittelpunkt setzten muss, da ich die Wände schließlich rotieren möchte.
Naja ich schaue morgen nochmal nach, was sich da machen lässt.
Sonst muss ich das mit den grad zahlen nocheinmal überdenken.

Danke für die Informationen.
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

31.03.2013, 08:51

Du willst Wände rotieren? Das würde ich in der Tat nochmal überdenken.
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]

xXSlayerXx

Treue Seele

  • »xXSlayerXx« ist der Autor dieses Themas

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

9

31.03.2013, 11:19

Hi

Frohe Ostern erstmal ;)

bis jetzt klappt es super.
Muss natürlich noch einiges ausbessern aber es geht vorran.
Hier mal der bisherige stand der Map. (Texturen Fehlern[ist ne vorrübergehende drauf])


(Link)


Ich muss die Wände rotieren, da diese verrundungen haben, und die verrundungen immer nach innen stehen sollen.
Also entweder um (90,180 oder 270°) rotieren, um diese auszurichten.
So muss ich niocht für jede richtung von Wand ein neues Modell erstellen.
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

31.03.2013, 13:15

Im Prinzip sind es ja einfach alles Würfel. Zumindest mehr oder weniger. Der Mittelpunkt sollte dann also der wirkliche Modellmittelpunkt sein. Rundungen etc natürlich nicht beachtet. Ich würde da einfach anfangen einen Würfel zu nehmen. Hier ist der Mittelpunkt noch genau in der Mitte. Jetzt könnte man die Wände abkappen die machen möchte und die Kanten wie gewollt abrunden. Den Mittelpunkt würde ich hier einfach nicht mehr verschieben. Normal gibt es aber einen Unterschied zwischen globalem und lokalem Mittelpunkt. Bei Blender würde ich das Objekt auf Position 0, 0, 0 setzen. Dann ist der lokale Ursprung des Objekts im Nullpunkt. Dann befinden sich lokaler und globaler Ursprung in ein und dem selben Punkt. Wenn ich bei Blender nun im Editmode (hier können Vertices, Edges und Faces manipuliert werden) die einzelnen Daten verschieben würde, so könnte ich das Modell zum eigenen Ursprung ausrichten. Bei 3DS Max geht das sicher auch. Zur Not guck mal wie du den Ursprung eines Modells verändern kannst.
„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