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

M0rgenstern

Frischling

  • »M0rgenstern« ist der Autor dieses Themas

Beiträge: 9

Beruf: Schüler

  • Private Nachricht senden

1

06.04.2010, 15:22

Tilemap --> Verständnis des Systems dahinter

Guten Tag zusammen.
Vorneweg: Ich bin neu hier und dies ist mein erster Beitrag in diesem Forum.

Also, ich hab ein relativ großes Problem mit Tilemaps. Ich habe auch schon die Forensuche probiert, aber ich finde nirgendwo was passendes.
Undzwar ist mein Problem folgendes: Ich steige durch das System der Tilemaps nicht ganz durch. Also, ich beherrsche es schon mit Arrays umzugehen und die Positionen der einzelnen Tiles zu berechnen ist auch kein Problem, auch bei mehreren Layern einfach drei For-Schleifen zu verschachteln.
Meine Probleme fangen an, wenn es um folgende Dinge geht: Scrolling der Map, Bewegen auf der Map und vor allem, grade wegen einem Editor, eine Abhängigkeit von den Mauskoordinaten und den Tiles herzustellen.
Um das ganze mal näher zu erläutern:
Ich bin dabei einen Mapeditor für ein etwas größeres Projekt zu schreiben. Da ich aber das ganze Projekt in einer neuen Sprache umschreibe bin ich noch nicht sehr weit mit dem Editor.
Bisher habe ich es so weit, dass das Arrays erstmal zufällig mit Werten gefüllt wird und angezeigt wird.
Ich habe mich auch schon durch einige Tutorials durchgewühlt, aber ich steig durch das System nicht richtig durch. Wie ich das Scrolling umsetzen muss weiß ich nicht. Und wenn ich Tiles mit der Maus verändern will weiß ich auch nciht wie ich das machen sollte.
Ich weiß, dass ich die Mauskoordinaten in Abhängigkeit zu denen Der Map umrechnen müsste, aber ich weiß einfach nicht wie das umzusetzen wäre.

Mein Anliegen wäre einfach, dass jemand vielleicht versucht mir das ein wenig näher zu bringen.
Wäre echt toll wenn das jemand erklären könnte.

Achso, bevor ichs vergesse: Ich habe gesehen, dass das Forum hier eher auf C-Dialekte, Java und Delphi ausgelegt ist.
Ich programmiere aber in Basic-Dialekten (im Moment BlitzMax, das ist auch objektorientiert).
Aber ich denke, dass das kein großes Problem ist. Die Tutorials die ich mir angeschaut habe, waren auch in C-Dialekten und da bin ich Codemäßig schon durchgestiegen.

Lg, M0rgenstern
Meine private Spieleschmiede:
http://www.siliziumbrain.de

idontknow

unregistriert

2

06.04.2010, 15:39

Du meinst aber schon solche Tilemaps: http://en.wikipedia.org/wiki/Tile_engine

Ich verstehe nicht was du da scrollen willst bzw irgend ne merkwürdige abhänigkeit zum mauszeiger herstellen oO?

Ich steig leider nicht ganz durch...

M0rgenstern

Frischling

  • »M0rgenstern« ist der Autor dieses Themas

Beiträge: 9

Beruf: Schüler

  • Private Nachricht senden

3

06.04.2010, 15:59

Eigentlich meine ich Tilemaps wie so eine zum Beispiel:
http://www.virtual-maxim.de/wp-content/u…ilemap/map1.png
Oder wie sie halt in dieversen Rollenspielen etc vorkommen.

UNd wenn die Map größer ist als der Bildschirm muss man automatisch die Map scrollen.
Das mit der Maus: Ich möchte einen Mapeditor programmieren. in diesem möchte ich dann einzelne Tiles oder größere Flächen abändern, Umgebungsobjekte hinzufügen etc. Und dazu muss ich das ganze mit dem Koordinaten des Mauszeigers verrechnen.

Ich hoffe, jetzt ist es klarer.

Lg, M0rgenstern
Meine private Spieleschmiede:
http://www.siliziumbrain.de

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

