2D Map Editor

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

pinochino

Betreff: 2D Map Editor

BeitragDo, Jun 23, 2011 3:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Community,

Ich möchte mir für Testzwecke einen kleinen MapEditor schreiben, doch scheitere ich scheinbar schon am einfachsten.

Der Code ist quasi grad begonnen und schon macht er nicht was er soll. Very Happy
Erstmal sollen nur alle Felder mit dem Stein.jpg belegt werden.

Code: [AUSKLAPPEN]
Const xmax=800, ymax=600
Graphics xmax,ymax,16,2

fps=CreateTimer(60)

Global KEY_ESC=1




Dim texture(2)
texture(1)=LoadImage("gras.jpg")
texture(2)=LoadImage("stein.jpg")

Dim map(30,30)

For x=0To 30
For y=0To 30
map(x,y)=texture(2)
Next
Next


Repeat
WaitTimer(fps)


For y=0 To 30
For x=0 To 30
DrawImage texture(map(x,y)),178,172
Next
Next




;zum Beenden des Programms, ESC
If KeyHit(KEY_ESC) Then game_end=1

Flip 0
Cls
Until game_end=1
End


Satz mit X!

Bitte freundlichst um Hilfestellungen!

grüße
pinO

Xeres

Moderator

BeitragDo, Jun 23, 2011 3:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Fehlermeldung, Zeile, was passiert statt dessen?
Was auffällt:
map(x,y)=texture(2) - map enthält damit das Handle (Referenz) zu einem Bild, also muss es auch DrawImage map(x,y) heißen. Das Textur-Array würde nur Sinn machen wenn es map(x,y)=2 hieße.

Und dann zeichnest du die Bilder knapp tausend mal auf einer Stelle übereinander; x und y aus den Schleifen müssen schon bei Drawimage verwendet werden.

Mit einer anderen Grafiktiefe als 32 bit wäre ich auch vorsichtig; kann sein, das Transparenzen damit nicht dar gestellt werden können und 32 bit sollten auch Standard sein.

Für die Zukunft: Code Einrücken & exakte Fehlerbeschreibung. Danke.
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

Betreff: Re: 2D Map Editor

BeitragDo, Jun 23, 2011 3:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Dim texture(2)
texture(1)=LoadImage("gras.jpg")
texture(2)=LoadImage("stein.jpg")


Hier liegen also nun die Images auf texture(1) und texture(2), die Dims waren irgendwie komisch gemacht bei BB aber du kannst davon ausgehen das es aufjedenfall auch ein, jetzt ungenutztes texture(0) gibt. Glaube bei Dim - Feldern werden mit Dim x(2) die Felder 0 1 und 2 angelegt.

Code: [AUSKLAPPEN]

Dim map(30,30)


Also hier eine 31x31 Map, ist okay

Code: [AUSKLAPPEN]

For x=0To 30
For y=0To 30
map(x,y)=texture(2)
Next
Next


Nun weißt du jedem feld ein Image zu, das kannst du also auch benutzen

Code: [AUSKLAPPEN]

For y=0 To 30
For x=0 To 30
DrawImage texture(map(x,y)),178,172
Next
Next


Was du hier aber nicht machst, du kannst es einfach wie ein Image behandeln, nur das es halt einen index erwartet. Desweiteren würden alle Images auf einen Punkt gezeichnet werden, denke mal du meinst das mehr so:

Code: [AUSKLAPPEN]

