Please login or register.

Login with username, password and session length
Advanced search  

News:

For WME related articles and tutorials visit WME Resource Center.

Author Topic: Dialogy  (Read 8388 times)

0 Members and 1 Guest are viewing this topic.

Prot

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 5
    • View Profile
Dialogy
« on: December 04, 2008, 11:24:05 PM »

Zdravíčko,
v prvé řadě chci poděkovat tvůrcům WME a lidem zde pomáhajícím ostatním. Bohužel jsem se ve vývoji ale zaseknul na začátku u dialogů.

Mám scénu, ve které není actor, ale je tam pouze entita Strážce. Kliknu na Strážce a jemu se nad hlavou objeví pozdrav. Objeví se dialogové okno (response box), ve kterém mám otázky od actora. Ale

1) Když kliknu na otázku, Strážce odpoví textem nad jeho hlavou a hned za ním má mluvit actor, jehož text se nikde neobjeví, pak opět mluví Strážce a Strážcův text se normálně nad ním objeví. Nějak blbě jsem se v tom pohrabal a actor nemluví (resp. mluví pouze tehdy, když tam dám actor.Active = true; , ale to je zase vidět). Ve skriptu iniciujícím scénu (scene_init.script) mám

Code: [Select]

#include "scripts\base.inc"

var Strazce = Scene.LoadEntity("entities\Strazce\Strazce.entity");
 Strazce.Active = true;

global EmptyActor;
 actor.Active = false;

 global StateSchody;




Script entity Strážce je následující:


Code: [Select]
#include "scripts\base.inc"

function StrazceDialogue()
{
  var Responses;
  var Selected;
  var Loop = true;

  while(Loop)
  {
    // prepare the sentences
    Responses[0] = "Kdo jsi?";
Responses[1] = "Jak jsem se tady ocitnul?";
    Responses[2] = "Co mi můžeš říct o tom, kdo jsem?";
Responses[3] = "Jsem připravený ať už půjde o cokoli.";
    Responses[4] = "Myslím, že ještě nejsem na tuto cestu připravený.";

    // fill the response box
    Game.AddResponseOnceGame(0, Responses[0]);
    Game.AddResponse(1, Responses[1]);

    Selected = Game.GetResponse();

    if(Selected==0)
    {
  this.Talk("Test 1");
    actor.Talk("Actor mluvi 1a");
  this.Talk("Strazce mluvi 1");
  actor.Talk("Actor mluvi 1b");
        }

    else if(Selected==1)

 {
  this.Talk("Test 2");
    actor.Talk("Actor mluvi 2a");
  this.Talk("Strazce mluvi 2");
  actor.Talk("Actor mluvi 2b");
   
}
}
}


on "LeftClick"
{

  this.Talk("Vítej, už jsem tě očekával!");
  StrazceDialogue();
}



