Forum und email

SWFAction

(No version information available, might be only in CVS)

SWFAction — Classe SWFAction

Description

La synthaxe de script est basée sur le langage C mais avec beaucoup de différences - le bytcode SWF est simplifié pour ne faire que ce dont on a besoin. Actuellement, nous ne pouvons pas implémenter des appels à des fonctions sans d'affreux hacks car le bytecode a des valeurs de position codées en interne.

Que reste-t-il donc ? le compilateur reconnait les instances suivantes :

  • break
  • for
  • continue
  • if
  • else
  • do
  • while

Il n'y a pas de données typées ; toutes les valeurs d'une action SWF sont stockées sous la forme de chaînes de caractères. Les fonctions suivantes peuvent être utilisées dans les expressions :

time()
Retourne le nombre de millisecondes effectuées depuis le début d'une vidéo.
random(seed)
Retourne le nombre pseudo-aléatoire dans la rangée 0-seed.
length(expr)
Retourne la longueur de l'expression donnée.
int(number)
Retourne le nombre donné arrondi au nombre inférieur.
concat(expr, expr)
Retourne la concaténation des expressions données.
ord(expr)
Retourne le code ASCII pour le caractère donné.
chr(num)
Retourne le caractère pour le code ASCII donné.
substr(string, location, length)
Retourne la sous chaîne de la longueur length à la position location de la chaîne string donnée.

De plus, les commandes suivantes peuvent être utilisées :

duplicateClip(clip, name, depth)
Duplique la vidéo nommée clip (aka sprite). La nouvelle vidéo a le nom name et est à la profondeur depth .
removeClip(expr)
Efface la vidéo fournie.
trace(expr)
Écrit l'expression donnée dans l'historique des traces.
startDrag(target, lock, [left, top, right, bottom])
Démarre le déplacement de la vidéo target . L'argument lock indique si l'on verrouille la sourie - utilisez 0 (FALSE) ou 1 (TRUE).
stopDrag()
Commence le déplacement.
callFrame(expr)
Appel la frame nommée, comme une fonction.
getURL(url, target, [method])
Charge l'URL donnée, dans la cible nommée. L'argument target correspond à la cible du document HTML (comme "_top" ou "_blank"). L'argument optionnel method peut être POST ou GET si vous voulez soumettre les variables au serveur.
loadMovie(url, target)
Charge l'URL donnée dans la cible nommée. L'argument target peut être le nom d'une frame, ou une des valeurs magiques : "_level0" (remplace la vidéo courante) ou "_level1" (charge la nouvelle vidéo au dessus de la vidéo courante).
nextFrame()
Se place sur la prochaine frame.
prevFrame()
Se place sur la dernière (ou, plutôt, précédente) frame.
play()
Commence à jouer la vidéo.
stop()
Arrête de jouer la vidéo.
toggleQuality()
Passe d'une qualité haute à basse, et inversement.
stopSounds()
Arrête de jouer tous les sons.
gotoFrame(num)
Se place sur la frame numéro num . Les numéros de frame commencent à 0.
gotoFrame(name)
Se place sur la frame nommée name .
setTarget(expr)
Définit le contexte de l'action.
L'expression frameLoaded(num) peut être utilisée dans les instructions if et les boucles while pour vérifier si le numéro de frame donné a déjà été chargé.

Les vidéos ( aka sprites) ont des propriétés. Vous pouvez les lire, en définir quelques unes. Voici la liste :

  • x
  • y
  • xScale
  • yScale
  • currentFrame - (lecuture seule)
  • totalFrames - (lecuture seule)
  • alpha - degré de transparence
  • visible - 1=on, 0=off
  • width - (lecuture seule)
  • height - (lecuture seule)
  • rotation
  • target - (lecuture seule)
  • framesLoaded - (lecuture seule)
  • name
  • dropTarget - (lecuture seule)
  • url - (lecuture seule)
  • highQuality - 1=high, 0=low
  • focusRect
  • soundBufTime
