Mathematik online lernen im Mathe-Forum. Nachhilfe online
Startseite » Forum » Isometrische Karte zentrieren

Isometrische Karte zentrieren

Universität / Fachhochschule

Tags: Isometrie, JavaScript, PHP

 
Antworten Neue Frage stellen Im Forum suchen
Neue Frage
BlackScorp

BlackScorp aktiv_icon

01:51 Uhr, 30.12.2010

Antworten
Hallo Mathematiker da draußen,

ich sitze schon seit einer Weile an ein einem "kleinen" Problem.
Es geht um folgendes, ich möchte ein Spiel Programmieren in dem eine 2D Karte mit Isometrischer Ansicht dargestellt wird. Die Karte sieht zz so aus:

http//cruel-online.de/map2/

Man kann die Karte soweit wie man möchte in den Positiven bereich bewegeben(negativen geht noch nicht)

Erstmal als Hintergrund wie ich diese Karte erstelle:
gegeben:
Kachelhöhe,Kachelbreite,Darstellungsfesterhöhe und breite, OffsetX und Y in pixel(also um wieviel pixel ich meine Karte verschoben habe)

Um jeden einzelnen Kachel darstellen zu können, durchlaufe ich 2 Schleifen, eine für die Y Koordinate und eine für die X Koordinate. Dabei startet die Y Koordinate bei OffsetY / Kachelhöhe -1 und endet bei ((OffsetY + Anzeige Höhe) / Kachelhöhe )2.

Die X Koordinate verhält sich ähnlich nur mit OffsetX und Kachelbreite usw..

Wenn ich das Ganze tiefer erläutern soll, dann bitte einfach Fragen.

Aufjeden Fall sieht man jetzt zwar meine Karte aber ich weis nicht wie ich in diese Karte an einer Position zentrieren soll.

Bei einer nicht isometrischen darstellung, würde ich einfach meine X position kachelbreite nehmen und das ganze als Offset setzen davon hälfte der Anzeigebreite abziehen, somit würde sich die Karte dann so verschieben dass X in der Mitte der Anzeige ist.

Aber wie macht man sowas in einer Isometrischen karte? Da sind ja die Koordinaten ganz anders verteilt.

Meine zweite Frage wäre, wenn ich nun mit eurer Hilfe eine X und Y Position festlegen kann und dann dadurch sich die Karte zentriert hat, wie könnte ich den neuen Mittelpunkt ermitteln, also nach dem ich die Karte irgendwohin verschiebe.

Für mich ist halt wichtig, dass ich später meine Figur auf die Karte plaziere zb auf 54 und nach dem ich die Karte bewegt habe, befindet sich die figur zb dann auf 55.

Das Ganze sollte dann so aussehen wie in Alten Nintendo RPGs man tut so als ob die Figur irgendwohin läuft aber in wirklichkeit bleibt diese figur nur mitten im fenster stehen und die Karte bewegt sich unter der Figur.

Ich hoffe Ich habe mich verständlich ausgedrückt und hoffe ihr verzeiht mir meine Rechtschreibfehler es ist fast 2 Uhr nachts:-D) und natürlich Hoffe ich endlich auf Hilfe.

Mit Freundlichen Grüßen,

BlackScorp

Für alle, die mir helfen möchten (automatisch von OnlineMathe generiert):
"Ich möchte die Lösung in Zusammenarbeit mit anderen erstellen."
Online-Nachhilfe in Mathematik
Antwort
hagman

hagman aktiv_icon

16:02 Uhr, 30.12.2010

