2D Map Editor

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

Midimaster

BeitragDo, Jun 23, 2011 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Umschreiben des Map-Editors auf variable Größe ist eine tolle Aufgabe zum Erlernen von richtig gutem Programmieren.

Du erkenntst gerade, dass fixe Zahlenwerte den code in seiner Flexibilität einengen. Daraus entsteht der Wunsch es nun vollkommen unabhängig zu programmieren.

Und nichts ist leicher als das! Ersetze doch alle "30" durch TileBreite%. Ana hatte dir dazu schon einen Vorschlag gemacht. Und die "26" durch MapBreite%, u.s.w

Und jetzt was zur Realisierbarkeit deines Projektes:

So geht es allen! Nimm einfach deine Ansprüche zunächst mal etwas zurück und sei mit einem einfacheren Editor und einem einfacheren Spiel zufrieden.

Es spricht auch nichts dagegen, erst mal ein Spiel zu machen, bei dem es nur "harmlose" Tiles gibt.

nimm die folgende Ziele:
1.
Jedes Tile hat eine komplett formatfüllende Eigenschaft: "nur Gras" oder "nur Mauer".
2.
Spieler oder Gegner rücken immer um ein ganzes Tile weiter, also optisch 30pix auf einmal
3.
Tile 0 ist "Rasen" und ist überall dort, wo sonst nichts anderes ist.
4.
Sammelt man etwas auf oder geht eine Türe weg, dann ist dort ab sofort 0, also "Gras"
5.
Das Spielfeld ist immer von einem komplett geschlossenem Mauerrechteck eingegrenzt.

Damit kannst du schon ganz herrliche Spiele schreiben. Und die Beschränkungen halten dir alle Probleme vom Hals, die Du sonst alle wirst lösen müssen.

Sollte dir dieses Projekt gelingen.... (...und ich weiss jetzt schon, dass du das schaffst!) ... dann kannst du ganz getrost ein komplexeres Map-basiertes Spiel in Angriff nehmen. Oder es stückweise ausbauen.

Die Leute aus dem Forum helfen ja auch immer. Du solltest aber auch mit der Forensuche nach Lösungen suchen. Da lernt man unglaublich dabei!
 

pinochino

BeitragFr, Jun 24, 2011 1:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Oouh ich hab deinen Beitrag erst jetzt gelesen ... ( Schön wenn man erkennt das es eine zweite seite gibt Smile )

Das ist eine Superidee von dir, der "Grundlegende" Mapeditor auf 32*32 Tile Basis war auch schon fertig. Danach war ich am Grübeln verschiedene Tile Größen zu Implementieren und vorallem einen "Hintergrund" (Layer1,quasi)
zu schaffen der das komplette bild mit gras.jpg füllt und bearbeitet werden kann. Very Happy

Der Jetzige Stand ist:

1 Layer - 32*32 Tile, quasi der boden mit 2 Texturen zum Bearbeiten (gras & stein)
2 Layer - 32*32 Tile, was man über dem Boden Platzieren kann 3Texturen (Kiste,Baum,eine Transparente zum löschen)
3 Layer - 128*128 Tile mit 1 Textur (einem Laden Regal xD )

Sehr Sinnig ist das ganze zwar nicht mit zusätzlichen 128er tiles und der Code ist auh irgendwie naja Very Happy

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

fps=CreateTimer(60)

Global ende=0

Global KEY_ESC=1

Global mx
Global my
Global t=1 ;landschaft
Global b=1 ;boden
Global g=1 ;128X128 IMG's
Global switch =1


HidePointer



Dim Tile(10)
Tile(1)=LoadImage("kiste.bmp")
Tile(2)=LoadImage("busch.bmp")
Tile(3)=LoadImage("delete.jpg")

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

MaskImage Tile(2), 0,0,0

Dim img_gross(10)
img_gross(1)=LoadImage("delete2.jpg")
img_gross(2)=LoadImage("laden_regal.bmp")



; "2 Karten zu 32*32 Tiles"
; Karte 1 Layer Hintergrund
Dim Hintergrund(100,100)

For x=0 To 100
For y=0 To 100
Hintergrund(x,y)=1
Next
Next

; Karte 2 Layer Landschaft
Dim karte(100,100)

For kx= 0 To 100
For ky= 0 To 100
karte(kx,ky)=3
Next
Next

; <-############################################################->

; "1 Karte zu 128*128 Tiles"

Dim obj_gross(100,100)
For ogx= 0 To 100
For ogy=0 To 100
obj_gross(ogx,ogy)=1
Next
Next