Global IWidth = imagewidth(map(0,0)); Nur damit man nicht immer die größe des Bildes bestimmen muss...
Global Iheight = imageheight((map(0,0));... weil deine Tiles ja sicherlich gleich groß sind.

For y = 0 to 30
   for x = 0 to 30
      Drawimage map(x,y),X_koordinate + x * IWidth  ,Y_koordinate + y * Iheight
   next
next


Die Variablen X/Y_koordinate geben den Punkt an, von dem aus die Map angefangen werden soll, und x/y die Position in der Reihenfolge, und Iwidth/height wie breit dein image ist.

Du kannst also map, ganz normal als Variable benutzen, alternativ könntest du auch den Wert 1 oder 2 in Map speichern und dann
Code: [AUSKLAPPEN]

Drawimage texture(map(x,y))

verwenden, allerdings hast du dich hier für einen Mittelweg entschieden, der leider nicht sinnvoll ist.
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Midimaster

BeitragDo, Jun 23, 2011 7:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Vorneweg schon mal einige Bitten für das Einstellen von Texten ins Forum:

1. richtige Code-Boxen

Verwende bitte zum Einfügen hier im Forum nicht den Code-Tag sondern den [BB]-Tag (siehe rechts oben im Antworten-Editor.

statt:
Code: [AUSKLAPPEN]
Dim texture(2)
texture(1)=LoadImage("gras.jpg")
texture(2)=LoadImage("stein.jpg")

Dim map(30,30)

For x=0To 30
For y=0To 30
map(x,y)=texture(2)
Next
Next


lieber:
BlitzBasic: [AUSKLAPPEN]
Dim texture(2)
texture(1) = LoadImage("gras.jpg")
texture(2) = LoadImage("stein.jpg")

Dim map(30,30)

For x = 0 To 30
For y = 0 To 30
map(x,y) = texture(2)
Next
Next




2. Bitte einrücken

Bei IF , FOR , SELECT , FUNCTION , WHILE , ...
gehört der Code immer einen TAB tiefer eingerückt. Gewöhne Dir das gleich in BB an. Dann sind Zeilen, die hier ins Forum kopierst auch gleich richtig eingerückt. Notfalls musst du die Zeilen im Forum per SPACE-Taste einrücken. 1TAB=4SPACE.



jetzt zu deinem Code

Die DIMs bitte immer eine Nummer größer als Du sie brauchst. Das wären bei deinen Texturen
BlitzBasic: [AUSKLAPPEN]
Dim Texture(3)

und bei deinen Maps
BlitzBasic: [AUSKLAPPEN]
Dim Map( 31 , 31 )

Also, normalerweise speichert man in der Map nicht die Bilder....
BlitzBasic: [AUSKLAPPEN]
map(x,y) = texture(2) 


sondern die Nummer unter der das Bild zu finden ist:
BlitzBasic: [AUSKLAPPEN]
map(x,y) = 2 


Das Malen erfolgt dann aus einer Kombination von beidem:

BlitzBasic: [AUSKLAPPEN]
DrawImage Texture( Map(x,y) ) , x*32 , y*32



Tutorial zum Map-Editor

In meinem Datei-Lesen-Tutorial gibt es ein Kapitel IV, dass dich in diesem Zusammenhang interessieren dürfte: https://www.blitzforum.de/foru...hp?t=33651

Xeres

Moderator

BeitragDo, Jun 23, 2011 7:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
Die DIMs bitte immer eine Nummer größer als Du sie brauchst.
...warum?
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)

Midimaster

BeitragDo, Jun 23, 2011 8:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Rolling Eyes
weil du so einem BB-Neuling nicht großartig erklären musst, warum er wenn er nur bis Texture(2) verwendet unbedingt DIM Texture(3) schreiben sollte. Bei BB wäre dies nicht nötig...

..., aber bei allen anderen Programmiersprachen läuft das so. Also soll er sich es jetzt angewöhnen ohne dass er großartig verstehen muss, warum....

Mad
Man kann auch gleich Dim Texture(100) schreiben und verliert dabei nur 0.0004 MB Ram! Spart sich aber eine Menge Fehlersucherei, wenn man die 3.Texture anlegt

Holzchopf

Meisterpacker

BeitragDo, Jun 23, 2011 8:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist ziemlich genau umgekehrt: In BB gibt man bei Dims eben nicht die Grösse an, sondern den End-Index.

Mit BlitzBasic: [AUSKLAPPEN]
Dim texture(2)
hat man also ein Array mit 3 Feldern: 0, 1 und 2.

Midimaster hat Folgendes geschrieben:
weil du so einem BB-Neuling nicht großartig erklären musst, warum er wenn er nur bis Texture(2) verwendet unbedingt DIM Texture(3) schreiben sollte. Bei BB wäre dies nicht nötig...
Die beiden Sätze verstehe ich jetzt nicht ganz. Kann es sein, dass du irgendwo BB mit BMax vertauscht hast?

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Xeres

Moderator

BeitragDo, Jun 23, 2011 9:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Dem kann ich nicht zustimmen.
Wer in BlitzBasic programmiert, sollte lernen, was die Eigenheiten der Sprache sind, nicht was sie nicht sind. Wer sich Hokus-Pokus Lösungen (keine Ahnung was passiert, funktioniert aber irgendwie) à la alle Arrays einfach mal mit 100 initialisieren aneignet, verliert auf lange Sicht.
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)