Antworten
Die Angaben zu und Y auf deinem Bild scheinen mir etwas unsystematisch zu seni (und deshalb auch die Formelarbeit zu erschweren):
Kacheln mit demselben X ergeben eine vertikale Zickzackschlange, Kacheln mit demselben Y eine horizontale Perlenschnur.
Stell dir vor, du stehst als Spielfigur bei X2Y7 und blickst Richtung X2Y6 (für uns schräg nach rechts oben, die Figur mag das "Süden" nennen). Man würde erwarten, dass in dieser Blickrichtung nacheinander X2Y7,X2Y6,X2Y5,X2Y4,X2Y3,... liegen und in Gegenrichtung (schräg nach links unten bzw. "Norden") weiter X2Y8,X2Y9,... also festes X und wachsendes Y.
Dreht sich die Figur in Ihrer Welt um 90° nach links, blickt sie direkt auf X1Y6. Ich hätte in Richtung schräg nach links oben (für die Figur: "Osten") eher festes Y und wachsendes X erwartet, also nach X2Y7 vielleicht X3Y7,X4Y7 usw.
Mit solch einer Nummerierung hättest du gewiss weniger Probleme mit Umrechnungen, denn die Umgebung einer Kachel sähe dann immer einheitlich so aus:
((x+1,y)(x,y-1)(x,y)(x+1,y)(x,y-1))
Vorteil:
- Fortlaufende Wege usw ließen sich leicht zeichnen;
- es lässt sich liecht bestimmen, ob z.B. ein Gegner i der unmittelbaren Nähe ist
- Das Umrechnen von Bild auf Kachelkoordinaten und umgekehrt iste eine einfache Matrixmultiplikation
- Das Zentrierungsproblem löst sich dabei auch von selbst, da man wieder nur an der richtigen Stelle geeignet abziehen muss
- Sogar enie 90°-Rotation der ganzen Welt (bzw. der Kameraperspektive) ist einfach, da im wesentlichen x und y ihre Rollen vertauschen und ggf. Vorzeichen wechseln
BlackScorp

BlackScorp aktiv_icon

02:10 Uhr, 31.12.2010

Antworten
Hm.. wie könnte denn die rechnung für jedes x und y dann aussehen? ich werd mich mal an dein vorschlag ransetzen, melde mich die tage, danke für den tipp

MFG
BlackScorp

BlackScorp aktiv_icon

09:20 Uhr, 07.01.2011

Antworten
Hallo,

ich bins nochmal.. also ich habe rum Probiert die koordinaten so umzustellen und habe ein bisschen gegoogled, bin dabei auf folgenden Artikel gestoßen:

http//www.gamedev.net/reference/articles/article747.asp

wie ihr dort sehen könnt, ist mein Koordinaten system genau richtig.. mein ziel ist es nun also aus bestimmten daten ein ergebnis zu kriegen. und zwar:

gegeben:
positionX: 10
positionY: 10
Anzeigebreite: 640 pixel
Anzeigehöhe :480 pixel
Kachelbreite :217 pixel
Kachelhöhe :108 pixel

gesucht:
offsetX : ca 2061 pixel
offsetY : ca 486 pixel

somit würde sich die Position 1010 ganz oben links auf meiner karte, in der ecke, sein ich müsste da noch die hälfte der Anzeigehöhe bzw breite dazu addieren und schon würde die position zentriert dargestellt werden.

Ich wüsste nur nicht wie ich anfangen müsste eine Formel zu basteln.. um das ganze zu prüfen, habe ich mal noch die Pixel position der Koordinaten
Y:11X:10 aufgeschrieben. da wäre offsetX: ca 2170px und offsetY ca 540px.

vllt könnt ihr mir helfen, damit ich weis , wo ich anfangen müsste

MFG

EDIT:

soo.. bin ein ganze stück vorangkommen.. mit folgenden formel kann ich meine karte zentrieren:

wenn positionY durch 2 teilbar ist dann rechne ich den offsetX so aus
offsetX = ((myX*tileWidth)-(screenWidth/2));
wenn es nicht teilbar ist, dann so..
offsetX = ((myX*tileWidth)-(screenWidth/2)+(tileWidth/2));

und
offsetY = (myY*tileHeight/2)-(screenHeight/2);

jetzt muss ich irgendwie anhand des neues offsets die neuen koordinaten herausfinden...