; #################################################################



Repeat
WaitTimer(fps)

For x= 0 To 100
For y= 0To 100
DrawBlock boden(Hintergrund(x,y)),x*64,y*64
Next
Next

For kx= 0 To 100
For ky= 0 To 100
DrawImage Tile(karte(kx,ky)),kx*64,ky*64
Next
Next

For ogx= 0 To 100
For ogy= 0 To 100
DrawImage img_gross(obj_gross(ogx,ogy)),ogx*128,ogy*128
Next
Next


If switch=1 Then ;wenn switch = (1) landschaft dann ->

If MouseDown(1) Then

karte(mx,my)=t

EndIf

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

DrawImage Tile(t), mx*64,my*64

Rect mx*64,my*64,64,64,0

If t=3 Then
Color 255,0,0
Rect mx*64,my*64,64,64
EndIf

If MouseX()<100*64 Then mx=MouseX()/64
If MouseY()<100*64 Then my=MouseY()/64

EndIf

If switch=2 Then ;wenn switch = (2) Boden dann ->

If MouseDown(1) Then

Hintergrund(mx,my)=b

EndIf

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

DrawBlock boden(b), mx*64,my*64

Rect mx*64,my*64,64,64,0

If MouseX()<100*64 Then mx=MouseX()/64
If MouseY()<100*64 Then my=MouseY()/64

EndIf

If switch=3 Then ;wenn switch = (3) obj_gross(128) dann ->

If MouseDown(1) Then

obj_gross(mx,my)=g

EndIf

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

DrawImage img_gross(g), mx*128,my*128

Rect mx*128,my*128,128,128,0

If MouseX()<100*128 Then mx=MouseX()/128
If MouseY()<100*128 Then my=MouseY()/128

EndIf

If MouseHit(2) Then switch=switch+1
If switch=4 Then switch=1

Color 255,255,255
Text 50,50, "Modus: "+switch




If KeyHit(KEY_ESC) Then ende=1

Flip 0
Cls
Until ende=1
End


lg

Ana

BeitragFr, Jun 24, 2011 3:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst Arrays/Dim Felder auch aus anderen Sachen als Integern machen. Du kannst z.B. einen Type verwenden und so einfacher oder zumindest bequemer an die sachen herkommen. Ich weiß leider nicht wie es um deinen Wissenstand um Types steht. Falls dir das noch gar nichts sagt, dann eventuell erstmal damit beschäftigen oder einen Bogen drum herum machen ansonsten ungefähr so (Ich bin mir bei der BB Dim Syntax unsicher...)


BlitzBasic: [AUSKLAPPEN]
Dim Map.Feld(29,29)

Type Feld
Field x
Field y
Field image
Field image2
Field isanimation
Field Begebbar
;und was du sonst halt noch brauchen könntest
End Type

Function DrawFeld(f.feld)
DrawImage f\image,f\x,f\y
DrawImage f\image2,f\x,f\y
End Function

For i = 0 To 29
For j = 0 To 29
DrawFeld(map(i,j))
Next
Next
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Midimaster

BeitragFr, Jun 24, 2011 8:29
Antworten mit Zitat
Benutzer-Profile anzeigen
nun verstehe ich dich nicht... wenn du schon nicht zufrieden bist mit dem code, warum änderst du es dann nicht?

folgender Verbesserungsvorschlag:

Ich denke mal, deine "DELETE"-Bilder sollen volltransparente Platzhalter sein für den Fall, dass in dieser Ebene gar nicht an einer Stelle gemalt werden soll?

Dann verwende für alle 3 Ebenen den gleichen Wert, z.b. "0" dafür. Wenn es nun ans Zeichnen geht, fragst Du den Map(x,y)-Wert an dieser Stelle ab und zeichnest gar nix. Das spart Leistung:

BlitzBasic: [AUSKLAPPEN]
	For kx= 0 To 100
For ky= 0 To 100
If Karte(kx,ky) >0 Then
DrawImage Tile(karte(kx,ky)),kx*64,ky*64
EndIf
Next
Next

Das Tile(3) wird zu Tile(0):
BlitzBasic: [AUSKLAPPEN]

Dim Tile(10)
Tile(1)=LoadImage("kiste.bmp")
Tile(2)=LoadImage("busch.bmp")
Tile(0)=LoadImage("delete.jpg")

Allerdings sollte für alle 3 Ebenen ein entsprechendes DELETE-Bild existieren, das z.b. eine rotes X zeigt.

