Maus Mapping auf einer ISO Map

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Maus Mapping auf einer ISO Map

BeitragSo, Jun 03, 2012 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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:
user posted image

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

Chrise

Betreff: Re: Maus Mapping auf einer ISO Map

BeitragMo, Jun 04, 2012 2:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

lg Chrise
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Midimaster

BeitragMo, Jun 04, 2012 8:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Repeat
Cls
SetColor 255,255,255
xpos=100
yPos=75
Breit=100
Hoch=50
DrawLine 100,100,150,75
DrawLine 100,100,150,125
DrawLine 200,100,150,75
DrawLine 200,100,150,125
DrawText MouseX(),100,300
DrawText MouseY(),100,320
If (MouseX()>xpos) And (MouseX()<(XPos+Breit))
DrawText "Maus ist jetzt in X",100,340
EndIf
If (MouseY()>ypos) And (MouseY()<(YPos+Hoch))
DrawText "Maus ist jetzt in Y",100,360
EndIf
'
' in ROT deine Berechnung:

SetColor 255,0,0
If (MouseY()>ypos) And (MouseY()<(YPos+Hoch))
If (MouseX()>xpos) And (MouseX()<(XPos+Breit))
DrawLine Xpos+Breit,MouseY()-1,Xpos,MouseY()-1
DrawText "Maus ist jetzt scheinbar in beiden Grenzen",100,380
EndIf
EndIf
'
' in GRÜN die genauere Formel
SetColor 0,255,0
If (MouseY()>ypos) And (MouseY()<(YPos+Hoch))
'
' die Breite des Trapez hängt von der y-Stelle ab:
' genauer von dem Abstand der y-Stelle von der Mitte des Trapez
HierBreit#=Hoch/2-Abs((Ypos+Hoch/2)-MouseY())
HierBreit=HierBreit/Hoch*Breit
DrawText "die Breite hier = "+HierBreit,100,400
'
' der linke Beginn des Trapezes hängt von der Breite an dieser Stelle ab:
locXPos=Xpos+Breit/2-HierBreit

DrawText "der linke Rand locXPos = "+locXPos,100,420
DrawLine locXPos,MouseY()+1,locXPos+2*HierBreit,MouseY()+1
'
' daraus ergibt sich diese Mausformel:
If (MouseX()>locXpos) And (MouseX()<(locXPos+2*HierBreit))
DrawText "Jetzt ist die Maus wirklich im Trapez",100,440
EndIf
EndIf
Flip 1
Until KeyHit(key_Escape)
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Mathias-Kwiatkowski

BeitragMo, Jun 04, 2012 9:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink

Chrise

BeitragMo, Jun 04, 2012 10:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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]

x = (128*posY+60posX)/(2*60*128)
y = (128*posY - 60posX)/(2*60*128)


bzw.

BlitzMax: [AUSKLAPPEN]

tileX = (TileWidth/2*posY+TileHeight/2*posX)/(2*TileHeight/2*TileWidth/2)
tileY = (TileWidth/2*posY -TileHeight/2*posX)/(2*TileHeight/2*TileWidth/2)


(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

BeitragDi, Jun 05, 2012 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen dank ...

vieleicht gillt die ausrede... hobby programmierer ^^
nein ernsthaft, wenn man die formel weiss kein ding Very Happy aber vielen danke für diesen beitrag.

Chrise

BeitragMi, Jun 06, 2012 2:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Mathias-Kwiatkowski hat Folgendes geschrieben:
vieleicht gillt die ausrede... hobby programmierer ^^


Vorerst vielleicht Wink Ich denke, wenn dein Projekt weiter vorangeschritten ist, wirst du selbst nochmal darauf zurückkommen, wenn es um die ersten Performance-probleme geht Very Happy

Und vielleicht hilft sie dir ja dann Wink
Gerne,

lg Chrise
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group