Midimaster

BeitragDo, Jun 23, 2011 9:18
Antworten mit Zitat
Benutzer-Profile anzeigen
@Holzchopf
ich meinte das in Bezug auf alle anderen Programmiersprachen. In BB ist es nicht nötig, aber eben nur in BB.
Und auch da wäre ja kein "Fehler", das Feld zu groß zu dimensionieren. Oder hat das irgendwelche Nachteile?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jun 23, 2011 9:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
...

Also, normalerweise speichert man in der Map nicht die Bilder....
BlitzBasic: [AUSKLAPPEN]
map(x,y) = texture(2) 

sondern die Nummer unter der das Bild zu finden ist:
BlitzBasic: [AUSKLAPPEN]
map(x,y) = 2 
...


Ist in diesem Fall nicht richtig, da hier keine Tiles ausgesondert, sondern die einzelne Bilder geladen werden, werden eben dessen Handles und nicht die nicht vorhandenen Frame-Indizes benötigt.

Ein Tilessystem aus einem geladenem Bild dessen Einzelbilder auszusondern halte ich jedoch auch für besser.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

BladeRunner

Moderator

BeitragDo, Jun 23, 2011 10:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Und auch da wäre ja kein "Fehler", das Feld zu groß zu dimensionieren.

Es wäre dennoch verschenderischer Umgang UND nicht wirklich korrekt, und antrainierte Fehler sind schwer zu entfernen. Es ist doch durchaus möglich zu erklären dass es bei 0 beginnt, und in diesem Fall hätte der Fragesteller sogar mit einem kleineren Dim noch arbeiten können- es wäre also sogar richtig 'falsch'.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Ana

BeitragDo, Jun 23, 2011 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Pinochino,

Bevor sich die "großen Jungs" sich hier in idealistischen und programmierpädagogischen Diskussion verlaufen, ist deine Frage ausreichend beantwortet?
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
 

pinochino

BeitragDo, Jun 23, 2011 14:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Jaaa,

erstmal Danke an alle beteiligten.

Ich werde jetzt noch ein wenig Tüfteln und mich bei bedarf wieder melden! Very Happy

lg


EDIT: Habe das ganze jetzt soweit hinbekommen das der bildschirm mit dem Bild gras.jpg ausgefüllt wird,
allerdings flackert der screen jetzt arg.

BlitzBasic: [AUSKLAPPEN]
Const xmax=800, ymax=600
Graphics xmax,ymax,32,2

fps=CreateTimer(60)

Global KEY_ESC=1




Dim texture(2)
texture(1)=LoadImage("gras.jpg")
texture(2)=LoadImage("stein.jpg")

Dim map(29,29)

For x=0To 28
For y=0To 28
map(x,y)= 1
Next
Next




Repeat
Cls
WaitTimer(fps)


For y=0 To 26
For x=0 To 26
DrawImage texture(map(x,y)),x*30,y*30
Next
Next




