Forum d'entraide à la création de jeux d'aventure
 
PortailAccueilFAQRechercherS'enregistrerMembresConnexion

Partagez | 
 

 Animation unique, annulé dès que le joueur bouge [RESOLU]

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
XZS
Adepte de la Grande Tasse Bleue
Adepte de la Grande Tasse Bleue


Nombre de messages : 66

Age : 35

Localisation : A porté de fusil de Paris

Date d'inscription : 24/04/2013


MessageSujet: Animation unique, annulé dès que le joueur bouge [RESOLU]   Lun 13 Mai 2013 - 23:41

Hey,

promis c'est la dernière requête que je fais pour toute la semaine !

J'aimerai que mon personnage change de "view" suite à une interaction avec un hotspot,
puis, dès que le joueur se déplace, le personnage reprend sa view normale.

Dans mon cas, le joueur arrive sur un dancefloor et, quand il clique dessus, le personnage se met à danser à l'infini,
tant que le joueur ne se déplace pas ou ne clique pas sur un autre hotspot/region/perso/...

J'ai tenté une approche dans le code de ma room :
Code:
function hHotspot1_Interact() //j'ai d'abord tenté avec une région, mais pas de succès
                                  //avec les "Walk On Region" et "While Standing On Region", etc.)
{
  cKeum.LockView(6); //cKeum est le perso. La view 6 contient les animations uniques, dont la danse.
cKeum.Animate(1, 1, eRepeat, eNoBlock, eForwards);

if (cKeum.Moving){ // Là, je tente un truc, un peu au pif je dois bien l'admettre.
                  //Mais j'ai pas encore trouvé d'alternative...
cKeum.UnlockView();
cKeum.ChangeView(4); //On revient à la view normale du perso, avec ses loops de déplacements de base.
}}

Dans l'immédiat, mon personnage change bien de view et de loop. Mais dès que je me déplace, AGS continue d'utiliser la même view, au lieu de revenir à celle de base. J'imagine que le "cKeum.Moving" est foireux. J'ai pas bien pigé comment on dit à AGS "si le joueur se déplace, alors fait ceci".

_________________


Dernière édition par XZS le Ven 17 Mai 2013 - 8:46, édité 2 fois (Raison : [RESOLU])
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.youtube.com/LBQ3TS
Shai-la
Ouvrière en Chef de la Grande Tasse Bleue
Ouvrière en Chef de la Grande Tasse Bleue


Nombre de messages : 5376

Age : 38

Localisation : Montpellier

Date d'inscription : 17/04/2006


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Mar 14 Mai 2013 - 9:20

Essaye : if (cKeum.Speed > 0)

_________________
Mon profil Facebook!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 2430

Date d'inscription : 01/08/2006


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Mar 14 Mai 2013 - 9:27

XZS a écrit:
J'imagine que le "cKeum.Moving" est foireux. J'ai pas bien pigé comment on dit à AGS "si le joueur se déplace, alors fait ceci".
En fait ta conditonnelle est vraiment pas mal, mais elle ne se trouve pas au bon endroit. Ce qu'il faut comprendre c'est qu'une fonction est exécutée une fois, dans un intervalle durant lequel le jeu ne "défile" pas, puis une fois qu'elle a fini d'être exécutée, le le "défilement" reprend. Donc ta fonction sur l'interaction là va se déclencher lors du clic sur le hotspot, et à ce moment précis le joueur ne se déplace pas (ou plus). C'est à ce moment précis que le contenu de la fonction va être exécuté, et donc c'est à ce moment là que ton if va être exécuté et évidemment, cKeum.Moving retournera false.

Ce que toi tu voudrais, c'est bien lancer cette animation, puis vérifier à chaque intervalle, à chaque cycle de jeu suivant si le personnage se déplace. Pour cela, une façon de faire est de placer ton if dans la fonction room_RepExec, dont la spécificité est justement de s'exécuter à chaque cycle de jeu, à chaque intervalle (tu la crées en cliquant sur la ligne voulue dans les événements de la pièce -- après un clic sur l'éclair jaune/orange).
Toutefois comme je l'ai dit plus haut, tu ne veux exécuter ce if que après que tu auras commencé à faire danser le joueur. Heureusement, il est facile de voir si le joueur a commencé à danser : s'il le fait, sa vue en cours sera la vue numéro 6, puisque c'est ce que tu auras fait avec la fonction LockView.

Tu obtiendras alors quelque chose comme ça :
Code:
function room_RepExec()
{
  // Ce qui suit sera exécuté à chaque cycle de jeu (40 par secondes)
  if ((cKeum.View == 6) && (cKeum.Moving)) // Si cKeum est en vue de danse et s'il se déplace
    cKeum.UnlockView(); // On débloque la vue, ce qui a pour effet automatique de rendre la vue normale au personnage, donc pas besoin de ChangeView
}

function hHotspot1_Interact()
{
  cKeum.LockView(6); //cKeum est le perso. La view 6 contient les animations uniques, dont la danse.
  cKeum.Animate(1, 1, eRepeat, eNoBlock, eForwards);
}

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
XZS
Adepte de la Grande Tasse Bleue
Adepte de la Grande Tasse Bleue


Nombre de messages : 66

Age : 35

Localisation : A porté de fusil de Paris

Date d'inscription : 24/04/2013


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Mar 14 Mai 2013 - 13:50

Nickel Kitai, en fait, je me rend compte que je connais déjà un peu tout ce qu'il faut pour obtenir ce code (sauf les "&&", mais je comprends le sens en lisant ton code). J''serai peut-être autonome coté code, un jour ! clin d\\\\'oeil

Par contre, vu que j'avais déjà du code en "function room_RepExec_always()", AGS ne tenait pas compte (il semble) de ce que j'ajoutais en "room_RepExec", enfin j'ai juste placé ton code au début du "RepExec_always" et ça marche.

Du coup, dans une room, c'est soit du "RepExec_always" soit du "RepExec" normale, ou on peut utiliser les deux quand même, selon le code à executer ?

_________________
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.youtube.com/LBQ3TS
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue


Nombre de messages : 1275

Date d'inscription : 10/05/2012


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Mar 14 Mai 2013 - 20:33

Bien que la solution de Kitai soit tout à fait pertinente et réponde complétement au problème, je me permet de ramener ma fraise, en deux parties.
Premièrement, il me semble que dans ce cas présent, détecter un clic peut être plus pertinent que détecter un déplacement de personnage. Ainsi, si le joueur regarde un objet sans entrainer de déplacement du personnage, cKeum d'arretera quand même de danser. on_mouse_click me semble plus pertinent que room_RepExec.
Code:
function on_mouse_click (MouseButton button)
{
  // Ce qui suit sera exécuté à chaque clic du joueur
  if (cKeum.View == 6 ) { // Si cKeum est en vue de danse
    cKeum.UnlockView(); // On débloque la vue, ce qui a pour effet automatique de rendre la vue normale au personnage, donc pas besoin de ChangeView
  }
}
   
function hHotspot1_Interact()
{
  cKeum.LockView(6); //cKeum est le perso. La view 6 contient les animations uniques, dont la danse.
  cKeum.Animate(1, 1, eRepeat, eNoBlock, eForwards);
}
Deuxièmement, on peut même s'en sortir sans sortir (grand sourire) de la fonction hHotspot1_Interact(), en utilisant les fonctions magiques StartCutscene et EndCutscene :
Code:
function hHotspot1_Interact()
{
  StartCutscene(eSkipMouseClick); //On commence une cinématique, skippable par clic de souris
    cKeum.LockView(6); //cKeum est le perso. La view 6 contient les animations uniques, dont la danse.
    cKeum.Animate(1, 1, eRepeat, eNoBlock, eForwards);
    Wait(5*60*40); //on attend 5 min, en regardant cKeum danser.
    cKeum.UnlockView(); //cKeum s'arrête de danser.
    cKeum.Say("J'ai assez dansé tout seul comme un débile pour l'instant"); //Il se justifie
  EndCutscene(); //la cutscene s'arrête là.
}
La magie du truc, c'est que s'il y a clic pendant la cutscene, AGS rush les fonctions de façon instantanée, et ce petit bout de code suffit à lui même. grand sourire

_________________
Mon petit DevBlog
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nothingaboutthedog.blogspot.fr/
XZS
Adepte de la Grande Tasse Bleue
Adepte de la Grande Tasse Bleue


Nombre de messages : 66

Age : 35

Localisation : A porté de fusil de Paris

Date d'inscription : 24/04/2013


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Mer 15 Mai 2013 - 17:39

Billbis, merci pour l'idée d'utiliser le mode "cutscene" !
J'ai testé ton code mais, dès que je déplace le personnage, AGS se fige (enfin, il reste en "wait" infini, j'imagine).

