IsTalking für Background-Speech und "IEHOVA"-Rätse

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Hüter des Heiligen Krans

IsTalking für Background-Speech und "IEHOVA"-Rätse

Beitrag von Hüter des Heiligen Krans »

1. Gibt es eine einfache Möglichkeit herauszufinden, ob ein Charakter noch redet oder schon aufgehört hat, wenn man Hintergrundsprache (SayBackground oder DisplaySpeechBackground) benutzt?

2. Weiß jemand einen Trick, wie ich mein Rätsel umsetzen könnte? Ich habe einen Raum - ähnlich der IEHOVA-Prüfung in Indy3: Der Spieler muß in einer Lavahöhle über die richtigen Pfähle laufen. Und wenn man auf einen Pfahl tritt, ändern sich die anderen Pfähle nach einer bestimmten Logik. Mein Problem ist, ich weiß nicht, wie ich das mit nur 20 Objekten umsetzen soll.
Smiley
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 163
Registriert: 28.04.2005, 16:26
Wohnort: Mönchengladbach

Beitrag von Smiley »

1. in AGS 2.7
character.speaking

also z.B.:

if (cEgo.Speaking == False)
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

2. Genau so ein Rätsel gibt es übrigens in Indy4 :)
Einen Trick gibt es nicht, aber es ist durchaus möglich, allerdings mit einer gehörigen Portion Skripten verbunden.

Mit einer der RawDraw-Funktionen kannst du ein beliebiges Sprite aus dem SpriteManager an eine Stelle des Raumes zeichnen lassen.
Im Bereich der Pfähle sollten keine walkable areas sein, außerdem musst Du mit Arrays die Koordinaten und den Zustand der Säulen verwalten.
Im global script musst Du den Linksklick abfangen, wenn der Spieler im entsprechenden Raum ist und der Bereich, wo die Pfähle sind, angeklickt wurde. Mit Walk(...eDirect) kannst Du dann die Hauptperson von Säule zu Säule laufen lassen. Usw. ;)

Das ist auf jeden Fall eine coole Herausforderung, wenn ich heute Langeweile habe, mach ich mich vielleicht selber mal dran.
Use gopher repellent on funny little man
Hüter des Heiligen Krans

Beitrag von Hüter des Heiligen Krans »

OK, danke. Das 2. mit dem Pfähle-Rätsel muss ich mal schauen.
Die Lösung zu 1. mit speaking funktioniert jedenfalls nicht, denn bei BackgroundSpeech liefert speaking immer nur false. Ich hatte gehofft, dass man vielleicht irgendwie über die Overlayfunktionen herausfinden kann, ob der Character fertig ist mit (Hintergrund-)Sprechen. Gibt es einen Trick?
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Versuchs mal so:
Du brauchst einen globalen Overlay, z.B.

Code: Alles auswählen

Overlay *bs;
export bs;
Wenn Du dann Say.Background aufrufst, schreibst Du

Code: Alles auswählen

bs=cEgo.SayBackground("bla");
Jetzt kannst Du mit

Code: Alles auswählen

if (bs.Valid)
testen, ob er angezeigt wird. Steht übrigens im Manual bei der Erklärung zu SayBackground. Komplett mit Fehler allerdings, da von Overlay.IsValid die Rede ist.
Use gopher repellent on funny little man
Hüter des Heiligen Krans

Beitrag von Hüter des Heiligen Krans »

Statt bei SayBackground nachzulesen habe ich mich lieber bei den Overlayfunktionen dusselig gesucht. :oops: :D

Jedenfalls Danke nochmals. :)
[ZENSIERT]
Adventure-Gott
Adventure-Gott
Beiträge: 4575
Registriert: 13.07.2004, 14:04
Wohnort: Da wo muss
Kontaktdaten:

Beitrag von [ZENSIERT] »

Gibt es auch eine Möglichkeit, die Textposition und -breite zu bestimmen? In LA-Spielen blieb die Schrift ja auch immer an einer Stelle, wenn es ein Background-Satz war

zeiger.X und zeiger.Y geben nur hyperdimensionale Werte zurück (d.h. außerhalb des Bildschirmbereiches)
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
Hüter des Heiligen Krans

Beitrag von Hüter des Heiligen Krans »

[ZENSIERT] hat geschrieben:zeiger.X und zeiger.Y geben nur hyperdimensionale Werte zurück (d.h. außerhalb des Bildschirmbereiches)
Ist mir leider auch aufgefallen.
Ich hege die Befürchtung, das geht nur mit den mit Create erstellten Overlays, nicht mit den mit SayBackground erstellten.
Sollte mal behoben werden
Hüter des Heiligen Krans

Beitrag von Hüter des Heiligen Krans »

Ich habe gerade zwei Möglichkeiten probiert, den Text am "Mitlaufen" zu hindern, und bin glorreich gescheitert:

1.) Den gesprochenen Text mit CreateTextual selbst erzeugen.
Problem: Wenn der Text zu kurz ist (z.B. "Oh."), dann landet er viel zu weit links. Man müßte den Text irgendwie zentriert ausgeben können bzw. vorher die tatsächlichen Pixel-Ausmaße ermitteln können.