06.04.2010, 16:05

Zum scrollen brauchst du doch einfach nur die ganze Tilemap verschieben. Wenn du x Pixel nach Rechts gehst wird alles x Pixel nach Links verschoben. Wenn du Maus/Pixel- in Tilekoordinaten umrechnen willst brauchst du nur durch Höhe bzw. Breite eines Tile zu teilen. Wenn die Map dabei gescrollt ist musst du vorher natürlich den Scrollwert dazuaddieren.

idontknow

unregistriert

5

06.04.2010, 16:06

Erstmal vorweg, der Link zeigt auf ein Level, dass AUF einer Tilemap bzw auf Tiles absiert 8vermutlich9 ist selber aber nicht zwangsläufig eine Tilemap^^, aber ich versteh jetzt was du meinst :D.

Naja zum scrollen: Auf deine gewählte Auflößung passen ja x*y Tiles.
Dein Spielfeld wird ja ebenfalls in Tiles angegeben angenommen x1*y1. Jetzt renderst du eben immer die Tiles abhängig von der Position deiner Kamera (Figur).
(Anm.: Funktioniert nur solange alle Tiles gleich groß sind!)

Zm Mauszeiger: Du kannst ja für jedes Tile in deiner Map ein Rect bestimmen ausgehend von der Tile Position und Höhe/Breite. Jetzt musst du nur checken in welchem Tile-Rect sich dein Mauszeiger befindet..

6

06.04.2010, 17:04

Deine bisherige Vorgehensweise war ja schnmal richtig.
Du nimmst ein Array, füllst es mit Tileinformationen und lässt alles rendern.
Wenn du jetzt scrollen willst definierst du dir eine virtuelle Kamera die durch einen 2 Dimensionalen Positionsvektor repräsentiert wird.
Sagen wir mal du willst mit der linken oberen Ecke deiner Teilmap anfangen die den Punkt (0,0) hat. Dann hat deine Kamera auch die Psoition (0,0).
Wenn du jetzt um 10 EInheiten nach rechts scrollen willst, addierst du die 10 Einheiten auf die x Komponente der Kamera, was den Punkt (10,0) ergibt.

Um jetzt die Tiles richtig zu zeichnen, verschiebst du ihre Position entgegen der Kamera. Es reicht also von der Koordinate der einzelnen Tiles die Kameraposition abzuziehen.
Für das Tile mit der Position (0,0) ergibt das die neue Position (-10,0). Damit verschiebt es sich übrigens automatisch aus dem sichtbaren Bereich.

Um jetzt noch performance zu sparen kannst du alle Teiles prüfen ob sie noch im sichtbaren Bereich liegen und nur die Tiles rendern, die innerhalb des sichtbaren bereichs liegen. Bei kleinen Tilemaps, kannst du jedes Teil einzeln prüfen, bei großen maps lohnt es sich, über eine andere Organisation nachzudenken (merken für später).

Das Tile unter der Mausposition bekommst du genau anderst herum. Du nimmst die Position der Maus und addierst den Wert der Kamera. Damit bekommst du dann deinen Wert auf der Tilemap.

EDIT: Ich hatte den Post von idontknow irgendwie überlesen :D

M0rgenstern

Frischling

  • »M0rgenstern« ist der Autor dieses Themas

Beiträge: 9

Beruf: Schüler

  • Private Nachricht senden

7

06.04.2010, 17:13

Also, nur um das noch mal explizit zu haben:
Sagen wir die Kamera ist bei 50, 50. Dann Scrolle ich 10 nach rechts. Also hat die Scorllvariable den Wert 60, 50. Die Position eines jeden Tiles berechne ich dann, indem ich Tilex-Scrollx (sagen wir 70-60) und Tiley-Scrolly rechne?

Vielen Dank shconmal für all die Hilfe.

Lg, M0rgenstern
Meine private Spieleschmiede:
http://www.siliziumbrain.de

SilentDragon

Alter Hase

Beiträge: 530

Wohnort: Köln

Beruf: Student

  • Private Nachricht senden

8

06.04.2010, 18:38

