PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RM2K: Maus-Patch-Koordinaten-Abfragen funktionieren nicht.ERST DURCHLESEN DANN POSTEN



TwoFace
25.02.2013, 23:46
Eines vorne weg:

Ich bin genervt.

Extrem genervt.

Was man auch anpackt - es schlägt fehl.

Ich benutze den Mauspatch von Ineluki.

Die folgenden Zeilen sollen euch helfen ein erstes Projekt aufzustellen, mit dem ihr
die Fähigkeiten der Mausfunktionen des Key Patches nutzen könnt. Normale Kennstnisse
im Umgang mit dem RPG Maker 2000 werden vorrausgesetzt.


LOS GEHT'S:

01. Erstelle ein neues Projekt
02. Importiere alle script.wav Dateien aus dem Ordner "Beispiele" in den
Projekt-Unterordner "Sound".
03. Importiere die mitgelieferte Bilddatei "cursor.png" als Bild.
04. Fülle das Wasser mit Rasen
05. Setzte die Startposition irgendwo auf die Map

06. Erstelle ein Schalterevent mit zwei Seiten irgendwo auf der Map.
07. Auf Eventseite 1 im Event erstelle eine Message "Maus an?"
08. Erstelle weiterhin eine "Show Choice" Abfrage mit Ja und Nein.
09. Lasse im Ja-Fall MidiTickOutput.script.wav als Soundeffekt abspielen.
10. Lasse gleich darunter MidiTickClear.script.wav als Soundeffekt abspielen.
11. Lass darunter wiederum MousesupportON.script.wav als Soundeffekt abspielen.
12. Lasse das Bild "cursor.png" mit den Standardeinstellungen anzeigen.
12. Setze mit Change Switch den Switch 001 (benennt ihn wie du willst) auf ON
12. Setze für Event-Seite 2 eine Switch-Bedingung, dass der Switch 001 auf ON
stehen muss, damit diese Seite verwendet wird.
13. Auf Eventseite 2 im Event erstelle eine Message "Maus aus?"
14. Erstelle weiterhin eine "Show Choice" Abfrage mit Ja und Nein.
15. Lasse im Ja-Fall MousesupportOFF.script.wav als Soundeffekt abspielen.
16. Lasse gleich darunter MidiTickReset.script.wav als Soundeffekt abspielen.
17. Lasse wiederum darunter das Bild "cursor.png" wieder löschen.
18. Lasse den Switch 001 wieder auf OFF setzen.

19. Erstelle ein neues Parallel Process Common Event (wähle einfach einen Slot)
20. Gib diesem Event die Startbedingung, dass Switch 001 = ON sein muss.
21. Lasse GetMousePos.script.wav als Soundeffekt abspielen.
22. Verwende den Befehl Change Variable und lasse in die Variable 001 (nennt sie
am besten Mouse ID) den Inhalt von Other -> Midi Play Position (Tick) reinfließen.
23. Erstelle eine IF/THEN Gabel mit Fork Condition und setze als Bedingung,
dass die Variable 001 den Wert -10 haben muss.
24. Lasse im THEN-Fall mit Change Switch den Inhalt von Midi Play Position (Tick)
in die Variable 002 (nennt sie am besten MouseX) einfließen.
25. Lasst gleich darunter mit Change Switch den Inhalt von Midi Play Position (Tick)
in die Variable 003 (nennt sie am besten MouseY) einfließen.
26. Lasst gleich darunter mit Change Switch den Inhalt von Midi Play Position (Tick)
in die Variable 004 (nennt sie am besten Maustasten) einfließen.
27. Verwendet Move Picture und gebt als neue Koordinaten für euer Cursor-Bild die
Variablen MouseX und MouseY an. Lasst die Zeitspanne 0,0sec betragen und schaltet
Wait until done aus.
28. Setzt ganz unten wieder außerhalb der IF/THEN Gabelung noch ein Wait mit dem
Wert 0,0sec.

Obiges hat alles geklappt.

Aber langsam dreh ich durch. Echt mal.

Ich bin kein Anfänger und gewiss nicht dumm, aber der RM2K ist abartig und ich hätte mir nie erträumt, dass Maussteuerung so kompliziert ist. Ganz ehrlich. Ich schildere euch mein Problem kurz und knapp. Möglicherweise ist ja jemand in der Lage mir zu helfen. War bisher leider hier nicht der Fall.

Also:

Maussteuerung. Ich beiße mir die Zähne dran aus. Ganz ehrlich. Ich glaube irgend eine höhere Macht möchte, dass ich in meinem Spiel keine Maussteuerung verwende. :)