;zum Beenden des Programms, ESC
If KeyHit(KEY_ESC) Then game_end=1

Flip 0
Until game_end=1
End

Eingeproggt

BeitragDo, Jun 23, 2011 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
SetBuffer BackBuffer() ;fehlt am Anfang nach Graphics


Außerdem würd ich statt DrawImage zu DrawBlock raten bei den "Boden-Tiles". Nur eine kleine Verbesserung am Rande, ist nicht notwendig aber früher oder später hilft es, die Performance zu steigern.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

pinochino

BeitragDo, Jun 23, 2011 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würd grad am liebsten im Boden versinken...

Embarassed Embarassed

wie unangenehm peinlich ....

danke Very Happy

Midimaster

BeitragDo, Jun 23, 2011 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
ändere mal die Reihenfolge des Zeichnens:

BlitzBasic: [AUSKLAPPEN]
fps=30
Repeat
If KeyHit(KEY_ESC) Then game_end=1
Cls
For y=0 To 26
For x=0 To 26
DrawImage texture(map(x,y)),x*30,y*30
Next
Next
Flip 0
WaitTimer(fps)
Until game_end=1


Und wenn das nix hilft, dann so:
BlitzBasic: [AUSKLAPPEN]
Repeat
If KeyHit(KEY_ESC) Then game_end=1
If NeuMalenZeit<MilliSecs()
Cls
For y=0 To 26
For x=0 To 26
DrawImage texture(map(x,y)),x*30,y*30
Next
Next
Flip 0
NeuMalenZeit=MilliSecs() + 150
EndIf
WaitTimer(fps)
Until game_end=1


Das ist meine Variante, es schont die Grafikkarte und CPU und spart Strom, wenn eigentlich nichts neues zu malen ist. Alle 150msec wird der Bildschirm neu gezeichnet für den Fall, das mal ein anderes Windows- Fenster über das Spiel gezogen wurde. Wenn der User im Map-Editor etwas gestaltet, kannst Du das sofortige Neumalen erzwingen, indem Du NeuMalenZeit auf 0 setzt.

[syntax="bb"]BlitzBasic: [AUSKLAPPEN]
Repeat
If KeyHit(2) ; eine "1" wird gedrückt
Map(5,5)=2
NeuMalenZeit=0
EndIf
If KeyHit(KEY_ESC) Then game_end=1
If NeuMalenZeit<MilliSecs()
......
 

pinochino

BeitragDo, Jun 23, 2011 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir eine Tileset.bmp Heruntergeladen mit Pflanzen/Büschen. diese sind jetzt alle auf einem Großen Bild.
Muss ich vor dem Benutzen jedes einzelne Bild(objekt) ausschneiden welches ich einfügen will ?

Hier ist diese Tile.bmp, damit ihr sie euch mal ensehen könnt. Very Happy
https://www.blitzforum.de/upload/file.php?id=10768

Mein Mini-Editor Funktioniert jetzt soweit nur speichern/laden ist noch nicht eingebaut.

BlitzBasic: [AUSKLAPPEN]
Const xmax=800, ymax=600
Graphics xmax,ymax,32,2
SetBuffer BackBuffer()

fps=CreateTimer(60)

Global KEY_ESC=1
Global t=1
Global mx
Global my


HidePointer


Dim texture(2)
texture(1)=LoadImage("gras.jpg")
texture(2)=LoadImage("stein.jpg")

Dim map(29,29)

For x=0To 28
For y=0To 28
map(x,y)= 1
Next
Next




Repeat
Cls
WaitTimer(fps)


For y=0 To 26
For x=0 To 26
DrawBlock texture(map(x,y)),x*30,y*30
Next
Next

DrawBlock texture(t),mx*30,my*30

Rect mx*30,my*30,30,30,0

If KeyHit(57) Then t=t+1
If t=3 Then t=1

If MouseDown(1) Then
map(mx,my)=t
EndIf