In den "Switch"-Blöcken ändert sich folgendes:
BlitzBasic: [AUSKLAPPEN]
	If switch=1 Then ;wenn switch = (1) landschaft dann ->	
If MouseDown(1) Then
karte(mx,my)=t
EndIf
If KeyHit(57) Then t=t+1
If t=3 Then t=0
DrawImage Tile(t), mx*64,my*64
Rect mx*64,my*64,64,64,0
EndIf


So und jetzt noch was zum "schlechten Stil":


Unnötige Zeilen:
BlitzBasic: [AUSKLAPPEN]
				If MouseX()<100*128 Then mx=MouseX()/128
If MouseY()<100*128 Then my=MouseY()/128

Die IF-Zeilen sind jetzt Unsinn. MouseX() kann nie größer als 12800 sein!


BlitzBasic: [AUSKLAPPEN]
	For x=0 To 100
For y=0 To 100
Hintergrund(x,y)=1
Next
Next
...
For kx= 0 To 100
For ky= 0 To 100
karte(kx,ky)=0
Next
Next
...



Unnötige Variablennamen

Du kannst für beide Schleifen x als Variablennamen verwenden. kx ist nicht nötig. Es geht sogar so:
BlitzBasic: [AUSKLAPPEN]
; Karte 1 Layer Hintergrund	
Dim Hintergrund(100,100) , karte(100,100) , obj_gross(100,100)

For x=0 To 100
For y=0 To 100
Hintergrund(x,y)=1
karte(kx,ky)=3
obj_gross(ogx,ogy)=1
Next
Next




Unnötiges Zeichnen

Du malst alle 10.000 Tiles, obwohl die meisten nicht im Bereich des Bildschirm sind. Besser du fragst ab, ob ein Map-Wert überhaupt sichtbar wäre:
BlitzBasic: [AUSKLAPPEN]
	For kx= 0 To 100
If kx*64 < xMax
For ky= 0 To 100
If ky*64 < yMax
If Karte(kx,ky) >0 Then
DrawImage Tile(karte(kx,ky)),kx*64,ky*64
EndIf
EndIf
Next
EndIf
Next
 

pinochino

Betreff: Versuch 2

BeitragFr, Jul 01, 2011 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
So Ich habe den Editor nochmal geschrieben & eine Speichermöglichkeit eingebaut.

BlitzBasic: [AUSKLAPPEN]
;Zombie Shooter - UNNAMED!2D
;Der Level-Editor
;Tiles Setzen und Karte Speichern.

; ELEMENTE DER MAP - WIESE - MAUER - STARTPUNKT - ZIELPUNKT

Const xmax=800, ymax=600
Graphics xmax,ymax,32,2
SetBuffer BackBuffer()

FPS=CreateTimer(60)

;Globale Variablen

Global KEY_ESC=1, KEY_SPACE=57, KEY_S=31

Global mx
Global my

Global MapX=xmax/32
Global MapY=ymax/32

Global B=0



Dim Map(MapX,MapY)

;Bilder Laden
Dim Bild(10)

Bild(0)=LoadImage("gfx\Wiese.jpg")
Bild(1)=LoadImage("gfx\Mauer2.jpg")
;Bild(2)=LoadImage("gfx\Start.jpg")
;Bild(3)=LoadImage("gfx\Ziel.jpg")


;"WIESE" auf allen Map-Feldern

For x = 0 To MapX
For y = 0 To MapY

map(x,y)=0

Next
Next




; MAIN-SCHLEIFE

Repeat
WaitTimer(FPS)

If KeyHit(KEY_ESC) Then Ende=1

For x = 0 To MapX
For y = 0 To MapY

DrawBlock Bild(map(x,y)),x*32,y*32

Next
Next

If KeyHit(KEY_SPACE) Then B=B+1
If B=2 Then B=0

mx=MouseX()/32
my=MouseY()/32

DrawBlock Bild(b),mx*32,my*32
Rect mx*32, my*32,32,32,0

If MouseDown(1) Then

map(mx,my)=B

EndIf

;Speichern
If KeyHit(KEY_S) Then

Datei_Map=WriteFile("Level_1.map")

WriteInt Datei_Map, MapX
WriteInt Datei_Map, MapY

For x = 0 To MapX
For y = 0 To MapY

WriteInt Datei_Map, map(x,y)

Next
Next


CloseFile(Datei_Map)

EndIf




Flip 0
Cls
Until Ende=1
End