2.) Ein unsichtbarer Charakter redet, während der Hauptcharakter weiterlaufen kann.
Problem: In Scrolling Rooms muß man die Position des unsichtbaren Charakters in jedem Schleifendurchlauf anpassen. Das geht zwar, aber leider zittert dann der Text wie verrückt.

Gibt's noch ne andere Lösungsidee? Ich bin mit meinem Latein jedenfalls am Ende. Das einfachste wär wirklich, im AGS eine Option reinzubauen: "Schrift läuft nicht mit dem Charakter mit"
[ZENSIERT]
Adventure-Gott
Adventure-Gott
Beiträge: 4575
Registriert: 13.07.2004, 14:04
Wohnort: Da wo muss
Kontaktdaten:

Beitrag von [ZENSIERT] »

Ich hab das schon längst gescriptet, habe aber riesige Probleme mit dem Abstand zum Rand bekommen. Hmmm....

Unsichtbarer Charakter? #-o Wieso bin ich da nicht drauf gekommen?
Ich versuch's mal.

P.S. Bei LA-Spielen ist der Text auch nie mitgescrollt ;)
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
Hüter des Heiligen Krans

Beitrag von Hüter des Heiligen Krans »

[ZENSIERT] hat geschrieben:P.S. Bei LA-Spielen ist der Text auch nie mitgescrollt ;)
Ja, eben. Genau deswegen muss ich ja auch den "unsichtbaren Sprecher" dauernd anpassen, sonst würde der ja mitsamt seinem Sprechtext weggescrollt, wenn der Hauptcharakter inzwischen weiterflitzt. Theoretisch funktioniert meine Lösung ;), praktisch zittert der Text beim Scrollen :cry: :( ](*,) (jedenfalls bei mir)

Wenn du (oder jemand anders) eine Lösung findest, dann nix wie her damit :)
[ZENSIERT]
Adventure-Gott
Adventure-Gott
Beiträge: 4575
Registriert: 13.07.2004, 14:04
Wohnort: Da wo muss
Kontaktdaten:

Beitrag von [ZENSIERT] »

Ich habe eigentlich kein Problem damit. :o
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
Hüter des Heiligen Krans

Beitrag von Hüter des Heiligen Krans »

[ZENSIERT] hat geschrieben:Ich habe eigentlich kein Problem damit. :o
Wie? MIT unsichtbarem Charakter, MIT Scrolling und OHNE Zittern?
Das will ich auch *strampel* *räbäääh* ;)

Machst du irgendwas anders?
Also ich merk mir bei jeder Ansage die aktuelle X/Y-Position des Hauptcharakters, stelle meinen unsichtbaren Stellverstreter an die gleiche Position und lasse IHN quatschen.
In der Zwischenzeit kann man mit dem Hauptcharakter rumrennen, ohne dass der Text hinterherkommt.

Damit der Unsichtbare dabei in breiten Räumen nicht wegscrollt, setze ich in jedem repeatedly_execute seine X/Y-Room-Koordinaten so zurück, dass er immer an den vorher gemerkten Screen-Koordinaten bleibt.
Aber wie gesagt: während des Scrollens zittert dummerweise der Text ganz schnell hin und her.

Oder hat die Auflösung Einfluss? (Ich benutze 320 x 200 x 16bit.)
:?: :?: :?:
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Code: Alles auswählen

// room script file

Overlay *bs;
int oldx;
int newx;

#sectionstart room_a  // DO NOT EDIT OR REMOVE THIS LINE
function room_a() {
  // script for Room: First time player enters screen

bs=Overlay.CreateTextual(220, 60, 40, 1, 65535, "Hallo.");
  
  oldx=GetViewportX();
}
#sectionend room_a  // DO NOT EDIT OR REMOVE THIS LINE

#sectionstart room_b  // DO NOT EDIT OR REMOVE THIS LINE
function room_b() {
  // script for Room: Repeatedly execute
  newx=GetViewportX();
  if (newx!=oldx) {
    bs.X=220-newx;
    oldx=newx;
  }
}
#sectionend room_b  // DO NOT EDIT OR REMOVE THIS LINE
Funktionert, als wäre das "Hallo." auf den background gemalt :)

EDIT: @Hüter: Ich hab mir den ganzen thread nochmal durchgelesen, bin mir aber immer noch nicht sicher, was genau Du eigentlich erreichen willst...
Use gopher repellent on funny little man
Hüter des Heiligen Krans

Beitrag von Hüter des Heiligen Krans »

Was ich erreich will?

1. Der Charakter soll im Hintergrund reden, so dass man nebenher schon was anderes machen kann (z.B. rumlaufen)
2. Es soll exakt so aussehen wie mit SayBackground (d.h. zentriert über dem Kopf des Charakters, und genausolange Anzeigedauer)
3. Wenn der Charakter inzwischen rumläuft, soll der Text trotzdem an der ursprünglichen Stelle stehenbleiben und nicht über dem Kopf des Charakters mitwandern
4. Wenn der Raum rumscrollt, soll der Text trotzdem an der gleichen Bildschirmposition stehenbleiben.

Ich suche eine Lösung, die alle vier Bedingungen erfüllt. :)
Antworten