Bohužel jsem se hrabal ve všem možném a už nevím, kde je chyba :-(( Response box jsem vrátil na defaultní a pořád stejný problém - actor nemluví.


2) Rád bych udělal to, aby mi v Response boxu mluvila entita Strážce a actor (který na scéně není) - aby se jejich větičky střídaly a když by domluvily, objevilo by se mi tam dialogové okno s otázkama. Pak bych zase kliknul na otázku a v tomto samém okně by opět probíhal rozhovor.


Nějak jsem se v tom zaseknul a prosím tedy o pomoc...
Logged

Mnemonic

  • WME developer
  • Administrator
  • Addicted to WME forum
  • *
  • Karma: 41
  • Offline Offline
  • Gender: Male
  • Posts: 5683
    • View Profile
    • Dead:Code Site
Re: Dialogy
« Reply #1 on: December 05, 2008, 12:17:40 PM »

Kdyz je actor schovany (actor.Active = false;), tak mluvit nemuze, to je normalni. U her z pohledu prvni osoby se to zpravidla resi tak, ze se nahraje nejaka neviditelna entita (staci nejaky maly ctverecek s pruhledou barvou), tu entitu si umistis na obsazovku tam, dke chces mit titulek actora, a pak misto actor.Talk() se vola nejakaEntita.Talk();

Tvoje hra ma normalne actora, a schovavas ho jen v tehle jedne scene, nebo je to hra z prvniho pohledu a actor tam nebude nikdy?
Logged
Yes, I do have a twitter account
Please don't send me technical questions in private messages, use the forum. ::wave

Prot

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 5
    • View Profile
Re: Dialogy
« Reply #2 on: December 05, 2008, 04:10:55 PM »

Velice děkuji! Jednoduché řešení s virtuální entitou mě nenapadlo...
Actor tam ve hře nejspíše bude. Pokud bych se ale pro složitost rozhodl ho tam nedávat, hraje to nějakou roli, že se ptáš, jestli tam bude?

Měl bych ale dotaz na ty response boxy. Našel jsem tento skript:
http://forum.dead-code.org/index.php?topic=3033.0

Je to dobrý script, ale když dám entitě Strážce, aby mluvila, tak mi neotevírá pusu (což v klasickém .Talk dělá)

Btw. ve Strazce.entity je (default.sprite je nehybný, Strazce.sprite hýbe pusou)

Code: [Select]
 
SPRITE="entities\Strazce\default.sprite"
TALK="entities\Strazce\Strazce.sprite"

A taky nevím, jak do toho implementovat audio mluvení (což také v klasickém .Talk jde).

Zkrátka a dobře bych potřeboval, aby když se klikne na Strážce, tak se:
1) V rámečku dole zobrazí jeho ikonka a vedle ní věta, kterou mluví (tak, jak to provádí skript na výše uvedené stránce) - částečně by se to asi dalo nějak pořešit pomocí http://wiki.dead-code.org/wakka.php?wakka=IconBased&v=5ir , ale nevím jak na to.
2) Entita strážce začne hýbat ústy a mluvení bude i Audio (tak, jak se děje bez výše uvedeného skriptu)

Můžete mi prosím poradit, jak to udělat, aby tohle všechno šlo najednou? jsem začátečník a neumím to udělat tak, abych sestavil správně všechny scripty najednou.

Děkuji moc!
Logged

Mnemonic

  • WME developer
  • Administrator
  • Addicted to WME forum
  • *
  • Karma: 41
  • Offline Offline
  • Gender: Male
  • Posts: 5683
    • View Profile
    • Dead:Code Site
Re: Dialogy
« Reply #3 on: December 05, 2008, 04:36:24 PM »

Pokud bych se ale pro složitost rozhodl ho tam nedávat, hraje to nějakou roli, že se ptáš, jestli tam bude?
Pokud by actor nebyl videt nikdy, pak bych doporucil v game.script misto Game.LoadActor() dat primo nahrani te "virtualni entity".


Měl bych ale dotaz na ty response boxy. Našel jsem tento skript:
http://forum.dead-code.org/index.php?topic=3033.0

Je to dobrý script, ale když dám entitě Strážce, aby mluvila, tak mi neotevírá pusu (což v klasickém .Talk dělá)

Btw. ve Strazce.entity je (default.sprite je nehybný, Strazce.sprite hýbe pusou)
Protoze ten skript (zamerne) presmeruje volani Talk na ten portret (kdyby ten portret mel talk animaci, hybal by pusou on).
Myslim, ze by stacilo vsechny odkazy na "talkRobotEnt" nahradit sluvkem "this", a bude to fungovat tak jak chces.
Logged
Yes, I do have a twitter account
Please don't send me technical questions in private messages, use the forum. ::wave

Prot

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 5
    • View Profile
Re: Dialogy
« Reply #4 on: December 06, 2008, 12:47:06 AM »

Opět velice děkuju!
Strážce už hýbe pusou, mluví i zvukově (na to jsem přišel) a píše kam má :-)

