Hallo, ich möchte den Tastenpatch, genauer gesagt den Mauspatch für mein Menü benutzten und deshalb wollte ich Fragen ob mir jemand sagen kann wie man das macht.
Ich habe den Mauspatch schon installiert und alles funktioniert auch, bloß ich kann so eine bestimmte Fläche anklicken, die ich mit Koordinaten erstellt habe.
Ich möchte aber das da z. B. ein Pfeil (ein Event) ist und wenn ich ihn anklicke, dann soll eine Message angezeigt werden.
Ich weiß bloß wie man die Koordinaten einer beklickbaren Fläche erstellt, deshalb wäre sehr nett, wenn ihr mir helfen könntet.
Wenn du ein Event anklicken willst musst du dir zuerst die Scene-Position dieses Events ausgeben lassen. Erstell dafür 2 Variablen. Die eine nennst du "Event Scene X", die andere "Event Scene Y" (oder ähnlich).
Was genau ist die Scene-Position eines Events?
Du kennst ja sicherlich die Koordinatenangabe eines Events. Diese gibt dir an auf welchem Feld der Map das betrachtete Event sich befindet. Die Scene-Position ist da ganz ähnlich. Allerdings gibt sie dir nicht die Position des Events auf der Map, sondern auf dem Bildschirm an und dabei auch nicht in Feldern (a 16x16 Pixel), sondern direkt in Pixeln. Ein Bild welches du auf die Position (160|120) projezierst (also die Mitte des Bildschirms), hat also folglich die Scene-Position (160|120).
Würdest du nun ein Picture anzeigen das z.B. 40x20 Pixel groß ist und sollte man dieses auf der ganzen Fläche anklicken können müsstest du einen Bereich "abstecken" in dem sich der Mauszeiger befinden muss, damit, sobald man klickt, die entsprechende Aktion ausgeführt wird. Dies erreicht man mit einer leichen Rechnung:
Im Maker würdest du nun also nach der "Hat der Spieler geklickt"-Abfrage eine solche Fork-Verschachtelung einbauen (Maus X und Maus Y ist dabei die Scene-Position des Mauszeigers, welche dir der Key-Patch ja ausgibt):
Damit hättest du nun das Picture mit der Größe 40x20 auf der Position (160|120) "abgesteckt". Um dies nun für ein Event zu machen musst du genau so vorgehen, allerdings musst du vorher noch die Minimal- und Maximalwerte festlegen. Dazu erstellst du nochmal 4 Variablen (Minimal X, Maximal X, Minimal Y, Maximal Y). Nun speicherst du die Scene-Position des betrachteten Events in deine dafür vorgesehenen Variablen:
Nun errechnest du den Bereich der "abgesteckt" werden muss. Dazu solltest du noch wissen, dass der Maker keinesfalls den Mittelpunkt eines Events ausgibt, wenn du die Scene-Position nimmst, sondern den untersten Punks in der Mitte.
Dazu ein kleines Bild, der grüne Punkt ist die Position welche der Maker ausgibt:
Für deine Minimal und Maximal Variablen bedeutet das, dass du den "Maximal Y"-Wert bereits hast (schließlich gibt der Maker ja gleich den untersten Punkt des Events aus).
Du musst also nur noch Minimal Y, Minimal X und Maximal X definieren. Dabei kommt es nun darauf an wie groß dein Event ist. Die Maximale Größe beträgt, wie du sicher weißt, 24x32 Pixel.
Da du diese aber nicht komplett ausnutzen musst, solltest du die tatsächliche Größe deines Events berücksichtigen. Schließlich sieht es nicht sonderlich toll aus, wenn du ein Event anklicken kannst das nur 16x16 Pixel groß ist, wenn du z.B. 14 Pixel über dessen obersten Punkt bist.
Gehen wir also davon aus das dein Pfeil 16x16 Pixel groß ist. Nun verwendest du die gleiche Rechnung wie oben, nur unter Berücksichtigung, dass du die unterste Position in der Mitte hast, und nicht Mitte Mitte wie oben:
Nun nurnoch die Abfrage nach dem Klick-Befehl vom Spieler:
Fertig.
Nun ist dein 16x16 Pixel pfeil an jeder Position anklickbar...
OK, werd ich mal versuchen das ganze etwas mehr zu Bebildern. Ich hoffe du hast verstanden, was die Scene-Abfrage vom Maker ausgibt. Trotzdem noch eine kurze (bildliche) Erläuterung:
Exerzieren wir das Ganze mal an Valnar durch. Dies ist eine ganz normale Map mit aktivierten Key-Patch (Mouse-Patch) und einem Event namens Valnar. (Der Held kann erstmal ignoriert werden).
So. Nun überprüfen wir seine Scene-Position in unserem Kontroll-Map-Event (da du ja ein Menü machen willst, geht das wohl am besten über ein Parallel-Process Map-Event...):
Das machen wir natürlich für X, wie für Y.
Nun hast du 2 Möglichkeiten einen Bereich um die ermittelten Koordinaten abzustecken.
1) Du benutzt die Minimum und Maximum Angaben (besser zu variieren)
2) Du subtrahierst von den erhaltenen Koordinaten die Koordinaten des Mauszeigers und stellst dann in den Forks Minimum und Maximum ein (besser zu verstehen)
Da du mir ja geschrieben hast das du mit Minimum und Maximum noch Probleme hattest, nehme ich jetzt mal Variante Nummer 2. Die Koordinaten des Mauszeigers haben wir ja schon durch den Tastenpatch (wobei mit "Maus X / Y", natürlich "Maus Scene X / Y" gemeint ist ).
Aber zuerst noch zur Funktionsweise des Subtrahierens der Heldenkoordinaten:
Hier haben wir eine 16x16 Map. Ganz links steht der Held (das grüne Feld), weiter rechts ein Event (rot). Nun wollen wir um dieses Event einen Bereich von z.B. 4 Feldern abstecken (gelb) (ich rechne in diesem Beispiel wieder in Feldern, da dies einfacher geht, mit Pixeln ist es letztendlich genau das gleiche).
Mit abstecken meine ich in diesem Fall eine Abfrage, die überprüft, ob sich der Held in diesem Bereich befindet (das gleiche gilt dann später für den Mauszeiger). Dazu nehmen wir uns zuerst die Koordinaten des Events und die des Helden:
Der Held befindet sich auf (3|9), das Event auf (10|9).
Jetzt subtrahieren wir die Heldenkoordinaten von denen des Events:
Das Ergebnis:
Was wir hier erhalten haben ist der Abstand zwischen beiden Objekten, ausgedrückt in Koordinaten. Wenn man nachzählt: Der Held müsste tatsächlich 7 Schritte nach links und 0 Schritte nach unten machen, damit er beim anderen Event ankäme. Würden wir das Szenario umdrehen, der Held würde nun also 7 Schritte weiter rechts vom Event stehen, würden wir als Ergebnis
erhalten. Das was nun bei der X-Koordinate gut zu beobachten war gilt natürlich auch für die Y-Koordinate. Steht der Held über dem Event erhält man ein positives, unter dem Event ein negatives Ergebnis.
In Zusammenfassung:
Wollen wir nun also das der Held in einem Bereich von jeweils 4 Feldern um das Event steht bevor eine Aktion ausgeführt wird, müssen beide Variablen (Event X, Event Y) größer als -4 und kleiner als 4 sein. Sollte der Bereich 9 Felder groß sein müssten sie eben größer als -9 und kleiner als 9 sein. Dieses Prinzip ist extrem praktisch und darauf kannst du auch bei deinem Menü bauen. Zur Zusammenfassung noch mal der Code:
Natürlich könntest du auch ein Rechteck als Bereich nehmen, indem du z.B. abfragst ob "Event X" >= -4 und <= 4 und "Event Y" >= -8 und <= 8 ist. Dann hättest du einen Bereich von 4x8 Feldern abgesteckt. Das geht natürlich völlig beliebig...
Nun aber zurück zu Valnar. Lassen wir uns seine Scene Koordinaten ausgeben erhalten wir (136|80):
Nun lassen wir uns auch noch die Koordinaten des Mauszeigers ausgeben:
Ergebnis: (160|120) (Mitte des Bildschirms)
Nun machen wir genau das was ich dir vorhin mit dem Bereich erklärt habe. Wir ziehen von den "Event Scene X" und "Event Scene Y" die "Maus X" und "Maus Y" ab:
Ergebnis:
Der Mauszeiger ist also 24 Pixel rechts vom Event und 40 Pixel darunter. Nun stecken wir wieder den Bereich ab, dabei müssen wir nun allerdings berücksichtigen das wieder der tiefste Punkt der Events ausgegeben wurde (also sozusagen die Füße ). Dieser Bereich soll nun aber nicht sonderlich groß sein, sondern nur das Event (in diesem Fall Valnar) umgeben. Dazu ermitteln wir seine Größe:
Ergebnis: Valnar ist 18 Pixel breit und 25 Pixel groß.
Zuvor haben wir den Abstand von Valnars Füßen zur Mitte unseres Mauszeigers ermittelt (eigentlich zur Spitze, dies liegt daran das das Picture des Mauszeigers so gebaut ist, das dieser von genug transparenter Fläche umgeben ist, sodass der Mittelpunkt des eigentlichen Bildes die Spitze des Zeigers ist...).
Nun müssen wir nur noch kontrollieren ob dieser Abstand klein genug ist, als das der Mauszeiger sich im abgesteckten Bereich befindet:
Wie komme ich zu dieser Abfrage?
Die Event Scene X Variable hat mir, von der X-Koordinate aus gesehen, den Mittelpunkt von Valnar angegeben. Das heißt zu jedem Rand sind es noch ("Valnar Größe X" / 2), also 18 / 2, also 9 Pixel. Daraus folgt, dass der Abstand des Mauszeigers zu Valnar größer als -9 und kleiner als 9 sein muss (wie weiter oben erklärt).
Die Event Scene Y Variable hat mir allerdings nicht den Mittelpunkt, sonder, wie bereits mehrfach angesprochen, den untersten Punkt des Events ausgegeben. Dementsprechend sind es 0 Pixel bis zum unteren Rand und noch "Valnar Größe Y", also 25 Pixel bis zum oberen Rand. Desshalb muss der Abstand des Mauszeigers zu Valnar größer als 0 und kleiner als 25 sein.
Für einen Pfeil in einem Menü, welche ja meistens ca. 16x16 Pixel groß sind gilt also:
Sooo, ich hoffe dieses Mal war es etwas verständlicher, länger war es auf jeden Fall XD