If MouseX()<28*30 Then mx=MouseX()/30
If MouseY()<28*30 Then my=MouseY()/30


;zum Beenden des Programms, ESC
If KeyHit(KEY_ESC) Then game_end=1

Flip 0
Until game_end=1
End

Midimaster

BeitragDo, Jun 23, 2011 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Da du ja schon DrawBlock verwendest, ist das Einbauen eines TileSets nur noch ein kleiner Schritt.

Wenn das TileSet aus vielen gleich großen Mini-Bildern zusammengesetzt ist, kannst du es mit..
BlitzBasic: [AUSKLAPPEN]
Bilder = LoadAnimImage(Datei$ , 30, 30, 0 , Anzahl , 2)

...in eine Variable Bilder laden und dann mit ...
BlitzBasic: [AUSKLAPPEN]
DrawBlock Bilder , X*30 , Y*30 , Map(X,Y)

...direkt einzelne Teilbilder daraus Malen. BB kümmert sich um den jeweils richtigen Ausschnitt.

Die Nummerierung der Teilbilder läuft so:

Zitat:
erste Reihe: 1 , 2 , 3 , .... , 8
zweite Reihe: 9, 10 ,11 , ....
dritte Reihe: 17, 18, ....
.....


wenn z.b. im TileSet 8 Bilder in einer Zeile stehen
 

pinochino

BeitragDo, Jun 23, 2011 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann ich den Mapeditor auf verschiedene Größen auslegen? (30*30,64*32, 64*64 ....)

DrawBlock muss wohl wieder raus wegn Transparenz. Shocked
Dann hab ich Überlegt Iso-Tiles (oder wie sich das nennt) zu verwenden weil der "Look" viel schöner ist.

Ich glaube ich habe noch zu wenige Grundkenntnisse um das alles zu realisieren. Confused

@Midimaster

Hast du zu deinen Tutorials vllt sowas wie "Übungsaufgaben" um das Verständnins zu "Testen"?


lg
 

PhillipK

BeitragDo, Jun 23, 2011 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo pinochino!

Soweit ich weiß, ist es nicht möglich, verschieden-artige Kacheln aus einem Bild zu extrahieren.
BlitzBasic: [AUSKLAPPEN]
Bilder = LoadAnimImage(Datei$ , 30, 30, 0 , Anzahl , 2)


Das ist der Befehl, wie Midimaster bereits geschrieben hat, um ein Bild mit mehreren Frames zu laden!
Meines Wissens nach musst du für jede einzigartige Kachelbreite das bild neu laden, bzw in anderen variablen speichern.
Hierzu ist dann anzuraten, das du dir deine Tiles auf mehrere Bilder auslagerst.

Der Befehl 'LoadAnimImage' erwartet folgende Parameter:

Ordner+Datei$, Breite, Höhe, Erstes Bild, Anzahl und Modus

Ordner+Datei ist zb "Grafiken\Tileset.png".
Breite und höhe meint deine gewünschte KACHELBREITE.
Erstes Bild ist der index, welches dein erstes zu ladendes Bild enthält und Anzahl ist eben die Anzahl. Mit dem Modus habe ich nicht viel rumexperimentiert, dazu kann ich leider nicht viel sagen.

Der Index wird von oben links nach unten rechts durchgezählt. Also wenn dein Bild zb 5x 10 Tiles enthält, ist Index = 10 das erste Bild, der 2ten Reihe von oben^^ Wichtig ist, das hier die Zählung bei null beginnt.

Nun, deswegen würde ich anraten, deine Kacheln in unterschiedliche Bilder auszulagern. So kannst du immer bei 0 beginnen (Als index) und die gewünschte anzahl einfach abzählen.
Ausserdem, nicht vergessen, die Bilder in entsprechende Variablen packen!
  • Zuletzt bearbeitet von PhillipK am Do, Jun 23, 2011 19:47, insgesamt einmal bearbeitet

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group