Ještě by mě ale zajímalo, jak bych mohl udělat ten script univerzálně pro všechny entity a actory. Takhle jsem ve Strážcově scriptu vyměnil talkRobotEnt.něco za this.něco a tenhle speciální script funguje na Strážce (ukazuje jeho ikonku a vedle ní text). Takže když mi bude mluvit this.Talk(...); tak je to ok, ale když mluví Virtual.Talk(...); , tak je (pochopitelně) tam, kde je nastavený.
Nevím tedy, jak by se to dalo udělat univerzálně - pokud mluví this , mluví třeba jedním druhem hýbání sprite, písma, ikonky a hlasu a pokud by mluvil Virtual, mluvil by jiným druhem písma, měl by jinou ikonku (a jiný hlas).

Ta funkce mi teď vypadá takto:

Code: [Select]
method Talk(srcString, Soundfilename, srcActor, xPosition, Duration, TalkStances, TextAlignment)
{
    var twin;
if (srcActor == null) twin = "icon"; // basic window with ghost
else
twin = srcActor; // NPC window
 
var tmpState = Game.Interactive;
Game.Interactive = false;  // we save the interactivity state for later and turn it off
 
var dlgWin = Game.LoadWindow("interface\system\dijalog.window"); // load the dialogue window

var tString = Game.ExpandString(srcString);  // prepare the localized string to handle formatting
var tLength = tString.Length;
var lines = ToInt(tLength / 300) + 1; // find out how many lines will we need
 
dlgWin.SetImage("sprites/"+twin+".png");   // set the image
dlgWin.Y = 525;
 
          // set the caption parameters
this.SubtitlePosRelative = false;
this.SubtitlesPosXCenter = false;
this.SubtitlesWidth = 680;
this.SubtitlesPosX = 90;
 
if (xPosition != null) this.SubtitlesPosX = xPosition;
 
 
this.SubtitlesPosY = 630 + 15* lines;  // position the caption in the window based on number of lines
 
 
        this.SetFont("fonts\verdana.font"); // set the speech font
 
this.SoundPanning = false;  // make the sound centered
this.Talk(srcString, Soundfilename, null, "", "", 0);  // say the line
 
Game.UnloadObject(dlgWin);  // dispose of the window

Game.Interactive = tmpState;
 
}


Jinak s Vaším WME pracuju 4 dny a je to profesionální a přehledné. Akorát musím proniknout do scriptování víc. Mnohé jsem si našel, ale tyhle věci zatím ne.

Díky!
Logged

Mnemonic

  • WME developer
  • Administrator
  • Addicted to WME forum
  • *
  • Karma: 41
  • Offline Offline
  • Gender: Male
  • Posts: 5683
    • View Profile
    • Dead:Code Site
Re: Dialogy
« Reply #5 on: December 07, 2008, 10:02:16 AM »

To by se dalo udelat ruzne. Napada me napriklad...

1) Pouzit jmeno (.Name) mluvici postavy, a predpokladat, ze soubor s portretem se jmenuje stejne.
Kuprikladu entita by se jmenovala "strazce" (vlasnost NAME v definici entity), a ikona by byla ulozena v souboru "ikony\strazce.png".
Takze nahravani ikony by pak vypadalo treba: dlgWin.SetImage("ikony\" + this.Name + ".png");

2) Po nahrani entite nastavit cestu k ikone do nejake domluvene vlastnosti:

global Strazce = Game.LoadEntity("cesta\strazce.entity");
Strazce.CestaIkona = "ikony\strazce.png";

A nahrani ikony by pak vypadalo:

dlgWin.SetImage("ikony\" + this.CestaIkony + ".png");



Co se tyce mluveni, je asi lepsi nepsat cesty ke zvukum primo do skriptu, ale pouzit lokalizacni nastroje WME (string table). Pak je kazdy text ve hre vybaven unikatnim identifikatorem (pro poreby prekladu), a WME umi automaticky prehrat zvuk, ktery ma stejny nazev jako identifikator textu. Kuprikladu pokud nejaky skript obsahuje:

  actor.Talk("/str01234/Nazdarek!");
 
WME jednak prohleda tabulku textu (string table), a pokud obsahuje text s ID "str0124", pouzije ho. A krom toho se pokus najit soubor "speech\str01234.ogg", a pokud ho najde, automaticky ho prehraje. Vic informaci je v dokumentaci, kapitola "Localization support".
Logged
Yes, I do have a twitter account
Please don't send me technical questions in private messages, use the forum. ::wave

Prot

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 5
    • View Profile
Re: Dialogy
« Reply #6 on: December 07, 2008, 11:05:04 PM »

Opět děkuju, ale ještě pořád jsem to nedokázal udělat tak, jak bych chtěl. Obávám se, že jsem to ne úplně pobral. :-(
Dokázal bys mi prosím přepsat tu upravenou metodu Talk, kterou jsem minule dával do code tak, aby tam bylo nastavení jak pro Strazce.entity (který je v ní jako this, protože tento script dávám do strazce.script), tak pro Virtual.entity ?

Já to zkoušel laicky tak, že v tom method Talk scriptu jsem za

Code: [Select]
       this.SubtitlePosRelative = false;
this.SubtitlesPosXCenter = false;
this.SubtitlesWidth = 680;
this.SubtitlesPosX = 90;
 
if (xPosition != null) this.SubtitlesPosX = xPosition;
 
this.SubtitlesPosY = 630 + 15* lines;  // position the caption in the window based on number of lines
 
        this.SetFont("fonts\verdana.font"); // set the speech font
 
this.SoundPanning = false;  // make the sound centered
this.Talk(srcString, Soundfilename, null, "", "", 0);  // say the line

jsem dal

Code: [Select]
       Virtual.SubtitlePosRelative = false;
Virtual.SubtitlesPosXCenter = false;
Virtual.SubtitlesWidth = 680;
Virtual.SubtitlesPosX = 90;
 
if (xPosition != null) Virtual.SubtitlesPosX = xPosition;
 
 
Virtual.SubtitlesPosY = 630 + 15* lines;  // position the caption in the window based on number of lines
 
 
        Virtual.SetFont("fonts\verdana2.font"); // set the speech font
 
Virtual.SoundPanning = false;  // make the sound centered
Virtual.Talk(srcString, Soundfilename, null, "", "", 0);  // say the line


-tedy stejný kód, akorát jsem nahradil "this" za Virtual.

Když je this.Talk, tak je vše OK, ale když má promluvit Virtual, tak mluví 2x (jednou jako this a jednou jako Virtual).

Jinak díky moc a za trpělivost Ti pošlu na PayPal něco na pivko :-) A všechna čest tomu, co jste vytvořili a co děláte...
Logged

Mnemonic

  • WME developer
  • Administrator
  • Addicted to WME forum
  • *
  • Karma: 41
  • Offline Offline
  • Gender: Male
  • Posts: 5683
    • View Profile
    • Dead:Code Site
Re: Dialogy
« Reply #7 on: December 08, 2008, 10:56:02 AM »

Ted jsem to zase nepobral ja. Myslel jsem, ze chces aby mluvila postava ve scene, ne jeji potret. Pak tam musi byt this.Talk() (this = vlastnik skriptu = postava ve scene). Cil je, vytvorit jeden univerzalni skript pro mluveni s potretem. Tenhle *stejny* skript se pak pripoji ke vsem postavam ve hre.
Logged
Yes, I do have a twitter account
Please don't send me technical questions in private messages, use the forum. ::wave

Prot

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 5
    • View Profile
Re: Dialogy
« Reply #8 on: December 11, 2008, 02:17:49 PM »

Ahaaaa. Já měl ten univerzální script vložený ve skriptu entity Strážce (Strazce.script). Takže teď jsem vytvořil nový soubor talk.script, includnul jsem ho do scriptů Strazce.script a Virtual.script (-což je jakoby postava actora) a funguje vše OK.
Díky moc a omlouvám se za to, že jsem lama :-)
Logged

Chris

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 31
    • View Profile
Re: Dialogy
« Reply #9 on: October 21, 2009, 06:21:47 PM »

i can't use with animation charecter . plese help me

how do use "method Talk" with animation charecter  ???
Logged
 

Page created in 0.041 seconds with 20 queries.