Simulation d'une roulette qui tourne

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

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.