BPS #22: Tilemap - Auswertung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Xeres

Moderator

Betreff: BPS #22: Tilemap - Auswertung

BeitragSo, Jul 22, 2012 11:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Na, wie weit seid ihr mit der Tilemap gekommen?

Das war die Aufgabe

Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern.

Diskussion
Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen.

Nächste Aufgabe
In einer Woche wird die Musterlösung nach editiert und in 2 die nächste Aufgabe eingestellt.

Viel Spaß & viel Erfolg!

Musterlösung:
BlitzBasic: [AUSKLAPPEN]
; Konstanten machen das Lesen einfacher:
Const KEY_ESC%=1, KEY_R=19, KEY_S=31, KEY_L=38
Const TileSize%=20 ;* Quadratische Tiles
Const MapSize%=7 ;* Kartengröße (0 bis 7 = 8)
Const MaxTile%=4 ;* Anzahl der Tiles im TileSet

Global gfxSize%=TileSize*10 ;* Quadratisches Fenster mit mehr als genug Platz
Graphics(gfxSize,gfxSize,0,2) ;* Übernehme Tiefe (mit 99%iger Sicherheit 32 bit) und Fenstermodus
SetBuffer(BackBuffer()) ;* Doublebuffering - wichtig!
Local FrameTimer=CreateTimer(60)
Local i%, x%, y%
Global TileSet=LoadAnimImage("tiles.png",TileSize,TileSize,0,MaxTile) ;* TileSet Global laden, damit es überall zur Verfügung steht.
Global ActivTile ;* Speichert das ausgewählte Tile
Global mh1,mx,my ;* Mausdaten

Dim map(MapSize,MapSize)
ReadMapData() ;* Karte aus Data-Block lesen


Repeat
Cls

mh1=MouseHit(1)
mx=MouseX()
my=MouseY()

DrawMap()
DrawActivTile()
DrawTileSet()

ChooseActivTile()
ChangeMap()

If KeyHit(KEY_R) Then ReadMapData()
If KeyHit(KEY_S) Then SaveMap()
If KeyHit(KEY_L) Then LoadMap()

Flip(0)
WaitTimer(FrameTimer)
Until KeyHit(KEY_ESC)
End


Function DrawMap()
Local x,y
For y=0 To MapSize
For x=0 To MapSize
DrawImage(TileSet, x*TileSize, y*TileSize, map(x,y))
Next
Next
End Function

Function DrawActivTile()

Color(200,0,0)
Rect(gfxSize-TileSize*1.6, TileSize*.4, TileSize*1.2, TileSize*1.2)
DrawImage(TileSet, gfxSize-TileSize*1.5, TileSize*.5, ActivTile)

End Function

Function DrawTileSet()
Local i
For i=0 To MaxTile-1
DrawImage(TileSet, TileSize*.5+TileSize*i, gfxSize-TileSize*1.5, i)
Next
End Function

Function ChooseActivTile()
;* Mit der schnellsten Methode entscheiden, ob die Funktion ausgeführt werden muss:
If Not(mh1) Then Return ;* Kein Mausklick, kein Grund weiter zu machen
; Position über der Tileset auswahl sicher stellen:
If mx<TileSize*.5 Or mx+1 >TileSize*.5+TileSize*MaxTile Then Return
If my<gfxSize-TileSize*1.5 Or my+1 >gfxSize-TileSize*0.5 Then Return
;* Position der Maus zurückrechnen um Tile aus zu wählen (vgl. DrawTileSet)
ActivTile = (mx-Float(TileSize))/TileSize
End Function

Function ChangeMap()
If Not(mh1) Then Return ;* Kein Mausklick, kein Grund weiter zu machen
If mx+1 > TileSize*(MapSize+1) Then Return
If my+1 > TileSize*(MapSize+1) Then Return
;* Array Koordinaten zurückrechnen:
Local x% = mx/TileSize
Local y% = my/TileSize
;* Aktives Tile einsetzen:
map(x,y)=ActivTile
End Function

Function SaveMap()
Local file=WriteFile("this.map")
Local x%, y%
For y=0 To MapSize
For x=0 To MapSize
WriteInt(file, map(x,y))
Next
Next
CloseFile(file)
End Function

Function LoadMap()
Local file=ReadFile("this.map")
If file=0 Then Return
Local x%, y%
For y=0 To MapSize
For x=0 To MapSize
map(x,y) = ReadInt(file)
Next
Next
CloseFile(file)
End Function

Function ReadMapData()
Local x%, y%
Restore MapData ;Zum Anfang des Blocks springen, um Lesefehler zu vermeiden.
For y=0 To MapSize
For x=0 To MapSize
Read map(x,y)
Next
Next
End Function

