flackernder Mauszeiger über Objekte
- Dave_Doofy
- Verpackungs-Wegwerfer
- Beiträge: 61
- Registriert: 23.12.2010, 11:45
- Kontaktdaten:
flackernder Mauszeiger über Objekte
Hallo Leute,
ich habe ein kleins Problem mit den Mauszeigern.
Folgendes:
Ich habe eingebaut, dass bei einem Hotspot (Tür) der Mauszeiger zu einem Pfeil wird:
function hContuer2_MouseMove()
{
mouse.UseModeGraphic(eModeGotoleft);
}
und dann, das der Zeiger wieder "normal" wird in RepExec:
function room_RepExec()
{
if (Hotspot.GetAtScreenXY(mouse.x, mouse.y)==hotspot[0])
mouse.UseDefaultGraphic();
}
Jetzt ist es so, dass ich bereits eingebaut hatte, dass der Mauszeiger für "Interact" auf Objekten sich auch ändert (von normaler Hand zu Fingerzeigende Hand)
Aber seit ich das mit dem "eModeGotoleft" eingebaut habe "flackert" der Mauszeiger zwischen Hand und Fingerzeigende Hand wenn er über einem Objekt steht.
Hat jemand bitte einen Tipp für mich wie ich das beheben könnte?
vielen Dank
Grüße
Dave
ich habe ein kleins Problem mit den Mauszeigern.
Folgendes:
Ich habe eingebaut, dass bei einem Hotspot (Tür) der Mauszeiger zu einem Pfeil wird:
function hContuer2_MouseMove()
{
mouse.UseModeGraphic(eModeGotoleft);
}
und dann, das der Zeiger wieder "normal" wird in RepExec:
function room_RepExec()
{
if (Hotspot.GetAtScreenXY(mouse.x, mouse.y)==hotspot[0])
mouse.UseDefaultGraphic();
}
Jetzt ist es so, dass ich bereits eingebaut hatte, dass der Mauszeiger für "Interact" auf Objekten sich auch ändert (von normaler Hand zu Fingerzeigende Hand)
Aber seit ich das mit dem "eModeGotoleft" eingebaut habe "flackert" der Mauszeiger zwischen Hand und Fingerzeigende Hand wenn er über einem Objekt steht.
Hat jemand bitte einen Tipp für mich wie ich das beheben könnte?
vielen Dank
Grüße
Dave
Aktuelles Projekt
Jack Crow - Flucht aus der Zukunft
Demovideos unter:
http://www.youtube.com/watch?v=HECTWBRoWGI
Website mit Projektblog und kleinem Background Tutorial
http://dadsoft.jimdo.com/
Jack Crow - Flucht aus der Zukunft
Demovideos unter:
http://www.youtube.com/watch?v=HECTWBRoWGI
Website mit Projektblog und kleinem Background Tutorial
http://dadsoft.jimdo.com/
- z10
- Adventure-Gott
- Beiträge: 4984
- Registriert: 26.12.2009, 12:10
Re: flackernder Mauszeiger über Objekte
Da ich nicht mit AGS arbeite, kann ich nur sagen: bessere Konditionen setzen.
Ich könnte es mir folgendermaßen vorstellen:
Eine Funktion die jeden Tick ausgeführt wird.
Dort schaust du, wo der Mauszeiger steht. Und dann:
If (over tür) AND (mouse cursor not equal to türzeiger) then set mouse cursor to türzeiger
else if (over inspectable object) AND (mouse cursor not equal to inspect) then set mouse cursor to inspect
else if (not over inspectable object) AND (mouse cursor not equal to default) then set mouse cursor to default
else do nothing
So könnte man sich eine Logikkette vorstellen.
Die Priorität nimmt von oben nach unten ab, also wenn man über einer Tür und einem inspizierbarem Objekt ist, dann würde es bspw. den Türzeiger anzeigen, die Reihenfolge kann man natürlich einstellen, wie es einem am sinnvollsten erscheint.
Wenn der Mousezeiger schon die richtige Form hat, wird garnichts gemacht und zusammen mit den else-Ausdrücken sollte eigentlich kein Flackern möglich sein.
Ich könnte es mir folgendermaßen vorstellen:
Eine Funktion die jeden Tick ausgeführt wird.
Dort schaust du, wo der Mauszeiger steht. Und dann:
If (over tür) AND (mouse cursor not equal to türzeiger) then set mouse cursor to türzeiger
else if (over inspectable object) AND (mouse cursor not equal to inspect) then set mouse cursor to inspect
else if (not over inspectable object) AND (mouse cursor not equal to default) then set mouse cursor to default
else do nothing
So könnte man sich eine Logikkette vorstellen.
Die Priorität nimmt von oben nach unten ab, also wenn man über einer Tür und einem inspizierbarem Objekt ist, dann würde es bspw. den Türzeiger anzeigen, die Reihenfolge kann man natürlich einstellen, wie es einem am sinnvollsten erscheint.
Wenn der Mousezeiger schon die richtige Form hat, wird garnichts gemacht und zusammen mit den else-Ausdrücken sollte eigentlich kein Flackern möglich sein.
“In my painful experience, the truth may be simple, but it is rarely easy.”
― Brandon Sanderson
Chatkontrolle stoppen
― Brandon Sanderson
Chatkontrolle stoppen
- riv
- Hobby-Archäologe
- Beiträge: 137
- Registriert: 02.02.2011, 14:03
- Wohnort: Lübeck
- Kontaktdaten:
Re: flackernder Mauszeiger über Objekte
Also ich habe zwar keine Ahnung von AGS, aber wenn ich das richtig sehe, setzt du den Mauszeiger immer auf Default, wenn er sich über hotspot[0] befindet. Was genau ist der hotspot[0]? Wenn der hotspot[0] sowas, wie der Hintergrund ist, dann müsste er zwischen den Default Zeiger (ist das vielleicht die Hand?) und der Fingerzeigende Hand immer hin und herspringen. Das könnte man beheben, indem du den Zeiger nur zurück setzt wenn die Maus die Tür verlässt (sowas wie ein "OnMouseLeave" Event) und nicht immer wenn er auf den hotspot[0] ist. Sind aber alles nur Vermutungen erstmal, da ich nicht weiß was hotspot[0] ist und ich nicht weiß wie die interact Methode aussieht.
- Dave_Doofy
- Verpackungs-Wegwerfer
- Beiträge: 61
- Registriert: 23.12.2010, 11:45
- Kontaktdaten:
Re: flackernder Mauszeiger über Objekte
Danke schon mal für den Tip
wobei ich denke das es einfacher gehen muss
eigentlich muss nur hinter die Abfrage:
if (Hotspot.GetAtScreenXY(mouse.x, mouse.y)==hotspot[0])
nur noch die Abfrage ob der Mauszeiger auch nicht auf einem Objekt steht. (and Mouszeiger on no Object)
nur weiss ich leider die Syntax nicht
wobei ich denke das es einfacher gehen muss
eigentlich muss nur hinter die Abfrage:
if (Hotspot.GetAtScreenXY(mouse.x, mouse.y)==hotspot[0])
nur noch die Abfrage ob der Mauszeiger auch nicht auf einem Objekt steht. (and Mouszeiger on no Object)
nur weiss ich leider die Syntax nicht
Aktuelles Projekt
Jack Crow - Flucht aus der Zukunft
Demovideos unter:
http://www.youtube.com/watch?v=HECTWBRoWGI
Website mit Projektblog und kleinem Background Tutorial
http://dadsoft.jimdo.com/
Jack Crow - Flucht aus der Zukunft
Demovideos unter:
http://www.youtube.com/watch?v=HECTWBRoWGI
Website mit Projektblog und kleinem Background Tutorial
http://dadsoft.jimdo.com/
- Dave_Doofy
- Verpackungs-Wegwerfer
- Beiträge: 61
- Registriert: 23.12.2010, 11:45
- Kontaktdaten:
Re: flackernder Mauszeiger über Objekte
Hotspot[0] bedeutet über keinem Hotspot (geht erst bei 1 los)
Leave Hotspot gibts leider nicht
Leave Hotspot gibts leider nicht
Aktuelles Projekt
Jack Crow - Flucht aus der Zukunft
Demovideos unter:
http://www.youtube.com/watch?v=HECTWBRoWGI
Website mit Projektblog und kleinem Background Tutorial
http://dadsoft.jimdo.com/
Jack Crow - Flucht aus der Zukunft
Demovideos unter:
http://www.youtube.com/watch?v=HECTWBRoWGI
Website mit Projektblog und kleinem Background Tutorial
http://dadsoft.jimdo.com/
- riv
- Hobby-Archäologe
- Beiträge: 137
- Registriert: 02.02.2011, 14:03
- Wohnort: Lübeck
- Kontaktdaten:
Re: flackernder Mauszeiger über Objekte
Ah ja sowas dachte ich mir schon, jo dann ist das Problem genauso, wie ich es vermutet hatte.Hotspot[0] bedeutet über keinem Hotspot (geht erst bei 1 los)
Stimmt das geht auch. Ist nur die Frage ob das jetzt einfacher istwobei ich denke das es einfacher gehen muss
eigentlich muss nur hinter die Abfrage:
if (Hotspot.GetAtScreenXY(mouse.x, mouse.y)==hotspot[0])
nur noch die Abfrage ob der Mauszeiger auch nicht auf einem Objekt steht. (and Mouszeiger on no Object)
EDIT:
Ok das ist schade, das habe ich jetzt gerade überlesen Du kannst es dann so machen:Leave Hotspot gibts leider nicht
globale Variable:
Code: Alles auswählen
bool isDefaultMouse;
Code: Alles auswählen
function room_RepExec()
{
if (Hotspot.GetAtScreenXY(mouse.x, mouse.y)==hotspot[0] && !isDefaultMouse)
{
mouse.UseDefaultGraphic();
isDefaultMouse = true;
}
}
function hContuer2_MouseMove()
{
mouse.UseModeGraphic(eModeGotoleft);
isDefaultMouse = false;
}
Zuletzt geändert von riv am 13.02.2014, 12:09, insgesamt 1-mal geändert.
- z10
- Adventure-Gott
- Beiträge: 4984
- Registriert: 26.12.2009, 12:10
Re: flackernder Mauszeiger über Objekte
Was ist denn an Else if kompliziert? Ist doch viel sinnvoller alles in einer Funktion zu vereinen.
“In my painful experience, the truth may be simple, but it is rarely easy.”
― Brandon Sanderson
Chatkontrolle stoppen
― Brandon Sanderson
Chatkontrolle stoppen
- riv
- Hobby-Archäologe
- Beiträge: 137
- Registriert: 02.02.2011, 14:03
- Wohnort: Lübeck
- Kontaktdaten:
Re: flackernder Mauszeiger über Objekte
Naja kompliziert ist das beides nicht, aber aufwendiger als wenn es ein MouseLeave Event geben würde Achso ansonsten gebe ich dir natürlich recht schöner ist das alles in einer Funktion zu vereinen. Ich wollte ansich auch nur den Fehler aufdecken so dass man weiß was man ändern muss. Wie man das jetzt macht würde ich dann den Entwickler überlassen. Vor allem weil ich keine Ahnung von AGS habe und auch nicht den ganzen Zusammenhang sehe.
Edit:
Mir ist noch eingefallen, dass es bestimmt auch sowas wie
gibt (also anstatt Hotspot Object).
Dann könntest du das so machen, wie du vorgeschlagen hast:
Ich glaube das würde dann genau dem entsprechen, was du haben willst
Na ich war mal fleißig im folgenden so wie z10 vorgeschlagen hat. Bzw. anstatt der if then hab ich ne Hashmap gemacht. Habe jetzt eine AGS Doku gefunden:
http://www.adventuregamestudio.co.uk/wiki/Scripting
Edit:
Mir ist noch eingefallen, dass es bestimmt auch sowas wie
Code: Alles auswählen
Object.GetAtScreenXY(mouse.x, mouse.y)
Dann könntest du das so machen, wie du vorgeschlagen hast:
Code: Alles auswählen
function room_RepExec()
{
if ( (Hotspot.GetAtScreenXY(mouse.x, mouse.y)==hotspot[0]) && (Object.GetAtScreenXY(mouse.x, mouse.y) == null) )
mouse.UseDefaultGraphic();
}
Na ich war mal fleißig im folgenden so wie z10 vorgeschlagen hat. Bzw. anstatt der if then hab ich ne Hashmap gemacht. Habe jetzt eine AGS Doku gefunden:
http://www.adventuregamestudio.co.uk/wiki/Scripting
Code: Alles auswählen
function room_RepExec()
{
Object hObj = Object.GetAtScreenXY(mouse.x, mouse.y);
Hotspot hSpot = Hotspot.GetAtScreenXY(mouse.x, mouse.y);
CursorMode Cursors[4] = {eModeGameDefault, eModeGotoleft, eModeDefaultObject, eModeHand}; //Hier stehen die ganzen Cursors drin, kann beliebig erweitert werden.
CursorId = (hObj != null)? hObj.ID : (hSpot != hotspot[0])? hSpot.ID : 0; //Objekte haben hoehere Prioritaet als Hotspots. Die ID eines Objektes/Hotspottes gibt an welcher Cursor verwendet werden soll.
if (CursorId > 3 || CursorId < 0) CursorId = 0; //Zur Sicherheit Array OutOfBounds verhindern
mouse.UseModeGraphic(Cursors[CursorId]); //Setze MausCursor je nach Hotspot/Objekt
}
- Dave_Doofy
- Verpackungs-Wegwerfer
- Beiträge: 61
- Registriert: 23.12.2010, 11:45
- Kontaktdaten:
Re: flackernder Mauszeiger über Objekte
ja das mit
Object.GetAtScreenXY(mouse.x, mouse.y)
hatte ich auch probiert. Bin aber nicht auf "null" gekommen.
hatte es dann mit einem nicht existierenden Objekt [20] "verneint" probiert, ging abr nicht
Aber so is super!!!!!!
klappt wunderbar
Herzlichen Dank
cool genau so wollte ich es haben
=D>
Danke Leute für die schnelle und kompetente Hilfe
Dave
Object.GetAtScreenXY(mouse.x, mouse.y)
hatte ich auch probiert. Bin aber nicht auf "null" gekommen.
hatte es dann mit einem nicht existierenden Objekt [20] "verneint" probiert, ging abr nicht
Aber so is super!!!!!!
klappt wunderbar
Herzlichen Dank
cool genau so wollte ich es haben
=D>
Danke Leute für die schnelle und kompetente Hilfe
Dave
Aktuelles Projekt
Jack Crow - Flucht aus der Zukunft
Demovideos unter:
http://www.youtube.com/watch?v=HECTWBRoWGI
Website mit Projektblog und kleinem Background Tutorial
http://dadsoft.jimdo.com/
Jack Crow - Flucht aus der Zukunft
Demovideos unter:
http://www.youtube.com/watch?v=HECTWBRoWGI
Website mit Projektblog und kleinem Background Tutorial
http://dadsoft.jimdo.com/
- riv
- Hobby-Archäologe
- Beiträge: 137
- Registriert: 02.02.2011, 14:03
- Wohnort: Lübeck
- Kontaktdaten:
Re: flackernder Mauszeiger über Objekte
Kein Problem, freut mich, dass ich helfen konnte =)
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: flackernder Mauszeiger über Objekte
Ich will ja niemandem in die Suppe spucken, aber wie bitte soll dieser Code funktionieren? AGS unterstützt keine array literals, und auch nicht die ? : Notation. Und die ID als cursormode verwenden klappt unter keinen Umständen.
Die Lösung ist allerdings simpel: einfach statt einer Abfrage bzgl. hotspot[0] das hier verwenden:
Dann muss man auch nicht jeden Typ einzeln per .GetAtScreenXY() überprüfen.
Die Lösung ist allerdings simpel: einfach statt einer Abfrage bzgl. hotspot[0] das hier verwenden:
Code: Alles auswählen
if (GetLocationType(mouse.x, mouse.y) == eLocationNothing)
Use gopher repellent on funny little man
- riv
- Hobby-Archäologe
- Beiträge: 137
- Registriert: 02.02.2011, 14:03
- Wohnort: Lübeck
- Kontaktdaten:
Re: flackernder Mauszeiger über Objekte
Na ich habe ja gesagt, dass ich nicht weiß wie weit was von AGS unterstützt wird, aber man kann ja ohne Probleme die ?: durch if then ersetzen und die Werte dem Array einzeln zuweisen. Also das sollte ja nun echt kein Problem sein. Und die ID dient ja nur als Index für das Array. Ich war jetzt davon ausgegangen, dass die ID ganzzahligen Typs ist, die man selber festlegen kann. Aber wie auch immer der Quelltext soll nur die Idee vermitteln und nicht den perfekten fertigen Programmcode.