En remplaçant le "Wait(5*60*40);" par un "Wait(600);" par exemple, ça fonctionne (mais le jeu se fige le temps de faire un bond dans le temps de 600, forcement). Est-ce que ça voudrait dire que le code avec "Wait(5*60*40);" fonctionne, mais que AGS se fige le temps d'avancer d'une durée de "5*60*40" ?

Enfin, dans l'immédiat c'est pas problématique. Je reverrai ça plus tard sourire

_________________
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.youtube.com/LBQ3TS
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue


Nombre de messages : 1275

Date d'inscription : 10/05/2012


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Mer 15 Mai 2013 - 18:55

XZS a écrit:
J'ai testé ton code mais, dès que je déplace le personnage, AGS se fige (enfin, il reste en "wait" infini, j'imagine).

En remplaçant le "Wait(5*60*40);" par un "Wait(600);" par exemple, ça fonctionne (mais le jeu se fige le temps de faire un bond dans le temps de 600, forcement). Est-ce que ça voudrait dire que le code avec "Wait(5*60*40);" fonctionne, mais que AGS se fige le temps d'avancer d'une durée de "5*60*40" ?
J'ai pas bien compris ton problème. perplexe
Mais chez moi le code au dessus fonctionne tout à fait normalement. Tu déplace le personnage au clavier ? Dans ce cas tu peux utiliser le eSkipAnyKeyOrMouseClick.
Sinon c'est peut-être un problème de performance. Tu es sur un vieux PC ?
Parce que skipper une cutscene, c'est juste augmenter le GameSpeed au max.

grand sourire

_________________
Mon petit DevBlog
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nothingaboutthedog.blogspot.fr/
XZS
Adepte de la Grande Tasse Bleue
Adepte de la Grande Tasse Bleue


Nombre de messages : 66

Age : 35

Localisation : A porté de fusil de Paris

Date d'inscription : 24/04/2013


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Mer 15 Mai 2013 - 19:19

Billbis a écrit:
Tu peux utiliser le eSkipAnyKeyOrMouseClick.
Oui, c'est déjà le cas.

