hotspot-name am mauszeiger
hotspot-name am mauszeiger
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!
Danke im Voraus!
- Fightmeyer
- Riesiger Roboteraffe
- Beiträge: 7308
- Registriert: 16.12.2004, 22:51
- Wohnort: Potsdam
- Kontaktdaten:
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.
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.
-
- Adventure-Gott
- Beiträge: 4575
- Registriert: 13.07.2004, 14:04
- Wohnort: Da wo muss
- Kontaktdaten:
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
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
Ausnahmen bestätigen die Regel
_________________
<Problem> Weil du denken kannst.
Zuletzt bearbeitet von [ZENSIERT] am 16.07.1759, 16:19, insgesamt 54743869-mal bearbeitet
- Fightmeyer
- Riesiger Roboteraffe
- Beiträge: 7308
- Registriert: 16.12.2004, 22:51
- Wohnort: Potsdam
- Kontaktdaten:
- Dusty D.
- Hobby-Archäologe
- Beiträge: 153
- Registriert: 18.04.2004, 20:03
- Kontaktdaten:
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 - so ab Mitte der Page).
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 - so ab Mitte der Page).
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Anfang des global script:
in der repeatedly_execute:
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.:
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.
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@");
}
}
Code: Alles auswählen
oh.X=mouse.x+3;
oh.Y=mouse.y+3;
// oh.SetText(100, 1, 65503, "@overhotspot@");
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;
Use gopher repellent on funny little man
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
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:
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: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@".
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");
}
}
Label:
Code: Alles auswählen
gCurs.SetPosition(x+3, y+3);
label.SetText(desc);
Overlay:
Wie oben beschrieben, nur muss der letzte Parameter logischerweise der string desc sein, nicht "@overhotspot@".
Use gopher repellent on funny little man
-
- Hobby-Archäologe
- Beiträge: 163
- Registriert: 28.04.2005, 16:26
- Wohnort: Mönchengladbach
hier mal mein Vorschlag:
Braucht ein Gui namens "Mousetext" mit dem Label "lblmouse2".
In repeatedly_execute
Funktioniert aber nicht mit GUIControls.
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.