.MapData
Data 0,0,0,0,0,0,0,0
Data 0,1,1,1,1,1,0,0
Data 0,2,2,1,2,2,0,0
Data 0,0,2,1,2,0,0,0
Data 0,0,2,3,2,0,0,0
Data 0,0,2,3,2,0,0,0
Data 0,0,3,3,3,0,0,0
Data 0,0,0,0,0,0,0,0
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)
  • Zuletzt bearbeitet von Xeres am So, Aug 05, 2012 14:21, insgesamt einmal bearbeitet

Hakkai

BeitragSo, Jul 22, 2012 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Zuersteinmal habe ich mir Gedanken gemacht wie man DataSet und ArraySet gleichzeitg in einem Projekt verwendet und was man wann zeichnet. Z.B. macht es nur Sinn wenn man allein vom Map Array zeichnet. Bei der Bearbeitung des ersten Punktes hätte man wahrscheinlich zunächst versucht vom Data Set zu zeichnen.

Code: [AUSKLAPPEN]

Map Data
  |
  |-> Map Array -> Map draw, save Map
             ^
       Map change, load Map


im ganzen gibt es also bei mir diese Funktionen:
BlitzBasic: [AUSKLAPPEN]

restoreMap() ;read MapData write MapArray
readArrayMap() ;read & draw from MapArray
saveMap(dat$) ;read MapArray save to dat$
loadMap(dat$) ;load from dat$ write to MapArray
drawToMap() ;modify MapArray (da auf das MapArray immer das zeichnen folgt, wird die Map damit auch neu gezeichnet, daher auch der Funktionsname
selectTile() ;hier wird nur das selektieren der tiles animiert (das Gewählte erscheint doppelt so groß)
textNotify() ;Text-Ausgabe (R,S,L)


Die wichtigsten Funktionen im Detail:
BlitzBasic: [AUSKLAPPEN]

Function drawToMap()

;DrawImage Tileset, i2*20+offsetX, i*20+offsetY, tile
If MausX > offsetX-10 And MausX < offsetX+20*globalNX-10 And MausY > offsetY-10 And MausY < offsetY+20*globalNY-10 Then
;Mouse interacts with the drawn map
Local MouseOverMapTileX = (MausX + 10 - offsetX) / 20
Local MouseOverMapTileY = (MausY + 10 - offsetY) / 20

currPointer = 2 ;Cursor Yellow
If MausTaste1 = 1 And activeTile >= 0 Then
currPointer = 1 ;Cursor Red
arrayMap(MouseOverMapTileX, MouseOverMapTileY) = activeTile
EndIf
EndIf

End Function

Function restoreMap()

;Read MapData and write to MapArray
Restore MapData

Local i, i2, tile

For i = 0 To globalNX-1
For i2 = 0 To globalNY-1
Read tile
arrayMap(i2, i) = tile
Next
Next
initMap = 0

End Function

Function readArrayMap()

;Reads the array with the map-tile-data and draws it
Local i, i2, tile

For i = 0 To globalNX-1
For i2 = 0 To globalNY-1
tile = arrayMap(i2, i)
DrawImage Tileset, i2*20+offsetX, i*20+offsetY, tile
Next
Next

End Function

Function saveMap(dat$) ;Write to MapFile

;read from arrayMap and save to Outputfile: dat$
Local i, i2, tile
Local file = WriteFile(dat$)

For i = 0 To globalNX-1
For i2 = 0 To globalNY-1
tile = arrayMap(i2, i)
WriteInt(file, tile)
Next
Next

CloseFile file: file = 0

End Function

Function loadMap(dat$) ;Read from MapFile and Write to MapArray

Local file = ReadFile(dat$)

If file = 0 Then
msg$ = "Load-File does not exist. Save first!"
Return
Else
msg$ = ""
EndIf

Local i, i2, tile
For i = 0 To globalNX-1
For i2 = 0 To globalNY-1
arrayMap(i2, i) = ReadInt(file)
;DebugLog("arrayMap(i2, i): "+arrayMap(i2, i))
Next
Next

CloseFile file: file = 0

End Function


Ein Bildchen:
user posted image
Habe einen eigenen Cursor verwendet der in die Mitte zeigt und 3 Farben annehmen kann, Grün = keine Aktion, Gelb = Cursor ist auf einem Inhalts-Feld (Map, TileSet), Rot = Cursor über Inhaltsfeld gedrückt.

Bin nicht sicher ob es gestattet ist das gesamte Paket zu posten, wenn nicht, nehme ich es raus:
https://www.blitzforum.de/upload/file.php?id=11848

.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group