Citation :
c'est peut-être un problème de performance. Tu es sur un vieux PC ?
Non, un laptop asser récent (je peux faire tourner GTA IV, c'est pour dire) sourire

Je sais pas, AGS fige dès que j'essai de faire un mouvement/clic.
J'ai pas vraiment cherché plus loin, c'était juste histoire de tester ton approche.
Peut-être un bug interne à AGS 3.2.1 ?

_________________
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.youtube.com/LBQ3TS
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 2430

Date d'inscription : 01/08/2006


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Mer 15 Mai 2013 - 21:25

Très malin le coup de la CutScene Billbis.

XZS, as-tu recopié le code à l'identique ? Sinon, as-tu bien pris soin à ce que EndCutScene se trouve nécessairement exécutée dans le code qui suit StartCutScene ?
Comme le note l'aide :
Aide AGS a écrit:
Faîtes très attention à l'endroit où vous placez la command EndCutscene correspondante. Le script doit arriver à EndCutscene dans son ordre d'exécution normal pour que le saut puisse fonctionner - sinon, lorsque le joueur appuyera sur Echap, le jeu pourra planter.

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
XZS
Adepte de la Grande Tasse Bleue
Adepte de la Grande Tasse Bleue


Nombre de messages : 66

Age : 35

Localisation : A porté de fusil de Paris

Date d'inscription : 24/04/2013


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Jeu 16 Mai 2013 - 16:41

Oui je suis certain d'avoir copié exactement le code.

EDIT : après avoir checké plusieurs fois le code de la room, j'arrive toujours pas à voir ce qui cloche.
A tout hasard, il n'y a en théorie aucune raison qu'un code dans un autre script (globalscript, ...) puisse avoir une incidence ?
Genre, un autre "Wait" quelque part ?

Pour les plus courageux, voici le code actuel de la room au complet (la partie de code de Billbis est vers la fin) :

Code:
// room script file


function room_Load()
{
  region[2].Enabled = true; //C'est la région qui empeche temporairement d'aller a la room07 (les WC),
                            //elle sera désactivée après un certain dialogue avec la Barmaid, directement dans le "dDialog1"
  cBarmaid.FaceCharacter(cKeum);
  object[2].Clickable = 0; //Empeche de pouvoir cliquer sur le PNG d'effet de lumiere sur toute la room, et d'interagir avec le reste.
  aNiteklubIN.Play(eAudioPriorityNormal, eRepeat);
}








function room_RepExec_always() // Ce qui suit sera exécuté à chaque cycle de jeu (40 par secondes)
{

  if (!cWalk01.Moving)
  {
    if (cWalk01.x < 100)
    {
cWalk01.Walk(560, 450);
cWalk01.AddWaypoint(1440, 540);
cWalk01.AddWaypoint(540, 580);
    }
   
    else
    {
      // otherwise, move it towards the left
cWalk01.Walk(1500, 540);
cWalk01.AddWaypoint(430, 500);
cWalk01.AddWaypoint(120, 415);
      //OU ALORS > cChar1.Walk(0, cChar1.y, eNoBlock, eAnywhere);
    }
  }
 
    if (!cWalk02.Moving)
  {
    if (cWalk02.x > 100)
    {

cWalk02.Walk(660, 450);
cWalk02.AddWaypoint(1440, 540);
cWalk02.AddWaypoint(540, 580);
    }
    else
    {
cWalk02.Walk(1500, 540);
cWalk02.AddWaypoint(430, 500);
cWalk02.AddWaypoint(120, 415);

    }
  }
}









function room_LeaveLeft()
{
cKeum.ChangeRoom(3, 880, 540);
aNiteklubIN.Stop();
aBeachAmb.Play(eAudioPriorityNormal, eRepeat);
aNiteklubOUT.Play(eAudioPriorityNormal, eRepeat);
}









function room_AfterFadeIn()
{
oDancer01.SetView(16);
oDancer01.Animate(0, 1, eRepeat, eNoBlock, eForwards);

oDancer02.SetView(17);
oDancer02.Animate(0, 1, eRepeat, eNoBlock, eForwards);
}












//                  !!!! QUAND LE PERSO ET LA BARMAID SE RENCONTRE POUR LA PREMIERE FOIS !!!!
bool bFirstTimeMeet = true;

function region1_WalksOnto()
{
  if (bFirstTimeMeet) {
  cKeum.StopMoving();
  cBarmaid.FaceCharacter(cKeum, eBlock);
  cBarmaid.Say("Hey, mais j'te connais toi !");
  cKeum.Walk(1700, 435, eNoBlock, eWalkableAreas);
  region[1].Enabled = false;
}
bFirstTimeMeet = false;
}










//        !!!! FUNCTION POUR QUE LE PERSO DANSE SUR LE DANCEFLOOR PUIS ARRETE DES QU'IL BOUGE !!!!


/*  ANCIEN CODE, temporairement désactivé. Le code original de Billbis est juste à la suite !
bool bFirstDanceFloor = true;

function hHotspot1_Interact()
{
  StartCutscene(eSkipMouseClick);
    cKeum.LockView(6);
    cKeum.Animate(1, 1, eRepeat, eNoBlock, eForwards);
    Wait(5*60*40);
    cKeum.UnlockView();
      EndCutscene();
     
    if (bFirstDanceFloor) {
    cKeum.Say("J'suis tout fatigué de danser !");
    }
    bFirstDanceFloor = false;

}
*/



function hHotspot1_Interact()
{
  StartCutscene(eSkipMouseClick);
    cKeum.LockView(6);
    cKeum.Animate(1, 1, eRepeat, eNoBlock, eForwards);
    Wait(5*60*40);
    cKeum.UnlockView();
    cKeum.Say("J'suis tout fatigué de danser !");
  EndCutscene();
}




function region2_WalksOnto()
{
cKeum.StopMoving();
cKeum.Think("J'crois que je devrais d'abord aller parler à la nana du bar.");
cKeum.Walk(1960, 550, eBlock, eWalkableAreas);
}






function region3_WalksOnto()
{
cKeum.ChangeRoom(7, 230, 530);
cBarmaid.ChangeRoom(7, 110, 530);
aNiteklubIN.Stop();
aNiteklubOUT.Play();
}






bool bDancer01Talk = true;

function oDancer01_Interact()
{
if (bDancer01Talk) {
  cKeum.Walk(460, 560, eBlock, eWalkableAreas);
    cKeum.FaceObject(oDancer01);
cKeum.Say("Salut Mignonne !");
Wait(60);
cKeum.Say("Wahou, ce vent ! Il m'a presque décoiffé.");
}
bDancer01Talk = false;
}






bool bDancer02Talk = true;

function oDancer02_Interact()
{
if (bDancer02Talk) {
  cKeum.Walk(990, 520, eBlock, eWalkableAreas);
  cKeum.FaceObject(oDancer02);
cKeum.Say("Bonsoir, on danse ?");
Wait(60);
cKeum.Say("Je lui fait tellement d'effet qu'elle n'ose pas me parler.");
cKeum.Say("Ni me regarder, elle m'ignore même totalement, c'est vraiment mignon !");
}
bDancer02Talk = false;
}

Rebelote, AGS se fige un bon bout de temps, puis reprend avec une espèce de "saut dans le temps" (je le sais car j'ai des personnages d'arrière-plan qui se déplacent aléatoirement et, une fois qu'AGS reprend normalement, les persos d'arrière-plan ont parcouru leur trajet).
Si je remplace le "Wait(5*60*40);" par "Wait(120)" par exemple, le jeu se fige, le temps de faire un bond dans le temps équivalent au "120".

Encore une fois, quand je désactive le "Wait(5*60*40);", AGS ne fige plus, mais, évidemment, toute la partie cutscene est sautée en un instant (car il n'y a pas de "wait" pour lui dire d'attendre).

Vraiment, je vois pas ce qui cloche...

_________________
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.youtube.com/LBQ3TS
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue


Nombre de messages : 1275

Date d'inscription : 10/05/2012


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Ven 17 Mai 2013 - 6:44

Je ne voit rien des (trop) bizarre dans le room_script à première vue... triste
Du coup, peut on voir le GlobalScript.asc (je suspecte un incompatibilité débile avec le code gérant la souris) ?
C'est étrange... Juste pour être sur de comprendre le problème : la cinématique n'est bien jamais skippée même lorsque tu clic ou que tu appuis sur un bouton du clavier (et que le eSkip est en eSkipAnyKeyOrMouseClick) ? Où alors c'est juste le fond qui ce fige, mais on peut bien skipper la cinématique ?
As tu déjà réussis à faire fonctionner ces cinématiques ailleurs dans le code (i.e. dans une autre pièce) ?
Bon courage !

_________________
Mon petit DevBlog
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nothingaboutthedog.blogspot.fr/
XZS
Adepte de la Grande Tasse Bleue
Adepte de la Grande Tasse Bleue


Nombre de messages : 66

Age : 35

Localisation : A porté de fusil de Paris

Date d'inscription : 24/04/2013


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Ven 17 Mai 2013 - 7:15

Citation :
la cinématique n'est bien jamais skippée même lorsque tu clic ou que tu appuis sur un bouton du clavier [...] Où alors c'est juste le fond qui ce fige, mais on peut bien skipper la cinématique ?
Je dirais que la cinématique est bel et bien skippée, puisque quand je clic ou appuie une touche, le jeu freeze un certain moment, mais après le defreeze, ça enchaîne bien sur le code à la suite du "EndCutscene();".

Citation :
As tu déjà réussis à faire fonctionner ces cinématiques ailleurs dans le code (i.e. dans une autre pièce) ?
Oui, la première scène du jeu commence d'ailleurs direct dessus, à la différence qu'il n'y a pas de "wait".
Mais je peux le skipper autant à la souris qu'au clavier, sans rencontrer de soucis.

Code "cutscene" pour le début du jeu :
Code:
function room_FirstLoad()
{
 
region[1].Enabled = false;
  StartCutscene(eSkipAnyKeyOrMouseClick); //on commence une cutscene skippable
  cKeum.LockView(KEUM01STANDUP);
      cKeum.x = 318; //Pour rattraper le leger décalage sur le coté de l'animation unique :/
  cKeum.Animate(0, 105, eOnce, eBlock);
  cKeum.LockView(KEUM01STANDUP);
  cKeum.Animate(1, 1, eOnce, eBlock);
  cKeum.UnlockView(); // on reviens à la vue Normale
    cKeum.x = 308;
  cKeum.Say("Mais... Qu'est-ce que je fous là ?");
  cKeum.Say("Elle est où la putain d'logique ?!");
  cKeum.x = 293;
    cKeum.LockView(KEUM01ETONNE);
      cKeum.Animate(0, 2, eOnce, eBlock);
  cKeum.x = 308;
    cKeum.Say("Et pourquoi que j'suis en p'tit slip ?");
      cKeum.x = 293;
  player.FaceObject(oR01_DoorClose);
    cKeum.UnlockView();
          cKeum.x = 308;
 EndCutscene(); //fin de la cinématique d'intro
}





Ensuite, merci à toi de te pencher sur mon bien étrange problème. Ça sent le travail d'investigation, pour trouver une solution ! Mais, si c'est trop galère, ne t'embêtes pas, j'utiliserai le code cité plus tôt dans ce topic, pour désactiver l'animation uniquement avec les touches du clavier (moins pratique, certes).

Histoire de couvrir large sans trop s'égarer non plus, je voulais poster que les scripts nouveaux et les modifications apportées au GlobalScript d'origine d'AGS, mais dans ce dernier je ne suis plus trop capable de dire qu'est ce qui est d'origine et ce qui ne l'est pas (entre les différents tests/modif/etc). Donc, d'avance, désolé pour le "foutoir" qu'on peut y trouver !



Déjà, le script pour le comportement de la souris (MouseOption.asc) :

Code:
// new module script
bool DefaultMouseBehavior = true;
 
function CursorAspect()  //Change MouseMode in fonctions of underlying object
{
  if (DefaultMouseBehavior) { //Just a bool to deactivate this during MiniGame
    int x = mouse.x;
    int y = mouse.y;
    if (player.ActiveInventory == null) {
      if (GetLocationType(x, y) == eLocationNothing) {
        if (mouse.Mode != eModeWalkto)
          mouse.Mode = eModeWalkto; // WalkTo mode if nothing under mouse
      }
      else if (GetLocationType(x, y) == eLocationHotspot) {
        Hotspot* OnMouseHotspot = Hotspot.GetAtScreenXY(x, y);
        if (!OnMouseHotspot.GetProperty("ChangeRoomOnClick")) { //A custom properties to trigger a custom MouseMode ChangeRoom
          if (mouse.Mode != eModeInteract) {
            mouse.Mode = eModeInteract; // Interact mode on Object
          }
        }
        else {
          if (mouse.Mode != eModeChangeRoo) {
            mouse.Mode = eModeChangeRoo; //My custom MouseMode ChangeRoom
          }
        }
      }
      else if (GetLocationType(x, y) == eLocationObject) {
        Object* OnMouseObject = Object.GetAtScreenXY(x, y);
        if (!OnMouseObject.GetProperty("ChangeRoomOnClick")) {
          if (mouse.Mode != eModeInteract) {
            mouse.Mode = eModeInteract; // Interact mode on Object
          }
        }
        else {
          if (mouse.Mode != eModeChangeRoo) {
            mouse.Mode = eModeChangeRoo; //My custom MouseMode ChangeRoom
          }
        }
      }
      else if (GetLocationType(x,  y) == eLocationCharacter) {
        if (mouse.Mode != eModeTalkto) {
          mouse.Mode = eModeTalkto; // TalkTo mode on character
        }
      }
      if (InventoryItem.GetAtScreenXY(x, y)!= null) { //no else here
        if (mouse.Mode != eModeInteract) {
          mouse.Mode = eModeInteract; //Take inventory item
        }
      }
    }
  }
}



Ensuite, le GlobalScript dans son ensemble :
(d'avance, je sais que y'a surement des choses qui vont te faire tilter,
comme des modifications qui datent de mes tous premiers essais de codage, bien foireux).
Code:
// main global script file

// A function that initializes a bunch of stuff.
function initialize_control_panel() {
  // Centre the control panel
  gPanel.Centre();
  // Centre the Restart dialog as well
  gRestartYN.Centre();
  gQuit.Centre();
  if (!IsSpeechVoxAvailable()) {
    // If there is no speech-vox file, and therefore no speech,
    // disable all the controls related with speech.
    lblVoice.Visible = false; 
    http://btnVoice.Visible = false; 
    sldVoice.Visible = false;
  }
  else {
    // If there *is*, then set it to voice and text. It's best to use
    // both whenever possible, for the player's sake.
    SetVoiceMode(eSpeechVoiceAndText);
    // And reflect this in the control panel.
    http://btnVoice.Text = "Voice and Text";
  }
  if (!System.SupportsGammaControl) {
    // If we can't change the gamma settings, disable the relevant options.
    sldGamma.Visible = false;
    lblGamma.Visible = false;
  }
 
  //And now, set all the defaults
  System.Volume = 100;
  sldAudio.Value = System.Volume;
  SetGameSpeed(40);
  sldSpeed.Value = 40;
  if (IsSpeechVoxAvailable()) {
    SetVoiceMode(eSpeechVoiceAndText);
    http://btnVoice.Text = "Voice and Text";
    sldVoice.Value = 255;
    SetSpeechVolume(255);
  }
  if (System.SupportsGammaControl) {
    System.Gamma = 100;
    sldGamma.Value = 100;
  }
}

// Called when the game starts, before the first room is loaded
function game_start() { 
  // Put the code all in a function and then just call the function.
  // It saves cluttering up places like game_start.
  initialize_control_panel();
  // Use the KeyboardMovement module to, per default, replicate the standard
  // keyboard movement of most Sierra games. See KeyboardMovement.txt for more info
  KeyboardMovement.SetMode(eKeyboardMovement_Tapping);
}


  function repeatedly_execute(){

{
  CursorAspect();
}

      if (IsGamePaused() == 1) return;

}

function repeatedly_execute_always() {
 
  // Put anything you want to happen every game cycle, even
  // when the game is blocked inside a command like a
  // blocking Walk().
  // You cannot run blocking commands from this function.
 
}

function show_inventory_window ()
{
  gInventory.Visible = true;
  // switch to the Use cursor (to select items with)
  mouse.Mode = eModeInteract;
  // But, override the appearance to look like the arrow
  mouse.UseModeGraphic(eModePointer);
}

function show_save_game_dialog()
{
  gSaveGame.Visible = true;
  // Get the list of save games
  lstSaveGamesList.FillSaveGameList();
  if (lstSaveGamesList.ItemCount > 0)
  {
    // If there is at least one, set the default text
    // to be the first game's name
    txtNewSaveName.Text = lstSaveGamesList.Items[0];
  }
  else
  {
    // No save games yet, default empty text.
    txtNewSaveName.Text = "";
  }
  mouse.UseModeGraphic(eModePointer);
  gIconbar.Visible = false;
}

function show_restore_game_dialog()
{
  gRestoreGame.Visible = true;
  lstRestoreGamesList.FillSaveGameList();
  mouse.UseModeGraphic(eModePointer);
  gIconbar.Visible = false;
}

function close_save_game_dialog()
{
  gSaveGame.Visible = false;
  mouse.UseDefaultGraphic();
  gIconbar.Visible = true;
}

function close_restore_game_dialog()
{
  gRestoreGame.Visible = false;
  mouse.UseDefaultGraphic();
  gIconbar.Visible = true;
}

// Called when a key is pressed. keycode holds the key's ASCII code
function on_key_press(eKeyCode keycode) {
  // The following is called before "if game is paused keycode=0", so
  // it'll happen even when the game is paused.
 
  if ((keycode == eKeyEscape) && gRestartYN.Visible) {
    //Use ESC to cancel restart.
    gRestartYN.Visible = false;
    gIconbar.Visible = true;
    // If the panel's not ON, then the player must have gotten here by tapping F9,
    // therefore his cursor needs restoring. If the panel IS on, then it doesn't,
    // because it's already a pointer. Get used to thinking like this!!
    if (!gPanel.Visible) mouse.UseDefaultGraphic();
    return;
  }
  if ((keycode == eKeyEscape) && gPanel.Visible) {
    // Use ESC to turn the panel off.
    gPanel.Visible = false;
    mouse.UseDefaultGraphic();
    gIconbar.Visible = true;
    return;
  }
  if ((keycode == eKeyEscape) && (gSaveGame.Visible))
  {
    // Use ESC to close the save game dialog
    close_save_game_dialog();
    return;
  }
  if ((keycode == eKeyEscape) && (gRestoreGame.Visible))
  {
    // Use ESC to close the restore game dialog
    close_restore_game_dialog();
    return;
  }
 
  if (keycode == eKeyReturn) {
    // ENTER, in this case merely confirms restart
    if (gRestartYN.Visible) RestartGame();
  }

  if (IsGamePaused() || (IsInterfaceEnabled() == 0))
  {
    // If the game is paused with a modal GUI on the
    // screen, or the player interface is disabled in
    // a cut scene, ignore any keypresses.
    return;
  }

  // FUNCTION KEYS AND SYSTEM SHORTCUTS
  if (keycode == eKeyEscape) {
    // ESC
    gPanel.Visible = true;
    gIconbar.Visible = false;
    mouse.UseModeGraphic(eModePointer);
  }
  if (keycode == eKeyCtrlQ)  QuitGame(1);  // Ctrl-Q
  if (keycode == eKeyF5) show_save_game_dialog();  // F5
  if (keycode == eKeyF7) show_restore_game_dialog();  // F7
  if (keycode == eKeyF9) {
    // F9, asks the player to confirm restarting (so much better to always confirm first)
    gRestartYN.Visible = true; 
    gIconbar.Visible = false;
    mouse.UseModeGraphic(eModePointer);
  }
  if (keycode == eKeyF12) SaveScreenShot("scrnshot.bmp");  // F12
  if (keycode == eKeyTab)  show_inventory_window();  // Tab, show inventory

  // GAME COMMAND SHORTCUTS
  if (keycode == 'W') mouse.Mode=eModeWalkto; //Notice this alternate way to indicate keycodes.
  if (keycode == 'L') mouse.Mode=eModeLookat; //Note that all we do here is set modes.
  if (keycode == 'U') mouse.Mode=eModeInteract; //If you want something else to happen, such as GUI buttons highlighting,
  if (keycode == 'T') mouse.Mode=eModeTalkto; //you'll need some more scripting done.
  if (keycode == 'I') mouse.Mode=eModeUseinv; //But this will, as-is, give you some standard keyboard shortcuts your players will very much appreciate.

  // For extra cursor modes, such as pick up, feel free to add as you will.
  // Uncomment the line below if you use the "Pick Up" mode.
  //if (keycode == 'P' || keycode == 'G') mouse.Mode=eModePickup;

  // DEBUG FUNCTIONS
  if (keycode == eKeyCtrlS)  Debug(0,0);  // Ctrl-S, give all inventory
  if (keycode == eKeyCtrlV)  Debug(1,0);  // Ctrl-V, version
  if (keycode == eKeyCtrlA)  Debug(2,0);  // Ctrl-A, show walkable areas
  if (keycode == eKeyCtrlX)  Debug(3,0);  // Ctrl-X, teleport to room
  if (keycode == eKeyCtrlW && game.debug_mode)
    player.PlaceOnWalkableArea(); //Ctrl-W, move to walkable area
}




/*
//Vieux code pour l'interaction souris, à deux clics.
function on_mouse_click(MouseButton button) {

  if (IsGamePaused() == 1) {
  }
 
  else if (button == eMouseLeft)
  {
    if(GetLocationType(mouse.x, mouse.y) == eLocationNothing)
    {
      ProcessClick(mouse.x, mouse.y, eModeWalkto);
    }
    else
    {
      if(mouse.Mode == eModeUseinv)
      {
        ProcessClick(mouse.x, mouse.y, eModeUseinv);
      }
      else
      {
        ProcessClick(mouse.x,mouse.y, eModeInteract);
      }
    }
  }
  else if (button == eMouseRight)
  {
    if(mouse.Mode == eModeUseinv)
    {
      mouse.Mode = eModeInteract;
      player.ActiveInventory = null;
    }
    else
    {
      ProcessClick(mouse.x,mouse.y, eModeLookat);
    }
  }
*/
 
 
 
 
function on_mouse_click(MouseButton button) // called when a mouse button is clicked. button is either LEFT or RIGHT
{
  if (IsGamePaused() == 1) {// Game is paused, so do nothing (ie. don't allow mouse click)
  }
  else if (button == eMouseLeft) {
    if((player.ActiveInventory != null) && (GetLocationType(mouse.x, mouse.y) == eLocationNothing)){
      player.ActiveInventory = null; //left click on nothing with InvItem looses InvItem.
    } else {
      ProcessClick(mouse.x, mouse.y, mouse.Mode); //Left click on thing launch interaction
    }
  }
  else if (button == eMouseRight) {// right-click, so look at spot, and loss active.inventory
    if(player.ActiveInventory != null) {
      player.ActiveInventory = null;
    } else {
      ProcessClick(mouse.x, mouse.y, eModeLookat); //Look at things with right click
    }
  }
}
 
 
 
 
/*
//Code par défaut pour l'interaction de la souris
else if (button == eMouseLeft) {
ProcessClick(mouse.x, mouse.y, mouse.Mode );
}
else if (button == eMouseRight || button == eMouseWheelSouth){
mouse.SelectNextMode();
}
else if (button == eMouseMiddle) {
ProcessClick(mouse.x, mouse.y, eModeWalkto);
}
else if (button == eMouseWheelNorth) {
If mode isn't WALK, set the previous mode (notice usage of numbers instead
if (mouse.Mode>0) mouse.Mode=mouse.Mode-1;
else
{
// ...but if it is WALK mode...
if (player.ActiveInventory!=null)
{
//...and the player has a selected inventory item, set mouse mode to UseInv.
mouse.Mode=eModeUseinv;
}
else
{
//If they don't, however, just set it to mode TALK (change this line if you add more cursor modes)
mouse.Mode=eModeTalkto;
}}}}
*/





function interface_click(int interface, int button) {
  // This function is obsolete, from 2.62 and earlier versions.
}

function btnInvUp_Click(GUIControl *control, MouseButton button) {
  invCustomInv.ScrollUp();
}

function btnInvDown_Click(GUIControl *control, MouseButton button) {
  invCustomInv.ScrollDown();
}

function btnInvOK_Click(GUIControl *control, MouseButton button) {
   // They pressed the OK button, close the GUI
   gInventory.Visible = false;
   mouse.UseDefaultGraphic();
}

function btnInvSelect_Click(GUIControl *control, MouseButton button) {
 
   // They pressed SELECT, so switch to the Get cursor
   mouse.Mode = eModeInteract;
   // But, override the appearance to look like the arrow
   mouse.UseModeGraphic(eModePointer);
}

function btnIconInv_Click(GUIControl *control, MouseButton button) {
 
  show_inventory_window();
}

function btnIconCurInv_Click(GUIControl *control, MouseButton button) {
 
  if (player.ActiveInventory != null)
    mouse.Mode = eModeUseinv;
}

function btnIconSave_Click(GUIControl *control, MouseButton button)
{
  show_save_game_dialog();
}

function btnIconLoad_Click(GUIControl *control, MouseButton button)
{
  show_restore_game_dialog();
}

function btnIconExit_Click(GUIControl *control, MouseButton button) {
 
  //QuitGame(1);
  gQuit.Visible = true;
}

function btnIconAbout_Click(GUIControl *control, MouseButton button) {
 
  gPanel.Visible=true;
  gIconbar.Visible=false;
  mouse.UseModeGraphic(eModePointer);
}

function cEgo_Look()
{
  Display("Damn, I'm looking good!");
}

function cEgo_Interact()
{
  Display("You rub your hands up and down your clothes.");
}

function cEgo_Talk()
{
  Display("Talking to yourself is a sign of madness!");
}

//START OF CONTROL PANEL FUNCTIONS
function btnSave_OnClick(GUIControl *control, MouseButton button)
{
  gPanel.Visible = false;
  mouse.UseDefaultGraphic();
  gIconbar.Visible = true;
  Wait(1);
  btnIconSave_Click(btnIconSave, eMouseLeft);
}

function gControl_OnClick(GUI *theGui, MouseButton button)
{

}

function btnAbout_OnClick(GUIControl *control, MouseButton button)
{
Display("Last Night in Gretz - XZS 2013 (copyleft). V0.1d - Merci à Billbis, Kitai et Skippy92 du forum adventuregamestudio.fr-bb.com pour leurs précieux conseils !.");
}

function btnQuit_OnClick(GUIControl *control, MouseButton button)
{
  gPanel.Visible = false;
  Wait(1);
  gQuit.Visible = true;
  //QuitGame(1);
  gPanel.Visible = true;
  gIconbar.Visible = false;
  http://mouse.UseModeGraphic(eModePointer);
}

function btnLoad_OnClick(GUIControl *control, MouseButton button)
{
  gPanel.Visible = false;
  mouse.UseDefaultGraphic();
  gIconbar.Visible = true;
  Wait(1);
  btnIconLoad_Click(btnIconLoad, eMouseLeft);
}

function btnResume_OnClick(GUIControl *control, MouseButton button)
{
  gPanel.Visible = false;
  mouse.UseDefaultGraphic();
  gIconbar.Visible = true;
}

function sldAudio_OnChange(GUIControl *control)
{
  System.Volume = sldAudio.Value;
}

function sldVoice_OnChange(GUIControl *control)
{
  // Sets voice volume. Note that we don't check for the existence of speech.vox -
  // we did that in game_start, so if it's not there the slider won't even be available.
  SetSpeechVolume(sldVoice.Value);
}

//function btnVoice_OnClick(GUIControl *control, MouseButton button)
//{
  // Note that we don't check for the existence of speech.vox - we did that in game_start,
  // so if it's not there the button won't even be available.
  //if (btnVoice.Text == "Voice and Text") {
    //SetVoiceMode(eSpeechVoiceOnly);
    http://btnVoice.Text = "Voice only";
  //}
  //else if (btnVoice.Text == "Voice only") {
    //SetVoiceMode(eSpeechTextOnly);
    http://btnVoice.Text = "Text only";
  //}
  //else if (btnVoice.Text == "Text only") {
    //SetVoiceMode(eSpeechVoiceAndText);
    http://btnVoice.Text = "Voice and Text";
  //}
//}

function sldGamma_OnChange(GUIControl *control)
{
  // Set the gamma. Note there's no need to check for anything else, as we ensured,
  // in game_start, that the slider won't even appear if it's not possible to do this.
  System.Gamma = sldGamma.Value;
}

function btnDefault_OnClick(GUIControl *control, MouseButton button)
{
  // Reset everything to default. You'll have to edit these as well as the sliders
  // if you'd rather have different default parameters.
  System.Volume = 100;
  sldAudio.Value = System.Volume;
  sldSpeed.Value = 40;
  SetGameSpeed(40);
  if (IsSpeechVoxAvailable()) {
    SetVoiceMode(eSpeechVoiceAndText);
    http://btnVoice.Text = "Voice and Text";
    sldVoice.Value = 255;
    SetSpeechVolume(255);
  }
  if (System.SupportsGammaControl) {
    System.Gamma = 100;
    sldGamma.Value = 100;
  }
}
//END OF CONTROL PANEL FUNCTIONS

function dialog_request(int param)
{
  // This is used by the dialog text parser if you need to process
  // text that the player types in to the parser.
  // It is not used by default.
}

function sldSpeed_OnChange(GUIControl *control)
{
  SetGameSpeed(sldSpeed.Value);
}

function btnRestart_OnClick(GUIControl *control, MouseButton button)
{
  gRestartYN.Visible=true;
  gIconbar.Visible=false;
}

function btnRestartYes_OnClick(GUIControl *control, MouseButton button)
{
  RestartGame();
}

function btnRestartNo_OnClick(GUIControl *control, MouseButton button)
{
  gRestartYN.Visible = false;
  gIconbar.Visible = true;
  // If the panel's not ON, then the player must have gotten here by tapping F9,
  // therefore his cursor needs restoring. If the panel IS on, then it doesn't,
  // because it's already a pointer. Get used to thinking like this!!
  if (!gPanel.Visible) mouse.UseDefaultGraphic();
}

function btnCancelSave_OnClick(GUIControl *control, MouseButton button)
{
  close_save_game_dialog();
}

function btnSaveGame_OnClick(GUIControl *control, MouseButton button)
{
  int gameSlotToSaveInto = lstSaveGamesList.ItemCount + 1;
  int i = 0;
  while (i < lstSaveGamesList.ItemCount)
  {
    if (lstSaveGamesList.Items[i] == txtNewSaveName.Text)
    {
      gameSlotToSaveInto = lstSaveGamesList.SaveGameSlots[i];
    }
    i++;
  }
  SaveGameSlot(gameSlotToSaveInto, txtNewSaveName.Text);
  close_save_game_dialog();
}

function btnCancelRestore_OnClick(GUIControl *control, MouseButton button)
{
  close_restore_game_dialog();
}

function btnRestoreGame_OnClick(GUIControl *control, MouseButton button)
{
  if (lstRestoreGamesList.SelectedIndex >= 0)
  {
    RestoreGameSlot(lstRestoreGamesList.SaveGameSlots[lstRestoreGamesList.SelectedIndex]);
  }
  close_restore_game_dialog();
}

function lstSaveGamesList_OnSelectionCh(GUIControl *control)
{
  txtNewSaveName.Text = lstSaveGamesList.Items[lstSaveGamesList.SelectedIndex];
}

function txtNewSaveName_OnActivate(GUIControl *control)
{
  // Pressing return in the text box simulates clicking the Save button
  btnSaveGame_OnClick(control, eMouseLeft);
}

function btnDeleteSave_OnClick(GUIControl *control, MouseButton button)
{
  if (lstSaveGamesList.SelectedIndex >= 0)
  {
    DeleteSaveSlot(lstSaveGamesList.SaveGameSlots[lstSaveGamesList.SelectedIndex]);
    lstSaveGamesList.FillSaveGameList();
  }
}

function cKeum_UseInv()
{
 if(player.ActiveInventory == iRobe) {
  cKeum.ChangerTenue(eTenue01);
 }
}


function iKey_Look()
{
Display("Une clé en forme d'Anne Roumanoff, avec la tige plantée dans le cul.");
}

function iRobe_Look()
{
Display("Des vêtements légèrement trop féminin pour être vraiment mon style.");
}


function bYesQuit_OnClick(GUIControl *control, MouseButton button)
{
  QuitGame(0); //on quitte SANS demander confirmation via le GUI moche AGS
}

function bNoQuit_OnClick(GUIControl *control, MouseButton button)
{
  gQuit.Visible = false;
}




function cVideur_Talk()
{
cKeum.FaceCharacter(cVideur);
dDialog0.Start();
}

function cBarmaid_Talk()
{
cKeum.Walk(1700, 435, eBlock, eWalkableAreas);
cKeum.FaceCharacter(cBarmaid);
cBarmaid.FaceCharacter(cKeum);
dDialog1.Start();
}

function cWalk02_Talk()
{
  cKeum.FaceCharacter(cWalk02);
  cWalk02.FaceCharacter(cKeum);
cWalk02.Think("Bleuuuargh...");
cKeum.Say("Il a pas l'air frais, lui.");
}

function cWalk01_Talk()
{
    cKeum.FaceCharacter(cWalk01);
  cWalk01.FaceCharacter(cKeum);
cWalk01.Think("Hey, tu... t'as... je le... de... burp.");
cKeum.Say("D'accord.");
}

_________________
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.youtube.com/LBQ3TS
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 2430

Date d'inscription : 01/08/2006


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Ven 17 Mai 2013 - 7:41

Ok, d'après ce message sur le forum anglophone, c'est un problème qui a déjà été rencontré.

Apparemment c'est le genre de choses qui arrive lorsque tu as une commande bloquante (comme Say par exemple) dans la cinématique et du code dans repeatedly_execute_always et/ou des animations en même temps. En l'occurrence, toi tu as les deux, et même plus vicieux : tu joues des animations dans le repeatedly_execute_always clin d\\\\'oeil

La solution donc, donnée dans le denier message du sujet, est d'encadrer tes commandes Say (et Wait aussi dans l'idéal) par des if sur Game.SkippingCutscene. Ça donnera donc quelque chose comme ça :
Code:
function hHotspot1_Interact()
{
  StartCutscene(eSkipMouseClick);
  cKeum.LockView(6);
  cKeum.Animate(1, 1, eRepeat, eNoBlock, eForwards);
  if (!Game.SkippingCutscene) Wait(5*60*40);
  cKeum.UnlockView();
  if (!Game.SkippingCutscene) cKeum.Say("J'suis tout fatigué de danser !");
  EndCutscene();
}

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
XZS
Adepte de la Grande Tasse Bleue
Adepte de la Grande Tasse Bleue


