TileMap Extern Laden | Kollision

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

Betreff: TileMap Extern Laden | Kollision

BeitragFr, Jul 01, 2011 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Wie schon in einem anderen Thread gesagt, möchte ich jetzt lieber doch mit der 2D Programmierung beginnen.
Gestern habe ich angefangen, zu lernen, wie ich Tilesets benutze. Ich bin mit meinen Kenntnissen dort für einen Tag schonmal zufrieden. Jedoch habe ich aus dem Tutorial von Robsite nur gelernt, wie ich die Maps mit dem ganzen Data Gedöns da, im Programm Code selber zu programmieren. Jetzt gibt es hier einige Leute (zu denen gehöre ich auch), die wollen, dass man die Maps in einer externen Datei lädt. Aber wie kann ich das realisieren?

Ich habe eine im Ordner .\Maps\Map01.lvl Datei angelegt, daraus möchte ich die Maps dann laden. Nur wie?
Ich habe mir dazu schon OpenFile etc. angeguckt. Ich weiß auch wie ich Zeilen auslese so mit ReadLine und so, aber das ist ja Zeilenweise Sad

Ich hoffe mir kann jemand helfen.
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragFr, Jul 01, 2011 11:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kommt darauf an, wie du deine Level erstellen und bearbeiten willst. Wenn du sie per Text Editor tippen willst, musst du den Text zurechtschneiden: Zeile auslesen und mit Instr, Mid usw. soweit bearbeiten, das du deine benötigten Informationen hast.
Die andere Möglichkeit ist, das du dir einen eignen Level Editor schreibst - da musst du nur alles hintereinander Speichern und in der selben Reihenfolge laden. Diese Variante würde ich auf längere Sicht für einfacher und komfortabler halten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Jul 01, 2011 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Nja, aber das ist noch nicht mein Problem,
ich weiß nichtmals wie ich die Levels einbinden soll.

Vorher habe ich immer:

Code: [AUSKLAPPEN]

Data 1,1,1,1,1
Data 1,1,1,1,1
Data 1,1,1,1,1
Data 1,1,1,1,1
Data 1,1,1,1,1


Jetzt möchte ich dieses Feld von 1 en in die Map01.lvl schreiben und dann auslesen.

Wie mach ich das?
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragFr, Jul 01, 2011 11:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn deine Karte eine Variable Größe hat, solltest du breite & höhe Speichern - und dann folgt einfach der Karteninhalt. WriteInt und fertig.
Beim Laden liest du breite & höhe aus, Dimensionierst das Array auf die größe, und lädst die Daten in zwei verschachtelten Schleifen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Jul 01, 2011 11:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Könntest du mir vielleicht nen kleinen Beispiel Code nennen?

Ich verstehe nicht so genau wies gemeint ist - sorry.
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragFr, Jul 01, 2011 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitteschön:
BlitzBasic: [AUSKLAPPEN]

Data 2,3 ;* Breite & Höhe
;* Karten Inhalt:
Data 1,1
Data 1,1
Data 1,1

;* In Array Laden:
Local Karte_W, Karte_H
Read Karte_W, Karte_H

Dim Karte(Karte_W-1, Karte_H-1)
Local x,y
For y=0 To Karte_H-1
For x=0 To Karte_W-1
Read Karte(x,y)
Next
Next

;* Aus dem Array Speichern:

Local FileStream%=WriteFile("map.level")
;* Breite & Höhe:
WriteInt(FileStream, Karte_W)
WriteInt(FileStream, Karte_H)
;* Inhalt:
For y=0 To Karte_H-1
For x=0 To Karte_W-1
WriteInt(FileStream, Karte(x,y))
Next
Next
CloseFile(FileStream)

;* Laden funktioniert genau so:
Local FileStream%=ReadFile("map.level")
;* Breite & Höhe:
Karte_W = ReadInt(FileStream)
Karte_H = ReadInt(FileStream)
;* Array bereit stellen:
Dim Karte(Karte_W-1, Karte_H-1)
;* Inhalt:
For y=0 To Karte_H-1
For x=0 To Karte_W-1
Karte(x,y) = ReadInt(FileStream)
Next
Next
CloseFile(FileStream)