Ich benutze einen Cursor, dessen Koordinaten ich mit "Mouse X" und "Mouse Y" abfrage. Wenn ich ein Objekt meiner Wahl mit diesem Cursor berühre möchte ich, dass dieser Cursor sich rot färbt. Wenn ich mit dem Cursor von diesem Objekt wieder weggehe möchte ich, dass der Cursor wieder grau wird. Das wars eigentlich. Dies versuche ich dadurch zu realisieren, dass ich die verdammten Koordinaten der Fläche abfrage:

1.)

http://www7.pic-upload.de/25.02.13/4zdtjhcfhp65.png

Diese Gridkoordinaten dieses Events will ich abfragen.

http://www7.pic-upload.de/25.02.13/b3klm868qht.png

Tu ich auch. Funktioniert wunderbar.

2.)

http://www10.pic-upload.de/25.02.13/gg2q8fsgjz.png

Diese Gridkoordinaten dieses Events will ich abfragen.

http://www7.pic-upload.de/25.02.13/z6nua9r1dyel.png

Tu ich auch. Funktioniert auch irgendwie.

3.)

http://www7.pic-upload.de/25.02.13/asexfnmc9pg.png

Diese Gridkoordinaten dieses Events will ich abfragen.

http://www10.pic-upload.de/25.02.13/bh1hgs1vu6si.png

Tu ich auch. Und ZACK, Abfrage Nummer 2 funktioniert nicht mehr!

What the fuck...?? Es ist eine absolut identische Abfrage, die einfach nicht funktioniert, stattdessen setzt sie Abfrage Nummer 2 sogar außer Gefecht. Ich kann keinen Fehler finden, bin seit Stunden hier beschäftigt und finde nichts.

Was ist daran falsch?

Ich muss 17 (!) Abfragen dieser Art machen und es scheitert bereits an der dritten bzw. die dritte Abfrage setzt alles außer Kraft. Wenn ich eine vierte Abfrage einbaue (für das darauffolgende Event) funktioniert das zweite wieder super, aber die dritte Abfrage ist außer Gefecht. WHAAAAT?? Mal ehrlich, was kann ich da tun?

Bitte um hilfreiche Vorschläge wie ich dieses Problem lösen kann, welches sich doch eigentlich so simpel anhört. -.-

Bitte postet hier nur, wenn ihr mir helfen könnt. Keine Vermutungen oder sonstiges. Nur konkrete Lösungsvorschläge !!

Hoffe einer von euch erfahrenen Technikern (sollte es dir geben....) kann mir helfen...

Hoffe auf hilfreiche Antworten...

Grüße TwoFace

Ringlord
25.02.2013, 23:56
Ich finde es einerseits relativ blöd, jede Abfrage in einem extra Event zu haben, und dann auch noch ohne minimalste Waits (möglich, dass sich die Abfragen da überlagern und gegenseitig ignorieren)
Schau doch mal im Test-Modus, was dieser beim jeweiligen Punkt für Variablen-Werte ausspuckt (F9).

Edit
Ich würde tatsächlich darauf tippen, dass es an den vielen Events liegt! Denn jedes davon tauscht praktisch zu jeder Zeit deinen Cursor aus, sprich auch wenn du auf einem Punkt hängst, werden die anderen Punkte abgefragt, und da der Zeiger nicht auf jenen hängt, wird ausgegraut!

TwoFace
26.02.2013, 00:01
Ich finde es einerseits relativ blöd, jede Abfrage in einem extra Event zu haben, und dann auch noch ohne minimalste Waits (möglich, dass sich die Abfragen da überlagern und gegenseitig ignorieren)
Schau doch mal im Test-Modus, was dieser beim jeweiligen Punkt für Variablen-Werte ausspuckt (F9).

ich wollte die Abfragen später in einen Event zusammenfassen, hab es auch schon testweise probiert. Aber die Abfragen funktionieren zusammen weder einzeln noch in einem Event zusammengefasst. Mit F9 hab ich die Werte der Variablen und Switches bereits mehrmals gecheckt. Die Werte befinden sich im von mir vorgegebenen Rahmen, demnach müsste die Abfrage eigentlich funktionieren - tut sie aber nicht.

Ringlord
26.02.2013, 00:09
Wie werden eigentlich die jeweiligen Gx-Switches aktiviert? Vlt ist da der Fehler.

Edit
Und denk mal an Waits, die können Wunder bewirken ;)