Nombre de messages : 66

Age : 35

Localisation : A porté de fusil de Paris

Date d'inscription : 24/04/2013


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Ven 17 Mai 2013 - 7:44

Kitai a écrit:
Ok, d'après ce message sur le forum anglophone, c'est un problème qui a déjà été rencontré.

C'est fourbe, tout ça sourire

Cool, super réactivité Kitai, merci ! Ca pourra sûrement servir à d'autres, cette astuce.

EDIT : Raaah, malgré cette astuce, j'ai toujours un freeze... perplexe
Même en désactivant le "if (!Game.SkippingCutscene) cKeum.Say("J'suis tout fatigué de danser !");"

_________________
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.youtube.com/LBQ3TS
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue


Nombre de messages : 1275

Date d'inscription : 10/05/2012


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Ven 17 Mai 2013 - 8:25

Bien joué Kitai pour avoir sans doute identifié le problème !
XZS, le plus simple est de rester sur la première astuce, du coup.
Pour la solution de Kitai, je pense qu'il faut plutôt faire un truc du genre :
Code:
function hHotspot1_Interact()
{
  StartCutscene(eSkipMouseClick);
    cKeum.LockView(6);
    cKeum.Animate(1, 1, eRepeat, eNoBlock, eForwards);
    int i = 0;
    while (i < 5*60*40) {
        i++;
        if (!Game.SkippingCutscene) {
          Wait(1);
        }
    }
    cKeum.UnlockView();
    if (!Game.SkippingCutscene) cKeum.Say("J'suis tout fatigué de danser !");
  EndCutscene();
}
Code non testé, c'est juste une hypothèse / proposition.