Donc, définir la position d'un sprite est aussi simple que So, setting a sprite's x position is as simple as /box.x = 100;. Pourquoi le slash au début ? C'est la façon dont Flash garde une trace des sprites dans une vidéo, tout comme le système de fichiers Unix - ici, la boite est au premier niveau. Si le sprite nommée "box" a un autre sprite nommé "biff" au dessous, vous pouvez définir sa position comme ceci : /box/biff.x = 100;

Class Members

Exemples

Cet exemple simple déplace un carré rouge dans la fenêtre.

Example#1 Exemple avec swfaction()

<?php
  $s 
= new SWFShape();
  
$f $s->addFill(0xff00);
  
$s->setRightFill($f);

  
$s->movePenTo(-500, -500);
  
$s->drawLineTo(500, -500);
  
$s->drawLineTo(500500);
  
$s->drawLineTo(-500500);
  
$s->drawLineTo(-500, -500);

  
$p = new SWFSprite();
  
$i $p->add($s);
  
$i->setDepth(1);
  
$p->nextFrame();

  for (
$n=0$n<5; ++$n) {
    
$i->rotate(-15);
    
$p->nextFrame();
  }

  
$m = new SWFMovie();
  
$m->setBackground(0xff0xff0xff);
  
$m->setDimension(60004000);

  
$i $m->add($p);
  
$i->setDepth(1);
  
$i->moveTo(-500,2000);
  
$i->setName("box");

  
$m->add(new SWFAction("/box.x += 3;"));
  
$m->nextFrame();
  
$m->add(new SWFAction("gotoFrame(0); play();"));
  
$m->nextFrame();

  
header('Content-type: application/x-shockwave-flash');
  
$m->output();
?>

Cet exemple déplace la souris vers le bas à l'écran.

Example#2 Exemple avec swfaction()

<?php

  $m 
= new SWFMovie();
  
$m->setRate(36.0);
  
$m->setDimension(1200800);
  
$m->setBackground(000);

  
$i $m->add(new SWFSprite());
  
$i->setName('mouse');

  
$m->add(new SWFAction("
    startDrag('/mouse', 1); /* '1' signifie le verrou du sprite à la souris */
  "
));

  
/* might as well turn off antialiasing, since these are just squares. */

  
$m->add(new SWFAction("
    this.quality = 0;
  "
));

  
/* morphing box */
  
$r = new SWFMorph();
  
$s $r->getShape1();

  
/* Note this is backwards from normal shapes.  No idea why. */
  
$s->setLeftFill($s->addFill(0xff0xff0xff));
  
$s->movePenTo(-40, -40);
  
$s->drawLine(800);
  
$s->drawLine(080);
  
$s->drawLine(-800);
  
$s->drawLine(0, -80);

  
$s $r->getShape2();

  
$s->setLeftFill($s->addFill(0x000x000x00));
  
$s->movePenTo(-1, -1);
  
$s->drawLine(20);
  
$s->drawLine(02);
  
$s->drawLine(-20);
  
$s->drawLine(0, -2);

  
/* sprite container for morphing box -
     this is just a timeline w/ the box morphing */

  
$box = new SWFSprite();
  
$box->add(new SWFAction("
    stop();
  "
));
  
$i $box->add($r);

  for (
$n=0$n<=20; ++$n) {
    
$i->setRatio($n/20);
    
$box->nextFrame();
  }

  
/* this container sprite allows us to use the same action code many times */

  
$cell = new SWFSprite();
  
$i $cell->add($box);
  
$i->setName('box');

  
$cell->add(new SWFAction("

    setTarget('box');

    /* ...x means the x coordinate of the parent, i.e. (..).x */
    dx = (/mouse.x + random(6)-3 - ...x)/5;
    dy = (/mouse.y + random(6)-3 - ...y)/5;
    gotoFrame(int(dx*dx + dy*dy));

  "
));

  
$cell->nextFrame();
  