Die Frage ist jetzt Funktioniert das so richtig?
Also die .map Datei wird gespeichert.

Nur das mit dem Auslesen der .map müsstet ihr mir nochmal verklickern.

Ich hab es mir So gedacht:

BlitzBasic: [AUSKLAPPEN]
	; bilder laden wie im Editor 

;Map Laden:

Datei_Map=ReadFile("Level_1.map")

For x = 0 To MapX
For y = 0 To MapY

map(x,y)=ReadInt(Datei_Map)

Next
Next

CloseFile(Datei_Map)


;Hauptprogramm
Repeat

;Zeichnen

For x = 0 To MapX
For y = 0 To Mapy

DrawBlock Bild(map(x,y)),x*32,y*32

Next
Next

Until KeyHit(1)


Advice Please!

lg

Xeres

Moderator

BeitragFr, Jul 01, 2011 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du MapX & MapY Speicherst, musst du sie auch wieder einlesen! Schon allein, weil die Lese-Position um 8 byte (=2 Int) verschoben 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)
 

pinochino

BeitragFr, Jul 01, 2011 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
	Datei_Map=ReadFile("Level_1.map")

MapX=ReadInt(Datei_Map)
MapY=ReadInt(Datei_Map)

For x = 0 To MapX
For y = 0 To MapY

map(x,y)=ReadInt(Datei_Map)

Next
Next

CloseFile(Datei_Map)


Meintest du das so ? habe ja jetzt MapX & MapY wieder Eingelesen! ^^ Embarassed


lg

Xeres

Moderator

BeitragFr, Jul 01, 2011 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Yupp, so geht's! Aber du musst noch die Array größe anpassen, sonst ist entweder das Array zu klein -> Error(kein platz um alles ein zu lesen) oder zu groß -> Error(So viele Daten stehen nicht mehr in der Datei).
Nochmal Dim benutzen, nachdem du die größe ausgelesen hast.
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)
 

pinochino

BeitragFr, Jul 01, 2011 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Also Einfach das Map-Array Dimensionieren

BlitzBasic: [AUSKLAPPEN]
	; bilder laden wie im Editor 

;Map Laden:

Datei_Map=ReadFile("Level_1.map")

MapX=ReadInt(Datei_Map)
MapY=ReadInt(Datei_Map)

For x = 0 To MapX
For y = 0 To MapY

map(x,y)=ReadInt(Datei_Map)

Next
Next

CloseFile(Datei_Map)

; map Dimensionieren :D
Dim map(MapX,MapY)


;Hauptprogramm
Repeat

;Zeichnen

For x = 0 To MapX
For y = 0 To Mapy

DrawBlock Bild(map(x,y)),x*32,y*32

Next
Next

Until KeyHit(1)


Danek schonmal für deine Hilfe Wink

Wird hoffentlich funktionieren! Very Happy

lg

Xeres

Moderator

BeitragFr, Jul 01, 2011 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, fast ^^
BlitzBasic: [AUSKLAPPEN]
MapX=ReadInt(Datei_Map)
MapY=ReadInt(Datei_Map)

Dim map(MapX,MapY) ;<--- DA!

For x = 0 To MapX

Wenn du die Kartengröße anpasst bevor du sie füllst, hast du mehr davon. Wink
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)
 

pinochino

BeitragFr, Jul 01, 2011 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Haha ... Laughing

Du hast Recht Wink

Ich geh mich Schämen Very Happy

EDIT:Code: [AUSKLAPPEN]
Funktioniert ;)


Danke

lg
 

pinochino

BeitragDi, Jul 05, 2011 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
So Der Editor Läuft soweit und ich hab mich an die Anfänge der Bewegung des Spielers auf der Erstellten Map Gemacht. Soweit Funktioniert auch alles!(Kollision,Bewegung)

Jedoch bewegt sich der "Spieler" viel zu Schnell über die Map und eine Lösung konnte ich noch nicht Finden.

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

FPS=CreateTimer(59)

;Bilder Laden
Dim Bild(10)

Bild(0)=LoadImage("gfx\Wiese.jpg")
Bild(1)=LoadImage("gfx\Mauer2.jpg")
Bild(2)=LoadImage("gfx\Start.jpg")
Bild(3)=LoadImage("gfx\Ziel.jpg")
Bild(4)=LoadImage("gfx\Player.jpg")




;Map Laden:

Datei_Map=ReadFile("Level_1.map")

MapX=ReadInt(Datei_Map)
MapY=ReadInt(Datei_Map)