_________________
Mon petit DevBlog


Dernière édition par Billbis le Ven 17 Mai 2013 - 9:08, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nothingaboutthedog.blogspot.fr/
XZS
Adepte de la Grande Tasse Bleue
Adepte de la Grande Tasse Bleue


Nombre de messages : 66

Age : 35

Localisation : A porté de fusil de Paris

Date d'inscription : 24/04/2013


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Ven 17 Mai 2013 - 8:33

Billbis a écrit:
Code non testé, c'est juste une hypothèse / proposition.

Hypothèse mise en pratique à l'instant et validée ! Ca fonctionne nickel.
Bon, même si j'ai pas dû comprendre la moitié de ton code sourire
Histoire de vivre moins bête : le "5*60*40" ça se lit comment ? C'est "5 minutes de 60 secondes à 40 cycles/seconde" ?

Merci encore ! C'est pas si évident de danser, dans AGS.

_________________
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.youtube.com/LBQ3TS
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue


Nombre de messages : 1275

Date d'inscription : 10/05/2012


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Ven 17 Mai 2013 - 8:51

XZS a écrit:
Histoire de vivre moins bête : le "5*60*40" ça se lit comment ? C'est "5 fois 60 je-sais-pas-quoi par cycle de 40" ?
5x60x40 ce lit "cinq minutes". Pour être plus claire, j'aurais peut-être du écrire :
Code:
Wait(5*60*GetGameSpeed());
langue
Mais en vrai, il te suffit d'écrire :
Code:
Wait(12000);
qui est plus propre (plus rapide a exécuter pour l'ordinateur) mais moins lisible (seul les génies du calcul mentale réalisent que 12000 = 5 x 60 x 40).
Pour être encore plus claire : 5 x 60 x 40 : une seconde, c'est 40 cycles de jeux (par défaut), il y a 60 secondes dans une minutes (par convention internationnale), et cKeum doit danser 5 minutes (par choix arbitraire de Billbis).
Content d'avoir pu t'aider, en plus j'ai appris un truc qui me sera très utile !
grand sourire
EDIT : j'ai vu dans ton edit que tu avais déjà compris en fait. Bravo, c'est tout à fait ça !

_________________
Mon petit DevBlog
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nothingaboutthedog.blogspot.fr/
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 2430

Date d'inscription : 01/08/2006


MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Ven 17 Mai 2013 - 9:09

Billbis a écrit:
Pour la solution de Kitai, je pense qu'il faut plutôt faire un truc du genre :
Mais oui ! Je n'avais pas réalisé que la Wait était nécessairement en cours lorsque le joueur tente de passer la cinématique. Bien vu Billbis, bel esprit d'anticipation clin d\\\\'oeil

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
Contenu sponsorisé




MessageSujet: Re: Animation unique, annulé dès que le joueur bouge [RESOLU]   Aujourd'hui à 19:52

Revenir en haut Aller en bas
 
Animation unique, annulé dès que le joueur bouge [RESOLU]
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Animation unique, annulé dès que le joueur bouge [RESOLU]
» [Question] Terres brunes - re voyager [Résolu] et [Question] Ruine croulante - pas de cible légal = sans effet ? [Résolu]
» [Animation] Nouvel an chinois
» [Animation] 5 Centimeters per second
» Meilleur moment pour vendre un (jeune) joueur

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Adventure Games Studio fr :: CREATION DE JEUX :: Questions / Réponses-
Sauter vers: