Simulation d'une roulette qui tourne

Soyez le premier à donner votre avis sur cette source.

Vue 8 111 fois - Téléchargée 365 fois

Description

Ce tout petit code simule donc un roulette qui tourne et qui finis par s'arrêter.J'ai fait ça pour m'amuser, mais je trouve ça plutôt réussis et ça peux toujours donner des idées a quelqu'un, voir même l'inspirer.Le code a bien évoluer depuis, on pourra bientot jouer.

Source / Exemple :


alias roulette {
  ;vitesse initial, qui durera un certain temps
  hadd -m roulette angle 12
  ;si l'on clique sur la fenetre, cela doit relancer le code sans fermer la fenetre
  ;et sans remettre a zero la position, de la roulette (effet réel)
  if (!$1) {
    ;tout ceci n'est que l'initialisation si la fenetre n'est pas ouverte
    window -c @roulette
    window -c @rouletteb
    window -pdof @roulette -1 -1 776 350
    window -phdf @rouletteb -1 -1 350 350
    drawpic @rouletteb 0 0 $qt($scriptdirroulette.png)
    drawpic @roulette 351 0 $qt($scriptdirtapis.gif)
  }
  ;Ce double timer est utilisé pour pouvoir crée un timer a delai aléatoire
  ;ce timer, qui se lance qu'une seul fois au bon d'un temps aléatoirement
  ;permet de commencer a décrémenter la vitesse de rotation
  ;-h permet d'executer immediatement le timer
  .timer -h 1 0 .timer -h 1 $!r(900,1500) hadd -m roulette candec 1
  .timer -h 1 0 roll
}

alias -l roll {
  ;si l'on doit décrémenter, alors on le fait : encore un double timer qui lance un seul timer aléatoire
  if ($hget(roulette,candec)) .timer -mo 1 10 .timerollb $!+ $!ticks -om 1 $!r(900,2300) hdec -m roulette angle $!gettok(0.1:0.05:0.025:0.0125,$r(1,4),58)
  ;ici, si la roulette ne tourne plus, on envoie un signal avec le résultat de $rollconv, dont le param est le dernier angle parcouru
  ;on coupe les derniers timer qui pourrait encore décrémenter la vitesse, et on stop la routine pour pas qu'elle se relance
  if ($hget(roulette,angle) <= 0) {
    .signal -n roulette $rollconv($hget(roulette,roll))
    .timerollb* off
    return 
  }
  ;on incrémente l'angle de rotation total avec l'angle actuel, c'est ce qui permet de donner l'effet de rotation continu a la roulette
  hinc -m roulette roll $hget(roulette,angle)
  ;ici, on applique betement le buffer, le buffer est une fenetre caché qui contient l'image de base, on la copie dans notre fenetre
  drawcopy -n @rouletteb 0 0 350 350 @roulette 0 0
  ;et ici, on fait tourné l'image de base de l'angle total parcouru
  drawrot -nmcb @roulette 0 $hget(roulette,roll) 0 0 350 350
  ;ici on dessine le tapis de la roulette, qui sera surement utilisé plus tard
  drawpic -n @roulette 351 0 $qt($scriptdirtapis.gif)
  ;on dessine le délimiteur, celui qui indique le numéro tombé
  drawline -n @roulette 7 1 40 40 70 70
  ;on rafraichi la fenetre
  drawdot @roulette
  ;on relance l'alias le plus vite possible
  .timerollc -ho 1 0 roll
}

menu @roulette {
  ;si on clique, il ne faut pas reseté l'angle total parcouru
  sclick: unloroll 1 | roulette 1
}

alias unloroll {
  ;si $1 n'existe pas, alors on doit tout supprimé/fermé
  ;sinon, on doit gardé l'angle total parcouru
  if (!$1) { window -c @rouletteb | if ($hget(roulette)) hfree roulette }
  .timeroll* off
  if ($hget(roulette,candec)) hdel roulette candec
} 
on *:close:@roulette:unloroll

;et la modif principale
alias  rollconv {
  ;stocker l'ordre des numéros
  var %table 0 32 15 19 4 21 2 25 17 34 6 27 13 36 11 30 8 23 10 5 24 16 33 1 20 14 31 9 22 18 29 7 28 12 35 3 26

  ;les calculs
  var %i = 315 - $calc($1 % 360)
  if (%i < 0) var %i = 360 + %i
  echo -a $!1 : $1
  echo -a $(%i,0) : %i
  echo -a $!replace : $replace($floor($calc( ( ( %i + 4.864865) / 9.72973) + 1) ),38,1) 
  echo -a $!gettok : $gettok(%table,$replace($floor($calc( ( ( %i + 4.864865) / 9.72973) + 1) ),38,1),32)
  return $gettok(%table,$replace($floor($calc( ( ( %i + 4.864865) / 9.72973) + 1) ),38,1),32)
}

on *:signal:roulette:renwin @roulette @roulette $1 | set %aléaroll %aléaroll $1

Conclusion :


Le code utilise donc /drawrot, cette command a été amélioré récement afin d'aller relativement plus vite, ayez la version 6.32
minimum afin d'avoir un résultat correct.Téléchargez le Zip pour avoir les images, mettez les fichier dans un même repertoire et loadez le .mrc.
Lancer l'animation avec /roulette, vous pouvez cliquer dans la fenetre pour relancer l'animation sans remettre la position de la roulette a zero.
Merci beaucoup a versus pour son aide.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_PaDa
Messages postés
1804
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
22 septembre 2009
1 -
Fort rigolo l'écart au centre, ça rend tout ça réaliste, gg ;)
cs_wims
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1 -
Quel écart au centre ? merci :p
uaip
Messages postés
1470
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
-
Sympa, j'aime bien ^^

Juste au passage :
if (!$hget(roulette,angle)) { .timerollb off | return }
Tu vois que tu utilises aussi le return au début de la routine. (je m'étais peut-être mal expliqué la dernière fois).
cs_PaDa
Messages postés
1804
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
22 septembre 2009
1 -
Je savais pas comment dire, la roulette n'a pas l'air d'être un bête cercle qui tourne autour d'un point fixe : je sais pas si c'est l'image qui n'est pas centrée ou un écart dans le code, mais ça rend le truc un peu réaliste j'aime bien... Enfin j'étais ptet bourré quand j'ai vu ça
uaip
Messages postés
1470
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
-
Non non, l'image pivote bien en "décalé". Le centre n'a pas l'air fixe, et en effet, même si c'est pas volontaire, c'est cool.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.