Czech forum > Technické fórum

Čakanie programu na dokončenie animácie

(1/1)

!Errorcode!:
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: ---    .....
 
    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í
   .....

--- End code ---

NAItReIN:
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.

!Errorcode!:
Ani ma nenapadla jedna vec. V hre mám podobnú situáciu už zakomponovanú a tá funguje!


--- Code: ---        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;

--- End code ---

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.

NAItReIN:
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):

V scéne mám teda tri entity, ktorých názvy sú nasledujúce:

* DvereZatvorene
* DvereOtvaranie
* DvereOtvoreneKaždej horeuvedenej entity je priradený jeden a ten istý skript.
dvere.script


--- Code: WME Script ---#include "scripts\base.inc" global Room1; on "LeftClick"{  actor.GoTo(135, 398);  actor.TurnTo(DI_UP);    if(Room1.DvereOtvorene==false)  {    Game.Interactive = false;    actor.PlayAnim("actors\molly\uu\take1.sprite");    actor.PlayAnim("actors\molly\uu\take2.sprite");            var OtvorenieDveri = Scene.GetNode("DvereOtvaranie");    OtvorenieDveri.Active = true;    Room1.DvereOtvorene = true;    Sleep(13*100);    Game.Interactive = true;  }  else Game.ChangeScene("scenes\Room2\Room2.scene");} 
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 ---#include "scripts\base.inc" actor.SkipTo(400, 400);actor.Direction = DI_DOWN;actor.Active = true; global Room1; if(Room1==null){  Room1.DvereOtvorene = false;} if(Room1.DvereOtvorene){  // Animácia otvárania dverí sa nezobrazí  var DvereOtvaranie = Scene.GetNode("DvereOtvaranie");  DvereOtvaranie.Active = false;    // Zobrazia sa otvorené dvere  var DvereOtvorene = Scene.GetNode("DvereOtvorene");  DvereOtvorene.Active = true;}
Prosím, pozrite si video na YouTube:
https://youtu.be/l0DQdCIcaXQ

Navigation

[0] Message Index

Go to full version