hotspot-name am mauszeiger

Der Anlaufpunkt für alle, die selbst ein Adventure programmieren wollen.
Antworten
Hollow Man

hotspot-name am mauszeiger

Beitrag von Hollow Man »

Haiho! Ich würde gerne den Namen des Hotspots, über dem sich der Cursor gerade befindet, direkt unter dem Cursor einblenden lassen. Könnte mir jemand sagen, wie das geht? Wäre übrigens ganz groß, wenn mir jemand auch noch die entsprechenden Script-Zeilen erlären könnte.
Danke im Voraus!
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7308
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Beitrag von Fightmeyer »

Du brauchst dafür ne Gui, mit nem Label drauf. In das Label muß @overhotspot@ stehen. Das ist quasi die Systemvariable, für den aktuellen Hotspot.

Jetzt müßtest Du im Code halt ledilgich abfragen, ob @overhotspot@ leer ist, oder eben nicht. Und wenn es nciht leer ist, dann soll die GUI angezeigt werden und zwar an der Position des Mauszeigers.

Alles weitere findest Du in der Hilfe. Hab jetzt allerdings kein Biespielcode parat.
[ZENSIERT]
Adventure-Gott
Adventure-Gott
Beiträge: 4575
Registriert: 13.07.2004, 14:04
Wohnort: Da wo muss
Kontaktdaten:

Beitrag von [ZENSIERT] »

Dann gibt's aber einen Bug, dass das Spiel crasht, sobald der Mauszeiger am rechten Rand ist. Ist hier irgendwo im Forum gelöst worden, aber weiß nimmer wo :oops:
Es heißt, Leute mit den originellsten Nicknames schreiben die besten Beiträge

Ausnahmen bestätigen die Regel
_________________
<Problem> Weil du denken kannst.

Zuletzt bearbeitet von [ZENSIERT] am 16.07.1759, 16:19, insgesamt 54743869-mal bearbeitet
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7308
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Beitrag von Fightmeyer »

Das sind Details, die man während der Programmierung dann halt abfangen muß. Sollte ja nciht das Problem sein. Wenn MausX-Wert über die maximale Anzahl an waagerechten Pixeln hinausgehen sollte, dann setzt man die GUI halt weiter links.
Benutzeravatar
Dusty D.
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 153
Registriert: 18.04.2004, 20:03
Kontaktdaten:

Beitrag von Dusty D. »

Also, ich nehm mal so an, Ihr redet von AGS :)

Da hab ich mal testhalber genau so was ausprobiert. Zumindest, wenn man auf die GUI verzichtet, sondern mit normalen Textoverlays arbeitet, gibt es keine Probleme mit den Rändern. Die Vor- und Nachteile und die aufgetretenen Probleme habe ich im Longtrip-Thread beschrieben (guckst du hier bei Interesse: http://www.adventure-treff.de/forum/vie ... &start=105 8) - so ab Mitte der Page).
Das Long Trip-Projekt

"Lauf nicht weg!"
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Anfang des global script:

Code: Alles auswählen

Overlay *oh;

function on_event(EventType event, int data) {
  if (event==eEventEnterRoomBeforeFadein) {
    oh=Overlay.CreateTextual(0, 0, 100, 1, 65503, "@overhotspot@");
  }
}
in der repeatedly_execute:

Code: Alles auswählen

  oh.X=mouse.x+3;
  oh.Y=mouse.y+3;
  // oh.SetText(100, 1, 65503, "@overhotspot@");
100: Breite in pixeln
1: Schrift
65503: Farbe, weiß

Eventuell musst du die beiden slashes aus der rep_ex entfernen, damit der text aktualisiert wird, also den SetText-Befehl aktivieren.

Das on_event-Zeug ist notwendig, da beim Verlassen eines Raumes die Overlays gelöscht werden.
Da @overhotspot@="", wenn nichts unter dem cursor ist, kann der Overlay ruhig die ganze Zeit angezeigt werden.
Eventuell musst du für den rechten Rand etwas ausführlicher werden, z.B.:

Code: Alles auswählen

  int x=mouse.x;
  if (x>250) x=250;
  oh.X=x;
Leider kann man nicht abfragen, wie breit der Text des Overlays ist; wenn die Zeichen der verwendeten Schrift allerdings eine feste Breite haben, könnte man es berechnen. @overhotspot@ nützt dann nix mehr, in dem Fall muss man selber mit GetAtScreenXY den Namen des Hotspots/Objects/Characters ermitteln.
Use gopher repellent on funny little man
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Sorry für den Doppelpost, aber sonst geht die Übersicht völlig flöten.

Die obige Methode funktioniert NUR mit hotspots (also z.B. nicht mit Objekten)!
Man muss also auf GetAtScreenXY zurückgreifen.
Mir ist eingefallen, dass ich in einem angefangenen Game bereits etwas ähnliches verwende, hier der Anfang der rep_ex:

Code: Alles auswählen

  int x=mouse.x;
  if (x>250) x=250;
  int y=mouse.y;

  Hotspot *hot;
  Object *obj;
  Character *cha;
  InventoryItem *invi;
  GUIControl *gco;
  string desc;
  StrCopy(desc, "");
  
  obj=Object.GetAtScreenXY(x, y);
  hot=Hotspot.GetAtScreenXY(x, y);
  cha=Character.GetAtScreenXY(x, y);
  invi=InventoryItem.GetAtScreenXY(x, y);
  gco=GUIControl.GetAtScreenXY(x, y);
  
  if (invi!=null) {
    invi.GetName(desc);
  }
  else if (obj!=null) {
    obj.GetName(desc);
  }
  else if (cha!=null) {
    StrCopy(desc, cha.name);
  }
  else if (hot.ID!=0) {
    hot.GetName(desc);
  }
  if (gco!=null) {
    if (gco==load) {
      StrCopy(desc, "load game");
    }
    else if (gco==save) {
      StrCopy(desc, "save game");
    }
    else if (gco==quit) {
      StrCopy(desc, "quit game");
    }
  }
Soweit, so gut. (Die Reihenfolge der if-Abfragen legt hier die Priorität fest, befindet sich der Cursor z.B. über einem Charakter und einem Hotspot, wird der Name des Charakters angezeigt. In meinem Skript wird am Ende die GUIControl abgefragt, diesmal nicht mit else if, sondern nur mit if, folglich haben GUIControls höchste Priorität.)

Label:

Code: Alles auswählen

  gCurs.SetPosition(x+3, y+3);
  label.SetText(desc);
Voraussetzung ist natürlich ein transparentes GUI mit Namen CURS, auf dem ein Label namens label ist. In diesem Fall braucht man auch die on_event-funktion nicht.

Overlay:
Wie oben beschrieben, nur muss der letzte Parameter logischerweise der string desc sein, nicht "@overhotspot@".
Use gopher repellent on funny little man
Smiley
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 163
Registriert: 28.04.2005, 16:26
Wohnort: Mönchengladbach

Beitrag von Smiley »

hier mal mein Vorschlag:


Braucht ein Gui namens "Mousetext" mit dem Label "lblmouse2".
In repeatedly_execute

Code: Alles auswählen

string objname;

GetLocationName(mouse.x, mouse.y, objname);

if (StrComp(objname, "") == 0)
   gMousetext.Visible=false;

   else {gMousetext.Visible=true;
         lblmouse2.Width=StrLen(objname) * 5; //Zahl kann je nach Font variieren
         gMousetext.Width=lblmouse2.Width;
         gMousetext.X=mouse.x;
         gMousetext.Y=mouse.y;
         lblmouse2.SetText(objname);
         }

Funktioniert aber nicht mit GUIControls.
Antworten