$cell->add(new SWFAction("

    gotoFrame(0);
    play();

  "
));

  
$cell->nextFrame();

  
/* finally, add a bunch of the cells to the movie */

  
for ($x=0$x<12; ++$x) {
    for (
$y=0$y<8; ++$y) {
      
$i $m->add($cell);
      
$i->moveTo(100*$x+50100*$y+50);
    }
  }

  
$m->nextFrame();

  
$m->add(new SWFAction("

    gotoFrame(1);
    play();

  "
));

  
header('Content-type: application/x-shockwave-flash');
  
$m->output();
?>

Identique à ce qui précède, mais avec des balles colorées.

Example#3 Exemple avec swfaction()

<?php

  $m 
= new SWFMovie();
  
$m->setDimension(110008000);
  
$m->setBackground(0x000x000x00);

  
$m->add(new SWFAction("

this.quality = 0;
/frames.visible = 0;
startDrag('/mouse', 1);

  "
));

  
// mouse tracking sprite
  
$t = new SWFSprite();
  
$i $m->add($t);
  
$i->setName('mouse');

  
$g = new SWFGradient();
  
$g->addEntry(00xff0xff0xff0xff);
  
$g->addEntry(0.10xff0xff0xff0xff);
  
$g->addEntry(0.50xff0xff0xff0x5f);
  
$g->addEntry(1.00xff0xff0xff0);

  
// gradient shape thing
  
$s = new SWFShape();
  
$f $s->addFill($gSWFFILL_RADIAL_GRADIENT);
  
$f->scaleTo(0.03);
  
$s->setRightFill($f);
  
$s->movePenTo(-600, -600);
  
$s->drawLine(12000);
  
$s->drawLine(01200);
  
$s->drawLine(-12000);
  
$s->drawLine(0, -1200);

  
// need to make this a sprite so we can multColor it
  
$p = new SWFSprite();
  
$p->add($s);
  
$p->nextFrame();

  
// put the shape in here, each frame a different color
  
$q = new SWFSprite();
  
$q->add(new SWFAction("gotoFrame(random(7)+1); stop();"));
  
$i $q->add($p);

  
$i->multColor(1.01.01.0);
  
$q->nextFrame();
  
$i->multColor(1.00.50.5);
  
$q->nextFrame();
  
$i->multColor(1.00.750.5);
  
$q->nextFrame();
  
$i->multColor(1.01.00.5);
  
$q->nextFrame();
  
$i->multColor(0.51.00.5);
  
$q->nextFrame();
  
$i->multColor(0.50.51.0);
  
$q->nextFrame();
  
$i->multColor(1.00.51.0);
  
$q->nextFrame();

  
// finally, this one contains the action code
  
$p = new SWFSprite();
  
$i $p->add($q);
  
$i->setName('frames');
  
$p->add(new SWFAction("

dx = (/:mousex-/:lastx)/3 + random(10)-5;
dy = (/:mousey-/:lasty)/3;
x = /:mousex;
y = /:mousey;
alpha = 100;

  "
));
  
$p->nextFrame();

  
$p->add(new SWFAction("

this.x = x;
this.y = y;
this.alpha = alpha;
x += dx;
y += dy;
dy += 3;
alpha -= 8;

  "
));
  
$p->nextFrame();

  
$p->add(new SWFAction("prevFrame(); play();"));
  
$p->nextFrame();

  
$i $m->add($p);
  
$i->setName('frames');
  
$m->nextFrame();

  
$m->add(new SWFAction("

lastx = mousex;
lasty = mousey;
mousex = /mouse.x;
mousey = /mouse.y;

++num;

if (num == 11)
  num = 1;

removeClip('char' & num);
duplicateClip(/frames, 'char' & num, num);

  "
));

  
$m->nextFrame();
  
$m->add(new SWFAction("prevFrame(); play();"));

  
header('Content-type: application/x-shockwave-flash');
  
$m->output();
?>