Frag nach, falls dir was nicht klar ist.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Ana

BeitragFr, Jul 01, 2011 11:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich schreibe mir immer einen kleinen editor für sowas, das dauert natürlich ein weilchen, aber ich bin beim programmieren keine aristotelische teleologin Wink

Ganz simpel kannst du das in etwa so machen

BlitzBasic: [AUSKLAPPEN]
Global SelectedTile,tilesize
Dim Map(Mw,Mh)
Function DrawMap()
SelectedTile = GetKey()
For i = 0 To mw
For j = 0 To mh
DrawImage map(i,j)
If mousdown(1) And mouseoverlape(i * tilesize,j*tilesize) Then map(i,j) = getTile(SelectedTile)
Next
Next
End Function

Function SaveMap(Pfad$,mapname$)
Stream = WriteFile(Pfad$+ "/" + mapname)
WriteInt(Stream,mw)
WriteInt(Stream,mh)
For i = 0 To mw
For j = 0 To mh
WriteInt(map(i,j)
Next
Next
CloseFile
End Function

Function LoadMap(Pfad$,mapname$)
Stream = readfiel(Pfad$+ "/" + mapname)
mw = ReadInt(stream)
mh = ReadInt(stream)
For i = 0 To mw
For i = 0 To mh
map(i,j) = getTile(ReadInt(Stream))
Next
Next
End Function


Also da fehlt natürlich noch was und der kann fast nichts, aber vielleicht erkennt man ein prinzip wie man es lösen kann. Die Funktion getTile und moveoverlape musst du selber machen, ich muss in die uni Very Happy

GetTile muss aus einer Zahl ein Image zurück geben.

Edit: ach Xeres Razz... hätte ich mich dabei nicht noch zurecht gemacht, dann wäre ich schneller gewesen! Very Happy
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Jul 01, 2011 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
hehe, danke ihr beiden.. Werde mir das jetzt maln paar stunden angucken. Denn beide Codes kann ich ja schlecht einfach runterlesen.... naja danke jedenfalls dafür.

Bei weiteren Fragen melde ich mich hier.

Edit: Ja ich habe schon eine Frage:

@Xeres du hast bei Dim Karte(Karte_w) etc ein -1 stehen...

Wofür steht diese -1?
Mit freundlichen Grüßen: GearTechDE

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Jul 01, 2011 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe ein Problem mit deinem Code Xeres.

Hier mal mein bisheriges Projekt:

Main.bb
BlitzBasic: [AUSKLAPPEN]


;
;
;Main.bb
;
;

AppTitle ("[GearTech] Dragon Legends - Alpha")
Graphics 800,600,32,2
SetBuffer BackBuffer()


;
;Include
;

Include ".\Include\LoadResources.bb"
Include ".\Include\Maps.bb"

;
;Include
;


;
;Main Loop
;

Repeat
Cls

;
;Maps
;

;Map01

Map01Loop()

;Map01

;
;Maps
;

Flip

Until KeyHit(1)
End

;
;Main Loop
;


;
;
;Main.bb
;
;



LoadResources.bb

BlitzBasic: [AUSKLAPPEN]


;
;
;LoadResources.bb
;
;

Global Grounds = LoadAnimImage(".\Textures\grounds.bmp",32,32,0,3)

;
;
;LoadResources.bb
;
;



Maps.bb

BlitzBasic: [AUSKLAPPEN]


;
;
;Maps.bb
;
;


;
;Map01
;

Local FileStream%=ReadFile("Map01.lvl")
;* Breite & Höhe:
Karte_W = ReadInt(FileStream)
Karte_H = ReadInt(FileStream)
;* Array bereit stellen:
Dim Karte(Karte_W-1, Karte_H-1)
;* Inhalt:
For y=0 To Karte_H-1
For x=0 To Karte_W-1
Karte(x,y) = ReadInt(FileStream)
Next
Next
CloseFile(FileStream)

Function Map01Loop()

For x = 0 To Karte_W -1
For y = 0 To Karte_H - 1
DrawImage Grounds,x*32,y*32,Karte(x,y)
Next
Next

End Function

;
;Map01
;


;
;
;Maps.bb
;
;



Wobei ich die Map01.lvl mal in alle Ordner zur Sicherheit kopiert.
Ich bekomme immer einen MAV.

Warum?

Vorher gings alles.
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragFr, Jul 01, 2011 12:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Killerjo96 hat Folgendes geschrieben:
Wofür steht diese -1?
Ein mit Dim erstelltes Array geht von einschließlich 0 bis zum angegeben Wert. Wenn 0 den ersten Wert enhält, bedeutet Breite=2 das es {0, 1, 2} = 3 Speicherplätze gibt.
Menschen fangen bei 1 an zu zählen, Computer bei 0 - ich korrigiere also die Größe, damit es keinen ungenutzen Platz gibt.

Killerjo96 hat Folgendes geschrieben:
Ich bekomme immer einen MAV.
Gewöhne dir gleich an, selbst du Debuggen.
Debugger in der IDE einschalten, Genaue Fehlerbeschreibung + Zeile untersuchen bzw. posten.
Kann sein das es daran liegt, dass du beim zeichnen x-y statt y-x Schleifen benutzt.
y-x geht das Array Zeilenweise durch, x-y Spaltenweise. Erstere Variante ist schneller, da der Speicher linear durchgegangen wird und nicht so herum gesprungen werden muss.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Jul 01, 2011 13:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei Debugging wird diese Zeile markiert:
Code: [AUSKLAPPEN]

Dim Karte(Karte_W-1, Karte_H-1)
Mit freundlichen Grüßen: GearTechDE

Midimaster

BeitragFr, Jul 01, 2011 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
dann lass dir doch mal im Debugger ausdrucken, welche Werte wirklich für Karte_W und Karte_H eingelesen wurden:

BlitzBasic: [AUSKLAPPEN]
Local FileStream%=ReadFile("Map01.lvl")
;* Breite & Höhe:
Karte_W = ReadInt(FileStream)
Karte_H = ReadInt(FileStream)
DebugLog "Die DIMS=" + Karte_W + " " + Karte_H
Dim Karte(Karte_W-1, Karte_H-1)


Es gibt übrigens ein Tutorial zum Lesen/Schreiben von Map-Daten in Files:

Lektion VI meines "Dateien-Tutorials" : https://www.blitzforum.de/foru...hp?t=33651
  • Zuletzt bearbeitet von Midimaster am Fr, Jul 01, 2011 13:24, insgesamt einmal bearbeitet

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Jul 01, 2011 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
omfg... jetzt kapier ich garnix mehr....
Mit freundlichen Grüßen: GearTechDE
 

pinochino

BeitragFr, Jul 01, 2011 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
DebugLog "Die DIMS=" + Karte_W + " " + Karte_H


Damit werden dir Im Debugfenster die Werte Für Karte_W & Karte_H angezeigt

lg
  • Zuletzt bearbeitet von pinochino am Fr, Jul 01, 2011 13:35, insgesamt einmal bearbeitet

Midimaster

BeitragFr, Jul 01, 2011 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
wieso, war dieser tipp jetzt wirklich zu kompliziert?

Du kannst Inhalte von Variablen immer im Debugger anzeigen lassen. Dazu schreibst Du einfach an der gewünschten Stelle:

BlitzBasic: [AUSKLAPPEN]
DebugLog Wert



Dann lässt du das Programm laufen und beobachtest, was der Debugger an Zahlen ausgibt. Ich vermute mal er wird dir zwei Nullen anzeigen. Das bedeutet, der READFILE Vorgang (Zeile davor) ist schief gegangen.


TIPP:
Es ist auch wirklich nicht sehr sinnvoll als Anfänger mit einer MAP-Datei zu beginnen, die sich nicht in einem x-beliebigen Text-Editor erstellen betrachten oder ändern lässt. Besser du schreibst die MAP erst mal mit dem Notepad (oder direkt in einem zweiten BB-Fenster Very Happy )und versuchst sie dann im Programm zu lesen lesen.

Der Unterschied zu den Byte-basierten Dateien ist, das Du immer eine ganze waagrechte Zeile auf einmal einliest, in der du dann die einzelnen x-Werte auseinandertrennen musst. Dann folgt die zweite Zeile.u.s.w
Die Werte sind dann erst einmal Strings, die dann in Zahlen gewandelt werden müssen.

Der Vorteil ist, dass du in Form und Größe des Feldes flexibel bist und eben nicht von einer festen Form des Spielfeldes ausgehen musst. Außerdem kannst Du Änderungen am Spielfeld leicht mit einem Text-Editor durchführen.

Dazu hilft Kapitel VI

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Jul 01, 2011 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das meine ich ja... Ich mache die maps mit dem Notepad. ABer will sie halt nicht im Programm schreiben, sondern extern laden.... Aber i-wie wills nicht so.

Hihi Very Happy
Mit freundlichen Grüßen: GearTechDE
 

bjh

BeitragFr, Jul 01, 2011 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo

du könntest auch einfach ein bild mit farbstufen benutzen und dann mit readpixel immer werte zuweisen.
dann kann auch die größe der map variieren.

zuerst ermittelst du die höhe und breite des bildes und dann kannst du daraus auch dein feld dimensionieren.

wenn du doch eine datei haben willst, dann kann ich dir etwas schreiben.

ZEVS

Betreff: Maps mit Notepad?

BeitragFr, Jul 01, 2011 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Sowohl Bilder als auch Textdateien sind meiner Meinung nach gänzlich ungeeignet zum Speichern von Maps.
Probiere doch mal einen professionelleren Hex-Editor wie XVI:
Homepage
Download
Einfach das Archiv entpacken und die *.exe starten. Damit kannst du einfach die Dateien bearbeiten.
Kenntnisse im hexadezimalen Zahlensystem sind Vorraussetzung, aber die braucht man oft, sodass sich ein Lernen oft lohnt.
Hinweis: ein Int braucht immer Vier Bytes.
Noch einfacher geht es wahrscheinlich mit einem eigenen Editor. Wahrscheinlich auch schneller.

Midimaster

BeitragFr, Jul 01, 2011 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du die Maps bereits mit dem Notpad erstelltst, dann kannst du sie nicht byteweise einlesen! Sondern dann musst du sie genauso erfassen, wie ich das in dem Tutorial schildere.

leider bin ich das ganze Wochenende "on the road" und kann dir dann in dieser Zeit nicht weiterhelfen.....

Ich schaue Montag wieder rein....

ZEVS

Betreff: Tiles mit Notepad

BeitragFr, Jul 01, 2011 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du dich doch entscheiden solltest, die Maps mit dem Notepad zu schreiben, musst du dir ein Dateiformat ausdenken und konsequent einhalten. Ein Beispiel:
Code: [AUSKLAPPEN]
Breite|Höhe
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile
Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile|Tile

Die Datei sieht dan z.B. so aus:
Code: [AUSKLAPPEN]
5|5
1|1|1|1|1
1|2|1|2|1
1|1|2|1|1
1|2|1|2|1
1|1|1|1|1


Entsprechend musst du mit ReadFile, ReadLine, Instr und Mid, Left und Right die Datei verarbeiten.
Ich arbeite an einem Beispiel

edit: hier ist es:
BlitzBasic: [AUSKLAPPEN]
file = ReadFile("map.txt")
fileLine$ = ReadLine(file) ;parse die erste Zeile -> Breite und Höhe
pos = Instr(fileLine, "|")
width = Int(Left(fileLine, pos-1))
height = Int(Right(fileLine, Len(fileLine)-pos))
Dim map(height-1, width-1) ;erstelle das Dim

For y=1 To height ;lese die Werte ein
fileLine = ReadLine(file)
pos = 0
For x=1 To width
oldpos = pos ;die vorherige Position
pos = Instr(fileLine, "|", oldpos+1) ;die neue Position
map(y-1, x-1) = Int(Mid(fileLine, oldpos+1, pos-oldpos)) ;den Wert einlesen
Next
Next

For y=1 To height ;Werte ausgeben (debug)
For x=1 To width
Write map(y-1, x-1)+" "
Next
Print ""
Next

timer = CreateTimer(1) ;3 Sekunden warten (CPU-freundlich; debug)
For i=1 To 3
WaitTimer timer
Next

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group