TwoFace
26.02.2013, 00:13
Die Switches aktiviere ich alle in einem Parallel Process. Die sind immer an, da is der Fehler nich.

Ringlord
26.02.2013, 00:23
Ich würde dennoch denken, dass das Problem in der gleichzeitigen Aktivierung aller Positionsabfragen verteilt über mehrere Events liegt, und durch die unterschiedliche Höhe der einzelnen IDs werden manche ignoriert bzw. als unwichtiger eingestuft und dementsprechend übergangen, und die ausbleibenden Waits tun dabei ihr übriges.

Es wäre vlt eine gute Idee, das Ding mal hochzuladen, falls es dir nicht zu schwer fällt ;)

BDraw
26.02.2013, 00:56
<>If Switch G3 = on
..<>If X < 224
....<>If X > 208
......<>If Y < 176
........<>If Y > 160
..........<>Show Picture: ROT
........:ELSE CASE
..........<>Show Picture: GRAU
........:END CASE
......:ELSE CASE
........<>Show Picture: GRAU
......:END CASE
....:ELSE CASE
......<>Show Picture: GRAU
....:END CASE
..:END CASE
:ELSE CASE
..<>Show Picture: GRAU
:END CASE
If1; If2; If3; If4; If5.
Gucken wir mal, was in G3 passiert, wenn die Maus auf G2, also bspw. (180|170), ist.

If1 - passt. Der Switch ist ja laut deiner Aussage so oder so an.
If2 - passt. X ist 180, das ist kleiner als 224.
If3 - passt nicht. 180 ist nicht größer als 208, wir gehen zum ELSE CASE, der Graue Mauszeiger wird angezeigt.

Joah, weiter würde ich erstmal nicht gucken. Deine Events kommen sich in die Quere; somit wie G3 durchlaufen wird, wird der rote Mauszeiger hier wieder auf Grau gesetzt, egal, was G2 dazu meint. Dass G2 wieder funktioniert wenn du ein G4 einbaust bekomme ich gerade zwar auch nicht ganz gepackt, aber dass du bei dem Code Probleme bekommst ist klar.


Ich würde es - so aus dem Kopf, also nicht getestet - so machen, ohne die ganzen einzelnen Codestücke:

SWITCHES
0001:G1 drauf
0002:G2 drauf
0003:G3 drauf

VARIABLEN
0001:Event X
0002:Event Y
0003:Switchpointer
0004:Maus X
0005:Maus Y