Dim map(MapX,MapY)

For x = 0 To MapX
For y = 0 To MapY

map(x,y)=ReadInt(Datei_Map)

Next
Next

CloseFile(Datei_Map)

Const KEY_LEFT=203, KEY_RIGHT=205, KEY_DOWN=208, KEY_UP=200

Global P_X#=(xmax/32)-23, P_Y#=(ymax/32)-17, P_S#=1







;Hauptprogramm
Repeat
WaitTimer(FPS)

;Zeichnen

For x = 0 To MapX
For y = 0 To Mapy

DrawBlock Bild(map(x,y)),x*32,y*32

Next
Next

;Spieler, Bewegung etc.



DrawImage Bild(4), P_X*32,P_Y*32



If KeyDown(KEY_LEFT) And map(P_X-P_S,P_Y)<>1 Then P_X=P_X-P_S
If KeyDown(KEY_RIGHT) And map(P_X+P_S,P_Y)<>1 Then P_X=P_X+P_S
If KeyDown(KEY_DOWN) And map(P_X,P_Y+P_S)<>1 Then P_Y=P_Y+P_S
If KeyDown(KEY_UP) And map(P_X,P_Y-P_S)<>1 Then P_Y=P_Y-P_S






Flip 0
Cls

Until KeyHit(1)
End


lg

Midimaster

BeitragDi, Jul 05, 2011 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Spieler bewegt sich ja immer 1 Feld, also 32 Pixel vorwärts.

Hier gibt es nun 2 Möglichkeiten:

Die Tastatur wird nur alle 500msec abgefragt, dadurch bewegt sich der Spieler seltener:

BlitzBasic: [AUSKLAPPEN]
			DrawImage Bild(4), P_X*32,P_Y*32

If MovingTimer<MilliSecs() Then
MovingTimer = MilliSecs()+500
If KeyDown(KEY_LEFT) And map(P_X-P_S,P_Y)<>1 Then P_X=P_X-P_S
If KeyDown(KEY_RIGHT) And map(P_X+P_S,P_Y)<>1 Then P_X=P_X+P_S
If KeyDown(KEY_DOWN) And map(P_X,P_Y+P_S)<>1 Then P_Y=P_Y+P_S
If KeyDown(KEY_UP) And map(P_X,P_Y-P_S)<>1 Then P_Y=P_Y-P_S

EndIf



oder ein weiches "Rutschen" des Spielers:

(Code habe ich nicht getestet)
BlitzBasic: [AUSKLAPPEN]
			DrawImage Bild(4), P_X*32+P_S_X , P_Y*32+P_S_Y

;If MovingTimer<Millisecs() Then
; MovingTimer=Millisecs()+15
If MovingAction=0 Then
If KeyDown(KEY_LEFT) And map(P_X-1,P_Y)<>1 Then MovingAction=1
If KeyDown(KEY_RIGHT) And map(P_X+1,P_Y)<>1 Then MovingAction=2
If KeyDown(KEY_DOWN) And map(P_X,P_Y+1)<>1 Then MovingAction=4
If KeyDown(KEY_UP) And map(P_X,P_Y-1)<>1 Then MovingAction=8
MovingCounter=0
ElseIf MovingCounter< 32
MovingCounter = MovingCounter +1
Select MovingAction
Case 1
P_S_X = P_S_X-1
Case 2
P_S_X = P_S_X+1
Case 4
P_S_Y = P_S_Y+1
Case 8
P_S_Y = P_S_Y-1
End Select
ElseIf MovingCounter=32
P_X = P_X + P_S_X/32
P_Y = P_Y + P_S_Y/32
MovingCounter=0
MovingAction=0
P_S_Y=0
P_S_X=0
EndIf
;Endif


Die 32 Pixel werden nicht auf einmal zur aktuellen Position dazugezählt, sondern einzeln. Dadurch rutscht die Figur in die neue Position.

Die Variable MovingAction gibt an, ob derzeit eine solche "Rutschaktion" schon läuft und in welche Richtung sie geht. Und MovingCounter zählt die 32 Schritte. Bei jedem Schritt wird ein Additionswert P_S_X um eins vergrößert und wenn der Zähler 32 erreicht, wird endlich auch P_X verändert. Erst dann kann die Tastaturabfrage wieder greifen.

Es kann durchaus sein, dass auch hier die Bewegung durch einen zusätzlichen Timer gebremst werden muss. (als REM-Zeile bereits eingeplant)

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group