mache genau das selbe in java seit einer woche habe auch nix online gefunden und in java gibts keine richtigen engines dafür hab also bis jetzt alles selber geschrieben...

zum zeichnen benutze ich sowas:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
 for (int y=0; y {
for (int x=0; x {
int col = map[y][x].getypos();
int row = map[y][x].getxpos();
yhight = map[y][x].gethight()*4;
xp = row*(twidth/2) - col*(thight) + (int)camx; 
yp = col*(thight/2) + row*(thight/2) + (int)camy - yhight;
yhight = map[y][x].gethight();
type = map[y][x].getType();
drawImages(dbg, g1, xp, yp);
}
}



bei mir ist es halt direkt isometrisch mit höhenverschiebung etc. aber so sollte es glaub ich aussehen (funktioniert auf jeden fall) ^^
wie du siehst ermittle ich nur die x,y positionen der einzelnen Felder, und addiere die aktuelle Cam (bildschirm) position hinzu ...
die Cam position kannst du dan halt in abhängigkeit mit der zeit in alle Richtungen verschieben
...

9

06.04.2010, 19:58

...Die Position eines jeden Tiles berechne ich dann, indem ich Tilex-Scrollx (sagen wir 70-60) und Tiley-Scrolly rechne?...

Genau

M0rgenstern

Frischling

  • »M0rgenstern« ist der Autor dieses Themas

Beiträge: 9

Beruf: Schüler

  • Private Nachricht senden

10

06.04.2010, 23:47

Vielen Dank euch allen.
Ich habe aber in meiner Berechnung noch immer Probleme.
Wenn ich jetzt die Map "bewege" sehe ich nur noch schwarz.

Ich habe hier mal nen Code Ausschnitt:

Einmal die Variablen:

Quellcode

1
2
3
4
5
6
7
8
9
10
Global iMapwidth:Int = 40
Global iMapheight:Int = 40

Global fScrollX:Float = 0
Global fScrollY:Float = 0
Global fMoveX:Float = 0
Global fMoveY:Float = 0

Global fPlayerX:Float = GraphicsWidth() / 2
Global fPlayerY:Float = GraphicsHeight() / 2


Und hier die Berechnung mit der Anzeige, im Prinzip die Hauptschleife:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
While Not KeyHit(KEY_ESCAPE) Or AppTerminate()
    WaitTimer(FTimer)
    Cls
    
    If KeyDown(KEY_UP) Then fScrollY = fScrollY - 1 + fPlayerY 'Hier scheinen die Probleme zu liegen. Ich berechne irgendwas falsch
    If KeyDown(KEY_DOWN) Then fScrollY = fScrollY + 1 + fPlayerY 'Aber was genau weiß ich nicht
    If KeyDown(KEY_LEFT) Then fScrollX = fScrollX - 1 + fPlayerX
    If KeyDown(KEY_RIGHT) Then fScrollX = fScrollX + 1 + fPlayerX
    
    
    
    For Local iMapXIndex:Int = 0 To (iMapwidth - 1)
        For Local iMapYIndex:Int = 0 To (iMapheight - 1)
            If (iMapXIndex - fScrollX) <= (iMapwidth - 1) And (iMapXIndex - fScrollX) >= 0 Then
                If (iMapYIndex - fScrollY) <= (iMapheight - 1) And (iMapYIndex - fScrollY) >= 0 Then
                    'In der nächsten Zeile wird jedes Tile gemalt und das Offset auch miteinberechnet:
                    DrawImage(tiTiles, iMapXIndex * iTilesize, iMapYIndex * iTilesize, iMap[iMapXIndex - fScrollX, iMapYIndex - fScrollY, 1])
            
                EndIf
            EndIf
        Next
    Next
    Flip 0
Wend


Hab mal die relevanten Stellen kommentiert.
Wenn ihr ne genauere Erklärung haben wollt, dann fragt bitte einfach, weiß ja nicht was genau eventuell unklar ist.

Lg, M0rgenstern
Meine private Spieleschmiede:
http://www.siliziumbrain.de

Werbeanzeige