flackernder Mauszeiger über Objekte

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
Dave_Doofy
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 61
Registriert: 23.12.2010, 11:45
Kontaktdaten:

flackernder Mauszeiger über Objekte

Beitrag von Dave_Doofy »

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
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/
Benutzeravatar
z10
Adventure-Gott
Adventure-Gott
Beiträge: 4869
Registriert: 26.12.2009, 12:10

Re: flackernder Mauszeiger über Objekte

Beitrag von z10 »

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.
“In my painful experience, the truth may be simple, but it is rarely easy.”
― Brandon Sanderson
Benutzeravatar
riv
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 137
Registriert: 02.02.2011, 14:03
Wohnort: Lübeck
Kontaktdaten:

Re: flackernder Mauszeiger über Objekte

Beitrag von riv »

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.
Benutzeravatar
Dave_Doofy
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 61
Registriert: 23.12.2010, 11:45
Kontaktdaten:

Re: flackernder Mauszeiger über Objekte

Beitrag von Dave_Doofy »

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
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/
Benutzeravatar
Dave_Doofy
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 61
Registriert: 23.12.2010, 11:45
Kontaktdaten:

Re: flackernder Mauszeiger über Objekte

Beitrag von Dave_Doofy »

Hotspot[0] bedeutet über keinem Hotspot (geht erst bei 1 los)

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/
Benutzeravatar
riv
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 137
Registriert: 02.02.2011, 14:03
Wohnort: Lübeck
Kontaktdaten:

Re: flackernder Mauszeiger über Objekte

Beitrag von riv »

Hotspot[0] bedeutet über keinem Hotspot (geht erst bei 1 los)
Ah ja sowas dachte ich mir schon, jo dann ist das Problem genauso, wie ich es vermutet hatte.
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)
Stimmt das geht auch. Ist nur die Frage ob das jetzt einfacher ist ;)

EDIT:
Leave Hotspot gibts leider nicht
Ok das ist schade, das habe ich jetzt gerade überlesen Du kannst es dann so machen:

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;
}
Ich weiß jetzt nicht ob das so elegant ist, aber sollte funktionieren ;)
Zuletzt geändert von riv am 13.02.2014, 12:09, insgesamt 1-mal geändert.
Benutzeravatar
z10
Adventure-Gott
Adventure-Gott
Beiträge: 4869
Registriert: 26.12.2009, 12:10

Re: flackernder Mauszeiger über Objekte

Beitrag von z10 »

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
Benutzeravatar
riv
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 137
Registriert: 02.02.2011, 14:03
Wohnort: Lübeck
Kontaktdaten:

Re: flackernder Mauszeiger über Objekte

Beitrag von riv »

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

Code: Alles auswählen

Object.GetAtScreenXY(mouse.x, mouse.y)
gibt (also anstatt Hotspot Object).

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();
}
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

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
}
Benutzeravatar
Dave_Doofy
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 61
Registriert: 23.12.2010, 11:45
Kontaktdaten:

Re: flackernder Mauszeiger über Objekte

Beitrag von Dave_Doofy »

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
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/
Benutzeravatar
riv
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 137
Registriert: 02.02.2011, 14:03
Wohnort: Lübeck
Kontaktdaten:

Re: flackernder Mauszeiger über Objekte

Beitrag von riv »

Kein Problem, freut mich, dass ich helfen konnte =)
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: flackernder Mauszeiger über Objekte

Beitrag von KhrisMUC »

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:

Code: Alles auswählen

  if (GetLocationType(mouse.x, mouse.y) == eLocationNothing)
Dann muss man auch nicht jeden Typ einzeln per .GetAtScreenXY() überprüfen.
Use gopher repellent on funny little man
Benutzeravatar
riv
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 137
Registriert: 02.02.2011, 14:03
Wohnort: Lübeck
Kontaktdaten:

Re: flackernder Mauszeiger über Objekte

Beitrag von riv »

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.
Antworten