Flash Pascal

En partant du projet Sphing qui permet de générer des animations Flash (*.SWF) nativement en PHP, j'ai commencé à produire un code Delphi qui fait de même. Très vite je me suis rendu compte que le byte-code Flash était suffisamment évolué pour permettre assez facilement de traduire du code Pascal en byte-code Flash.

FlashPascal sur SourceForge.net

J'ai ouvert un projet SourceForge.net pour FlashPascal.

Vous pouvez donc parcourir les sources via SVN.

Présentation

La version 0.4 de mon compilateur écrit sous Delphi 6 Personel Edition, permet déjà de faire de petites choses sympa comme cette animation simili-3D.



ou encore cette version de MineSweeper disponible en version 0.5 sur le SVN :
(plein écran)

Vous trouverez avec le compilateur en version 0.4 dans cette archive FlashPascal-0.4.zip.

{
 Flash Pascal sample
 
 inspired by http://www.zoneflash.net
(http://www.zoneflash.net/fichiers/zoneflash.swf)

}
program ZoneFlash;

// define Flash frame properties
{$FRAME_WIDTH  250}
{$FRAME_HEIGHT 250}
{$FRAME_RATE    25}

// and expected Flash player version
{$VERSION        9}

type
 TMethod=procedure of object;

// an external class is a native Flash class
 MovieClip=external class
 // this special constructor use MovieClip.createEmptyMovieClip method !
  constructor Create(Parent:MovieClip; Name:string; Depth:integer) as Parent.createEmptyMovieClip;
  procedure lineStyle(width,color,alpha:integer);
  procedure beginFill(color:integer);
  procedure moveTo(x,y:double);
  procedure lineTo(x,y:double);
  procedure curveTo(x1,y1,x2,y2:double);
  procedure endFill();
  procedure swapDepths(target:double);
  function getDepth:integer;
  property _alpha:double;
  property _x:double;
  property _y:double;
  property _xscale:double;
  property _yscale:double;
  property onEnterFrame:TMethod;
 end;

// Flash Pascal let you define inherited class from an external class !
 TCercle=class(MovieClip)
  x,y,z,zz:double;
  index:integer;
  constructor Create(Name:string; Depth:integer);
  procedure tourner;
 end;

 TCadre=class(MovieClip)
  constructor Create(Depth:integer);
  procedure doEnterFrame;
 end;

const
 x0=125;
 y0=125;
 df=130;

 n=3;
 largeur=80;
 dl=largeur/(n-1);
 vitesse = 0.01;

// global vars
var
 Cadre:TCadre;
// array[] are mapped to the Array() native class
 Cercles:array[0..26] of TCercle;
 i,j,k:integer;
 depth:integer;
 mc:TCercle;

 anglex,angley:double;
 danglex,dangley:double;
 cosx,sinx,cosy,siny:double;

// external function for native class function
function sin(a:double):double external Math.sin;
function cos(a:double):double external Math.cos;
function random:double external Math.random;
function floor(a:double):integer external Math.floor;

function aleatoire(vmin, vmax:double):double;
begin
 Result:=(vmin + (vmax - vmin) * random());
end;


constructor TCadre.Create(Depth:integer);
begin
 inherited Create(nil,'Cadre',Depth);
 onEnterFrame:=doEnterFrame;
 lineStyle(0,$808080,100);
 beginFill($e0e0e0);
 moveTo(5,5);
 lineTo(240,5);
 lineTo(240,240);
 lineTo(5,240);
 endFill();

 anglex := 0;
 angley := 1.5;
 danglex:=4*aleatoire(0.5 * vitesse, vitesse);
 dangley:=4*aleatoire(0.5 * vitesse, vitesse);
end;

procedure TCadre.doEnterFrame;
var
 i:integer;
begin
 anglex:=anglex+danglex;
 angley:=angley+dangley;

 cosx := cos(anglex);
 sinx := sin(anglex);
 cosy := cos(angley);
 siny := sin(angley);

 for i:=0 to 26 do Cercles[i].tourner;
end;

constructor TCercle.Create(Name:string; Depth:integer);
begin
 inherited Create(Cadre,Name,Depth);
 index:=Depth;
 lineStyle(0, 0, 100);
 beginFill($ffffff);
 moveTo( 0,-17.5);
 curveTo(+16.0,-16.0,+17.5, 0);
 curveTo(+16.0,+16.0, 0,+17.5);
 curveTo(-16.0,+16.0,-17.5, 0);
 curveTo(-16.0,-16.0, 0,-17.5);
 endFill();
 zz:=0;
end;

procedure TCercle.tourner;
var
 tt,xx,yy:double;
 d,sc:double;
begin
 tt:=- x*sinx+ z*cosx;
 xx:=  x*cosx+ z*sinx;
 yy:=  y*cosy+tt*siny;
 zz:=- y*siny+tt*cosy;
 sc:=100*df/(df-zz);
 _xscale:=sc;
 _yscale:=sc;
 _x := x0 + sc * xx / 100;
 _y := y0 + sc * yy / 100;
 swapDepths(zz);
end;


// the main code, no OOP needed :D
begin
 cadre:=TCadre.Create(100);

 depth:=0;
 for i:=0 to 2 do begin
  for j:=0 to 2 do begin
   for k:=0 to 2 do begin
    mc:=TCercle.Create('c'+IntToStr(depth),depth);
    mc.x:=largeur/2-dl*j;
    mc.y:=largeur/2-dl*i;
    mc.z:=largeur/2-dl*k;
    cercles[depth]:=mc;
    depth:=depth+1;
   end;
  end;
 end;

// the first single frame is playing now !

end.
Date de dernière modification : 22/08/2008