Maus Mapping auf einer ISO Map
Übersicht BlitzMax, BlitzMax NG Allgemein
Mathias-KwiatkowskiBetreff: Maus Mapping auf einer ISO Map |
So, Jun 03, 2012 20:13 Antworten mit Zitat |
|
---|---|---|
ich habe immernoch so ein problem mit einer ISO map. ich habe nun ein code dazu geschrieben und vieleicht kann mir da einer bei helfen.
also als erstes is das teil 128*61 gezoomt von 256*120 glaub da fängt es schon an ... dürfte warscheinlich eine falsche X und eine falsche Y weite/Höhe sein. abgesehn davon is das problem mit der maus das wenn man auf ein Tile kommt... wie berechnet man es richtig. ... Tile: Code: ( Dürfte leicht zu durchschauen sein ) Code: [AUSKLAPPEN] Global ScreenW:Int = DesktopWidth(), ScreenH:Int = DesktopHeight()
Global Map:Int[5000, 5000] For Local y:Int = 0 To 4999 For Local x:Int = 0 To 4999 Map[x, y] = 0 Next Next SetMaskColor 255, 0, 255 Global Tiles:TImage = LoadAnimImage("Data\Tile.BMP", 256, 120, 0, 1) Graphics ScreenW, ScreenH, 1 WTimer = CreateTimer(60) Repeat WaitTimer WTimer DrawMap() Flip Until KeyDown(KEY_ESCAPE) End Function DrawMap() SetScale 128.0 / Tiles.width, 61.0 / Tiles.height For x = 0 To 25 For y = 0 To 36 xpos:Int = ((x * 128) + (y Mod 2) * (128 / 2)) ypos:Int = (y * (61 / 2 + 1)) If MouseX() > xpos And MouseX() < xpos + 128 And MouseY() > ypos And MouseY() < ypos + 61 Then SetColor 255, 0, 0 Else SetColor 255, 255, 255 EndIf DrawImage Tiles, xpos, ypos, Map[x, y] Next Next SetScale 1, 1 End Function |
||
ChriseBetreff: Re: Maus Mapping auf einer ISO Map |
Mo, Jun 04, 2012 2:38 Antworten mit Zitat |
|
---|---|---|
Beim berechnen des ausgewählten ISO-Tiles ist es eigentlich immer hilfreich, wenn du von den Maus-koordinaten genauso auf die ISO-Tiles zurückrechnest, wie du die Koordinaten der ISO-Tiles zum darstellen auf der Map berechnest, nur eben die Umkehrfunktion. Soweit ich das noch in Erinnerung habe, ergeben sich bei der Methode zwei Funktionen, die man schön mit dem Einsetzverfahren nach X bzw. Y lösen kann
lg Chrise |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
Midimaster |
Mo, Jun 04, 2012 8:03 Antworten mit Zitat |
|
---|---|---|
Bei deiner Maus-Berechnung wird das Außen-Rechteck des Tiles geprüft. So wird die Maus aber auch dann gemeldet, wenn die in den Bereichen außerhalb des Trapezes ist.
Du musst bei der Maus berücksichtigen, dass der X-Wert des Randes des Trapezes ja von der jeweiligen Y-Stelle abhängt. Je "tiefer" sich die Maus in einem Trapez befindet, desto breitet ist es ja an dieser Stelle: Hier ein Beispiel-Code: BlitzMax: [AUSKLAPPEN] Graphics 800,600 |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
Mathias-Kwiatkowski |
Mo, Jun 04, 2012 9:28 Antworten mit Zitat |
|
---|---|---|
Midimaster danke genau sowas hilft ^^
ja ich wusste schon das ich die transperents mitgeprüft habe, nur wusste ich leider nicht wie ich es anders berechnen sollte. anhand deines beispiels werd ich es mir nun beibringen können. danke, ich hoffe das das elendige mausmapping unter iso für mich nun abgeschlossen ist. |
||
Chrise |
Mo, Jun 04, 2012 10:57 Antworten mit Zitat |
|
---|---|---|
Nein, es geht auch schneller und effizienter:
Das mit einer Abfrage in jedem Schleifendurchlauf ist zwar gut gemeint, aber ist extrem viel überflüssige Berechnung. Wenn du deine Mauskoordinaten einfach zurückrechnest, hast du nur einmal eine Berechnung und in keinem der Schleifendruchläufe eine Abfrage, ob sich deine Maus in dem Feld befindet: Nehmen wir an du berechnest deine Tileposition etwas angenehmer: Code: [AUSKLAPPEN] posX = x * 128 - y * 128 posY = x * 60 + y * 60 dann stehen die Variablen x & y ja für die Beschreibung des Tileindexes Wir nehmen danach an, dass posX und posY auch für unsere Mausposition stehen könnte, von der wir zurück auf den Tileindex rechnen wollen, also lösen wir ersteinmal beide Formeln nach x, bzw. y auf: 1. Formel:Code: [AUSKLAPPEN] posX = x * 128 - y * 128 128x = posX + 128y x = (posX + 128y)/128 posX = x * 128 - y * 128 128y = 128x - posX y = (128x - posX)/128 2. Formel:Code: [AUSKLAPPEN] posY = x * 60 + y * 60 60x = posY - 60y x = (posY - 60y)/60 posY = x * 60 + y * 60 60y = posY - 60x y = (posY - 60x)/60 Dadurch haben wir die 4 Formeln, die wir durch Gleichsetzverfahren von einer Unbekannten befreien können: Formel 1:Code: [AUSKLAPPEN] y = (128x - posX)/128 y = (posY - 60x)/60 -> (128x - posX)/128 = (posY - 60x)/60 60*128x - 60posX = 128posY - 128*60x 2*60*128x = 128*posY+60posX x = (128*posY+60posX)/(2*60*128) Formel 2:Code: [AUSKLAPPEN] x = (posX + 128y)/128 x = (posY - 60y)/60 -> (posX + 128y)/128 = (posY - 60y)/60 60posX + 60*128y = 128posY - 128*60y 2*60*128y = 128posY - 60posX y = (128posY - 60posX)/(2*60*128) Im Prinzip spielen dann nur folgende Formeln eine wirkliche Rolle: BlitzMax: [AUSKLAPPEN]
bzw. BlitzMax: [AUSKLAPPEN]
(Die Formeln sind aufgrund der Überschaubarkeit noch nicht komplett vereinfacht!) Wenn wir jetzt statt posX und posY, die zum Ursprung der Karte relativen Mauskoordinaten einsetzen, bekommen wir genau die x,y Werte die wir zuvor auch zum Zeichnen verwendeten heraus. Viel effizienter und keine unnötigen Abfragen. Vll hilft es dir ja. Ein Programmierer sollte zu einem großen Teil auch die Mathematik beherrschen. lg Chrise |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
Mathias-Kwiatkowski |
Di, Jun 05, 2012 23:32 Antworten mit Zitat |
|
---|---|---|
vielen dank ...
vieleicht gillt die ausrede... hobby programmierer ^^ nein ernsthaft, wenn man die formel weiss kein ding aber vielen danke für diesen beitrag. |
||
Chrise |
Mi, Jun 06, 2012 2:54 Antworten mit Zitat |
|
---|---|---|
Mathias-Kwiatkowski hat Folgendes geschrieben: vieleicht gillt die ausrede... hobby programmierer ^^
Vorerst vielleicht Ich denke, wenn dein Projekt weiter vorangeschritten ist, wirst du selbst nochmal darauf zurückkommen, wenn es um die ersten Performance-probleme geht Und vielleicht hilft sie dir ja dann Gerne, lg Chrise |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
Übersicht BlitzMax, BlitzMax NG Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group