Drawimagerect und Kollision!

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Infected

Betreff: Drawimagerect und Kollision!

BeitragMi, Dez 12, 2012 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo! Momentan arbeite ich an einem kleinen 2D Worldeditor, und habe nun folgendes Problem:
Am anfang lasse ich den benutzer einige Texturen laden, die dann fein säuberlich angeordnet als Thumbnails im Menü links dargestellt werden, klappt mit Drawimagerect soweit sogut, aber sobald ich da ne collision einbaue (maus->texturthumbnail) klappt gar nix mehr, es sieht so aus als würde da die tatsächliche größe der Textur als collisionsmodel herhalten, und nicht das verkleinerte thumbnail... ich hoffe ihr versteht..
gibt es da irgendeine lösung? oder n workaround oder sowas?

Holzchopf

Meisterpacker

BeitragMi, Dez 12, 2012 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Muss unbedingt eine Kollisionsprüfung stattfinden? Könntest du auch eine Lösung akzeptieren, bei der einfach die Mauskoordinaten verglichen werden? Für mich klingt dein Problem aber doch schon sehr danach, als ob ein einfaches If-Konstrukt helfen könnte...

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

PhillipK

BeitragMi, Dez 12, 2012 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, in der tat.
Der workarround ist wie folgt:

1) Du kennst die positionen beim zeichnen. Am einfachsten wäre hier ein 2d array, welches die bilder oder objekte der "tiles" hält. Hier noch beim zeichnen ein DrawImageRect( daten[x,y], x* sizeX, y*sizeY .... ) und e voila Smile
2) Du nutzt die art des Zeichnens auch beim "überprüfen" - bei Tiles gehe ich davon aus, das diese gleichgroß sind.

Vorgehensweise:
Mausposition auf die entsprechende Zone berechnen (falls du ein Origin oder sonstwas setzt! diese werte addieren oder subtrahieren, bin mir grade unsicher)
tileX = tmpMouseX / sizeX
tileY = tmpMouseY / Sizey

-> Prüfe, ob das tile existent ist, oder ob es "innerhalb des arrays" liegt (tileX = -1 zb würde einen fehler verursachen)

passt alles, also liegt es im rahmen, dann kannst du mit data[tileX,tileY] an dein Ziel kommen. Smile


:::::::::::::::::::::::::::::::
Es liegt nun an dir:
- Die koordinatenberechnung deiner Tiles rauszufinden
- Die formel umstellen
- Mauspositionen damit verrechnen
- An die gespeicherten daten kommen^^ Gleichzusetzen mit deiner collision-geschichte.

Vorteile:
1) Es ist schneller (ne simple division hat dann doch weniger rechenleistung wie ne kollisionsberechnung *vermut*)
2) Es .. ehm ja. Ist machbar! Smile
3) Lerneffekt Razz
 

Infected

BeitragDo, Dez 13, 2012 1:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, danke erstmal für die Antwort. Momentan versteh ich nur Bahnhof, bin aber auch total fertig Wink werds mir morgen nochmal durchlesen. Smile

Hier mal n bild, es geht um die texturselektion links
http://www.hyperionspath.de/screen.png
 

PhillipK

BeitragDo, Dez 13, 2012 10:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh oh, okay. Meine blöde art, nicht erklären zu können, hat wieder zugeschlagen.

Gut, dann würde ich dich gerne auffordern, einen Teil Code zu posten, wie du die Texturen auf den bildschirm bringst.
Folgendes wüerde ich vermuten:
- Du verwendest SetOrigin irgendwo vorher - bitte umbedingt mit kopieren
- Alternativ hast du einen Grund-offset von Oben Links (0,0) zur ersten kante von der ersten Textur - auch dann auf jedenfall mit hier rein.

Du hast momentan 7 tiles - alle sind viereckig. Heißt im umkehrschluß: Man kann die "formel" zum zeichnen umstellen, um eine Koordinate wieder zu einem Tile zuzurück zu führen, was am ende eine simple abfrage ist.

Die zweite möglichkeit ist, das du die daten der Tiles in einer TList oder einem array hast:
BlitzMax: [AUSKLAPPEN]
Local mX:Int = MouseX()
Local mY:Int = MouseY()

For Local tile:TTile = EachIn TileListOderArray
If mx > tile.x And my > tile.y And mx < tile.x+tile.breite And mY < tile.y + tile.hoehe Then
'... das "tile" ist unter der maus: Linksklick auswerten oder sonstige scherze machen.

' Achtung, hier gehe ich davon aus, das du ein Type für deine Tiles verwendest, wo die zeichenposition X, die zeichenposition Y und die breite / hoehe drin gespeichert sind.
'falls dem nicht so ist, keine angst, das kriegen wir schon hin :)
End
Next

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group