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