Wintermute Engine Forum

Czech forum => Technické fórum => Topic started by: !Errorcode! on September 15, 2015, 10:10:07 PM

Title: Čakanie programu na dokončenie animácie
Post by: !Errorcode! on September 15, 2015, 10:10:07 PM
Zdravím zase. Riešim jeden docela problém, ktorý mi zase nedáva logiku. Situácia je jednoduchá. Mám v hre dvere, ktoré potrebujem otvoriť. Po kliknutí na dvere sa začnú otvárať - to jest spustí sa animácia otvárania dverí a zostanú otvorené. Ja som to riešil nasledovne:

1) Na začiatku sú zobrazené zatvorené dvere - entita s názvom ,,Dovnutra"
2) Pri kliknutí sa presne na tom istom mieste zobrazí entita ,,Otvorenie" - animácia kde sa otvárajú dvere. Ešte predtým sa ale vymaže pôvodná entita ,,Dovnutra".
3) Po prehratí animácie otvorenia dverí zmažem entitu ,,Otvorenie" a zobrazím entitu ,,dvere_otvorene", čo je len 1 obrázok - posledný z animácie otvárania dverí.

Je to pomerne komplikovaný spôsob aj keď docela logický, no nefunguje to ako by malo! Problém je, že sa to všetko vykoná v závislosti od rýchlosti procesora za pár stotín a animácia otvorenia dverí sa nestihne prehrať. Ako zabezpečiť aby hra počkala, kým sa neotvoria dvere, tj. kým neskončí animácia otvárania? Skúšal som to napr. tak, že som za tým vložil funkciu Sleep(2500); kde som dal 2500 ako dĺžku animácie otvárania. Hra zamrzla na Sleep a ďalej sa nepohla.

Zmazanie entity Otvorenie a následné nahranie už otvorených dverí som riešil pre to, lebo pri opustení scény a následnom návrate by sa entita ,,Otvorenie" vždy prehrala, a stále by sa otvárali dvere pri príchode do scény dokola.

Postnem časť mojho kódu. Ako by ste to riešili vy?

Code: [Select]
    .....
 
    EntDovnutra.Active = false;   // odstránenie pôvodných dverí
     // Game.Interactive = false;
     EntOtvorenie = Scene.LoadEntity("objekty\dvere\dvere.entity");
     EntOtvorenie.active = true;
     EntOtvorenie.SkipTo(515, 211);  // prehranie animácie otvárania dverí

     //Game.Interactive = false;
     //Sleep(2500);                (program pri tomto zastaví/zacyklí)
     //Game.Interactive = true;

      Game.DeleteEntity(EntOtvorenie);  // odstránenie entity otvárania dverí
      EntOtvorenie.active = false;
      dvere_otvorene = Scene.LoadEntity("objekty\dvere_otvorene\dvere_otvorene.entity");
      dvere_otvorene.active = true;
      dvere_otvorene.SkipTo(515, 211);  // zobrazenie jednoduchej entity - obrázku otvorených dverí
   .....
Title: Re: Čakanie programu na dokončenie animácie
Post by: NAItReIN on September 16, 2015, 12:07:07 AM
Niečo sa mi na tom nepáči. Nemyslím si, že by to mal byť veľký problém. Ak chceš pošli mi tie obrázky ako keď sme riešili ten problém minule.
Title: Re: Čakanie programu na dokončenie animácie
Post by: !Errorcode! on September 16, 2015, 11:24:54 PM
Ani ma nenapadla jedna vec. V hre mám podobnú situáciu už zakomponovanú a tá funguje!

Code: [Select]
        clovek_talk = Scene.LoadEntity("sprites/clovek_talk.entity");
clovek_talk.active = true;
clovek_talk.SkipTo(624, 205);
          Game.PlaySound("sounds/clovek_pozdrav.ogg");
  Sleep(2600);
          Game.DeleteEntity(clovek_talk);
  clovek_talk.active = false;

Tento kód pracuje vlastne rovnako. Kliknem, zobrazí sa animácia človeka, ktorý rozpráva ,,clovek_talk" a po čase Sleep(2600) ,,clovek_talk" zmizne. Ten čas som si dal ako dĺžku hovoreného slova.

O čo ide? Chcem aby funkcia Sleep zabezpečila, aby hráč videl animáciu otvárania dverí, bez nej to len preblikne, vykoná sa čo sa má, no nevidieť animáciu. Ak tam ten Sleep mám, dvere sa otvoria, no zostane to stáť a už sa nevykoná Game.DeleteEntity(EntOtvorenie);.. Jak je to možné, že to Sleep tu robí blbosti? Už to riešim naozaj dlho a nechápem. Každopádne tá istá situácia mi v tomto prípade ,,clovek_talk" funguje a pri dverách nie.
Title: Re: Čakanie programu na dokončenie animácie
Post by: NAItReIN on September 18, 2015, 07:01:45 PM
Ja som túto záležitosť riešil nasledujúcim spôsobom:

Poradie entít v scéne Room1 (scéna, kde sú dvere):
(http://s29.postimg.org/w9sigadrn/Scene_Edit_Room1.jpg) (http://postimg.org/image/w9sigadrn/)

V scéne mám teda tri entity, ktorých názvy sú nasledujúce:
Každej horeuvedenej entity je priradený jeden a ten istý skript.
dvere.script

Code: WME Script
  1. #include "scripts\base.inc"
  2.  
  3. global Room1;
  4.  
  5. on "LeftClick"
  6. {
  7.   actor.GoTo(135, 398);
  8.   actor.TurnTo(DI_UP);
  9.  
  10.   if(Room1.DvereOtvorene==false)
  11.   {
  12.     Game.Interactive = false;
  13.     actor.PlayAnim("actors\molly\uu\take1.sprite");
  14.     actor.PlayAnim("actors\molly\uu\take2.sprite");
  15.        
  16.     var OtvorenieDveri = Scene.GetNode("DvereOtvaranie");
  17.     OtvorenieDveri.Active = true;
  18.     Room1.DvereOtvorene = true;
  19.     Sleep(13*100);
  20.     Game.Interactive = true;
  21.   }
  22.   else Game.ChangeScene("scenes\Room2\Room2.scene");
  23. }
  24.  

Keď bola postava v ďalšej scéne, do ktorej sa dostane cez otvorené dvere, je potrebné, aby pri návrate z tejto scény boli dvere stále otvorené. Toto je riešené v scene_init.script scény Room1.

Code: WME Script
  1. #include "scripts\base.inc"
  2.  
  3. actor.SkipTo(400, 400);
  4. actor.Direction = DI_DOWN;
  5. actor.Active = true;
  6.  
  7. global Room1;
  8.  
  9. if(Room1==null)
  10. {
  11.   Room1.DvereOtvorene = false;
  12. }
  13.  
  14. if(Room1.DvereOtvorene)
  15. {
  16.   // Animácia otvárania dverí sa nezobrazí
  17.   var DvereOtvaranie = Scene.GetNode("DvereOtvaranie");
  18.   DvereOtvaranie.Active = false;
  19.  
  20.   // Zobrazia sa otvorené dvere
  21.   var DvereOtvorene = Scene.GetNode("DvereOtvorene");
  22.   DvereOtvorene.Active = true;
  23. }

Prosím, pozrite si video na YouTube:
https://youtu.be/l0DQdCIcaXQ