If V[0004:Maus X] > V[0001:Event X]
..<>V[0001] + 16
..If V[0004] < V[0001]
....If V[0005:Maus Y] > V[0002: Event Y]
....<>V[0002] + 16
......If V[0005] < V[0002]
........<>Switch [V[0003:Switchpointer] ON
......:ELSE CASE
........<>Switch [V[0003:Switchpointer] OFF
......:END CASE
....:ELSE CASE
......<>Switch [V[0003:Switchpointer] OFF
....:END CASE
..:ELSE CASE
....<>Switch [V[0003:Switchpointer] OFF
..:END CASE
:ELSE CASE
..<>Switch [V[0003:Switchpointer] OFF
:END CASE

<>V[0001:Event X], set 144
<>V[0002:Event Y], set 160
<>V[0003:Switchpointer], set 1
<>Call Event: Mausabfrage
<>V[0001] + 16
<>V[0003] + 1
<>Call Event: Mausabfrage
<>V[0001] + 16
<>V[0003] + 1
<>Call Event: Mausabfrage
<>If Switch[0001] = off
..<>If Switch[0002] = off
....<>If Switch[0003] = off
......<>Show Picture: GRAU
....:ELSE CASE
......<>Show Picture: ROT
....:END CASE
..:ELSE CASE
....<>Show Picture: ROT
..:END CASE
:ELSE CASE
..<>Show Picture: ROT
:END CASE
Das was sich da wiederholt sind immer die neuen mindest-X-Werte, hier demnach für deine 3 Events die du oben ind en Screenshots gezeigt hast. Da die bei dir alle exakt 16px auseinanderliegen wäre es unnötige Arbeit, jedesmal die Zahlen einzutippen, zumal sowas (zumindest bei mir) irgendwann zu Tippfehlern und somit lästigen Bugs führt... Wenn ALLE deine Events in einer Reihe und 16px auseinander liegen würde ich das mit einem Pointer sogar noch weiter zusammenfassen; bei 10 Events wäre das dann so:


<>V[0006:VPointer], set 10
<>Label: 1
<>V[0001] + 16
<>V[0003] + 1
<>Call Event: Mausabfrage
<>V[0006]-1
<>If V[0006] = 0
..<>Go to Label: 2
:ELSE CASE
..<>Go to Label: 1
:END CASE
<>Label: 2
Die Idee dahinter ist, dass du die Koordinaten des ersten Events angibst und der Maker sich die der anderen Events selbst ausrechnet. Wenn du echt 17 solcher Events hast und die regelmäßig auf der Map verteilt sind, würde ich sowas nehmen. Sonst bekommst du die Krise. ;)

Fuxfell
26.02.2013, 11:29
Verzweifle nicht, ich hab die Lösung :p

Sowas ähnliches habe ich mit DynRPG schonmal gebastelt, der Trick ist hier den Event IDs und den Call Commonevent auszunutzen.
(Vorsicht das ist alles in Pseudo Code jetzt, zur Not kann ich mal schaun ob ich das Projekt noch hab und es dir schicken.)

(Ich gehe mal davon aus, dass die Events Gegner sein sollen)
Vorbereitung:
Du solltest dir im Klaren sein, wieviel Gegner es maximal in einem Kampf geben soll, aus deinem ersten Post nehme ich mal an es sind 17. Jetzt legst du 17 Events hintereinander an, wichtig dabei, dass deren Event ID fortlaufend ist. (d.h. von z.B. 20-37)
Optimal ist es auch, wenn die Events hohe Event IDs besitzen, denn wenn du den Get Event ID-Befehl auf ein Feld benutzt auf dem mehrere Events liegen wird nur die höchste ID der Events zurück gegeben! (afaik)


Für die Mausabfrage benutzt du einen Parallelen Prozess. Du fragst die X- und Y-Koordinaten des Cursors ab und dann rechnest du sie ins Maker-Koordinatensystem um (einfach /16). Anschließend speicherst du die Event-ID an Maus-X-Grid und Maus-Y-Grid.
Nun fragst du ab, ob die Event ID größergleich deiner ersten Gegner-Event-ID (hier 20) und kleinergleich der größten ist (hier 37). Wenn ja => roten Cursor anzeigen, wenn nein => grauen.
Jetzt speicherst du die aktuellen Grid-Koordinaten in zwei Variablen (Grid-X-Old & Grid-Y-Old). In deinem Parallelen Prozess fragst du ab, ob sich die Grid-Position im Vergleich zu Grid-Old verändert hat, denn wenn nicht hast du das Feld bereits gecheckt und brauchsts ja nicht nochmal machen ;)
Ans Ende kannst du (glaube ich) einen 0.0 Wait für die Performance packen.

(Achtung Pseudo-Code)


Maus-Grid-X = Maus-Pos-X /16
Maus-Grid-Y = Maus-Pos-Y/16

if (Maus-Grid-X != Grid-X-Old || Maus-Grid-Y != Grid-Y-Old)
Grid-X-Old = Grid-X-Old
Grid-Y-Old = Grid-Y-Old
Event ID = Get Event ID (Maus-Grid-X, Maus-Grid-Y)
If (19 < Event ID < 38)
Cursor rot anzeigen
else
Cursor grau anzeigen
end
end

Wait 0.0


Ein einfacher Trick, um anklickbare Events zu machen ist, wenn du in den obigen Code noch einen Schnipsel mit dem Call Common Event einfügst und die erste Seite des Events aufrufst, dass du mit Get Event ID gespeichert hast.


if (Switch: Rechts Klick = ON)
Page ID = 1
If (19 < Event ID < 38)
Call Common Event (Event ID, Page ID)
end
end

MarcL
26.02.2013, 16:27
Hab nicht wirklich ne Ahnung aber...
...vielleicht kommt ja der Maker nicht klar, dass du in so vielen Parallelen Prozessen gleichzeitig immer wieder die Variablen MausX und MausY auslesen willst...
Vielleicht blockiert sich der Read Befehl oder was immer das ist, dann mit den anderen... u.U. gibts ja eine Lösung alle Events in einem Event zu testen ^^°

Cherry
26.02.2013, 20:55
Du hast da tatsächlich einfach ein Synchronisationsproblem: Die Events laufen gleichzeitig (intern blockweise, darum passiert bei 2 Events anscheinend noch nix), verwenden bei dir also gleichzeitig die Variablen 0002 und 0003, was natürlich nicht gehen kann.

TwoFace
27.02.2013, 16:48
Puh... schwere Geburt. Habs hinbekommen, Danke Leute.