Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flash Pascal Discussion :

Flashplayer qui rame


Sujet :

Flash Pascal

  1. #1
    Membre expérimenté
    Flashplayer qui rame
    Hello,

    j'ai un petit soucis... dans un premier temps, je pensais que l'affectation d'un tableau faisait planter flashpascal... et puis j'ai tenté ça :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    program affectationtableau;
     
    uses
      Flash8;
     
    const T=100; 
     
    {$FRAME_WIDTH 1000}
    {$FRAME_HEIGHT 400}
    {$BACKGROUND $eeeeff}
     
    type 
     TEssaitableau=class(movieclip)
      Constructor Create;
     end; 
     
    var
      mytab: array[1..1000,1..2] of integer;
      essai:TEssaitableau;
     
    constructor TEssaitableau.Create;
    var i:integer;
    begin
     inherited create(nil,'essai',1);
     _y:=200;
     
     linestyle(3,$000000);
     moveto(0,0);
     lineto(1000,0);
     moveto(500,-200);
     lineto(500,200);
     
     for i:=1 to 1000 do 
     begin
      mytab[i,1]:=i;
      mytab[i,2]:=floor(100*sin(-2*3.14*i/T));
     end;
     
     linestyle(2,$ff00ff);
     moveto(0,0);
     for i:=1 to 1000 do lineto(mytab[i,1],mytab[i,2]);
    end;   
     
    begin
     essai:=TEssaitableau.Create;
    end.


    Donc pas de soucis avec les tableaux bien que l'utilisation d'un tableau dynamique ne semble pas possible (pas de setlength)

    alors je voulais tracer une cycloïde avec ma roue... le but était qu'elle puisse se tracer à mesure que la roue avance...je n'ai pas trouvé la solution pour l'instant. Je me suis donc rabattu sur une cycloïde déjà tracée dans sol.

    ci-joint code :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    program roue;
     
    uses Flash8,math;
     
    const R=80;
          e=4;
     
    {$FRAME_WIDTH 1000}
    {$FRAME_HEIGHT 200}
    {$FRAME_RATE 100}
    {$BACKGROUND $008080}
     
    type 
     
      TRayon =class(MovieClip)
        constructor Create(parent: MovieClip);
      end;  
     
      TRoue = class(MovieClip)
        Rayon: TRayon;
        constructor Create(parent: MovieClip);
        procedure onEnterFrame;
      end;
     
     
      TSol=class(MovieClip)
       roue:TRoue;
       constructor Create;
      end; 
     
     
    var retour:boolean;
        dtheta:double;
        trajectoire:array[1..1000,1..2] of integer;// tableau dynamique inutilisable pas de setlength (1000 au pif)
        //pas de tableau de TPoint-> Tpoint n'existe pas (point dans actionscript ? pourtant)- pas de possibilité d'en faire non plus-> pas de record.
        sol:TSol;      
     
    constructor TSol.Create;
    var i,nb:integer;
    begin
     inherited Create(nil,'sol',1);
     
     nb:=floor(1000/(R*dtheta));//nombre d'avancées par frame_rate sur la largeur
     
     for i:=1 to nb do 
     begin
      trajectoire[i,1]:=floor(i*R*dtheta);   //coord.x  point cycloïde
      trajectoire[i,2]:=floor(R*SIN(-i*dtheta));  //coord.y  le moins pour le sens trigo
     end; 
     
     lineStyle(e,$FFFBF0);
     moveto(0,100);
     for i:=1 to nb do  lineto(trajectoire[i,1],trajectoire[i,2]);
     
     BeginFill($FFFBF0);
     moveto(0,180+e);
     lineto(1000,180+e);
     lineto(1000,185+e);
     lineto(0,185+e);
     lineto(0,180+e);
     EndFill();
     roue:=TRoue.create(self);
    end;   
     
     
    constructor TRoue.Create(parent:MovieClip);
    var a,b:double;
    begin
      inherited Create(parent,'roue', 1);
      _x := R;
      _y := 100;
      a:= r * 0.414213562;
      b:= r * 0.707106781;
      lineStyle(2*e, $FFFBF0);
      moveTo(r, 0);
      curveTo( r, -a, +b, -b);
      curveTo( a, -r, 0, -r);
      curveTo(-a, -r, -b, -b);
      curveTo(-r, -a, -r, 0);
      curveTo(-r, +a, -b, +b);
      curveTo(-a, +r, 0, +r);
      curveTo( a, +r, +b, +b);
      curveTo( r, +a, +r, 0);
      EndFill();
      retour:=true;
      dtheta:=3.14/180;
      Rayon := TRayon.Create(self);
    end;
     
     
    constructor TRayon.Create(Parent: MovieClip);
    begin
      inherited Create(parent,'rayon',1);
      lineStyle(e,$FFFBF0);
      moveto(-R,0);
      lineto(0,0);
      moveto(0,-R);
      lineto(0,R);
      lineStyle(e,$ff0000);
      moveto(0,0);
      lineto(R,0);
    end;
     
     
    procedure TRoue.onEnterFrame;                                                                                         
    var j:integer;
    begin
     
      if retour then
      begin
       _x := _x + R*dtheta;
       Rayon._rotation:=Rayon._rotation +1; //1°
      end
      else
      begin
       _x:= _x -R*dtheta  ;
       Rayon._rotation:=Rayon._rotation -1;
      end;
     
      if (_x+R>=1000) or (_x-R<=0) then retour:=not retour; //modif <=0 ! sinon quand la valeur est nulle,c'est indéfini... 
    end;
     
    begin
      sol:= TSol.Create;
    end.


    le principe étant le même que le tracé de courbe précédent... et bien ça plante...

    pourquoi ?

    Si on ne peut pas affecter un tableau sans que flashplayer soit chatouillé, ça s'annonce difficile...


    a+

  2. #2
    Expert éminent sénior
    Bonsoir,

    alors quelques réponses

    1) le plantage vient de ce que dtheta n'est pas initialisé...du coup tout part en carafe...il faudrait que j'ajoute des tests là dessus pour bien faire.

    2) les Record n'existent pas en Flash tout est objet, je devrais pouvoir en créer malgré tout en utilisant des objets dans le code généré...à voir.
    Cependant tu peux créer un objet TPoint.

    3) dans ton code le tableau ne sert à rien, tu pourrais tout aussi bien ne pas stocker les valeurs et simplement faire des lineto()

    4) les tableaux dynamiques n'existent pas, mais en fait la taille des tableaux n'a aucune importance car là encore ce sont des objets et en Flash on peut définir des propriétés dynamiquement...tu peux donc déclarer un array of TPoint (attention je viens de voir qu'un "array of array" n'est pas bien géré) sans te préoccuper de sa taille (là encore il faudrait que j'ajoute des tests à la compilation ou en runtime)

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
      TPoint = external class(flash.geom.Point)
        constructor Create(x, y: Integer);
        property x: Integer;
        property y: Integer;
      end;
     ...
    var
      trajectoire:array of TPoint;
     ...
      dtheta:=3.14/180;
     
     nb:=floor(1000/(R*dtheta));//nombre d'avancées par frame_rate sur la largeur
     
     for i:=0 to nb - 1do 
     begin
      trajectoire[i] := TPoint.Create(
        floor(i*R*dtheta),   //coord.x  point cycloïde
        floor(R*SIN(-i*dtheta)) //coord.y  le moins pour le sens trigo
      );  
     end; 
     
     lineStyle(e,$FFFBF0);
     moveto(0,100);
     for i:=0 to nb-1 do  lineto(trajectoire[i].x,trajectoire[i].y);
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre expérimenté
    Merci, effectivement dtheta n'était pas initialisée, d'où le plantage...
    De plus, il faut que je revois la coord x, je viens de me rendre compte que j'ai oublié le terme en R*Cos()...
    Super pour le TPoint...

    ça permet de progresser dans les outils et Flashpascal devient de plus en plus intéressant...Le forum, finalement c'est mieux qu'un wiki : on met le doigt sur les difficultés avec du concret.

    A+

  4. #4
    Membre expérimenté
    C'est vrai dans ce cas, le tableau ne sert à rien, mais l'objectif est de faire tracer la cycloïde à mesure que la roue avance...
    d'où l'intérêt de stocker les positions précédentes au départ...

    Voilà la raison pour laquelle j'avais débuté par un tableau...et je l'ai gardé pour faire des tests après...

    @+

  5. #5
    Membre expérimenté
    J'ai tenté de reprendre le tracé de la cycloïde en supprimant le tableau puisque pour l'instant je n'en ai pas l'utilité... Ce n'est pas évident de raisonner en coords informatiques...je ne suis pas exactement sur l'extrémité de mon rayon et le décalage se prononce au fur et à mesure des allers et retours.
    Je me suis sans doute trompé...ou alors le degré de rotation n'est pas respecté.
    Je penche plus sur des erreurs. Pas le temps pour l'instant de regarder...

    ci-joint :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    program roue;
     
    uses Flash8,math;
     
    const R=80;
          e=4;
          dtheta=3.14/180;
          nb=floor(1000/(R*dtheta));
     
    {$FRAME_WIDTH 1000}
    {$FRAME_HEIGHT 200}
    {$FRAME_RATE 100}
    {$BACKGROUND $008080}
     
    type 
     
      TRayon =class(MovieClip)
        constructor Create(parent: MovieClip);
      end;  
     
      TRoue = class(MovieClip)
        Rayon: TRayon;
        constructor Create(parent: MovieClip);
        procedure onEnterFrame;
      end;
     
      TSol=class(MovieClip)
       roue:TRoue;
       constructor Create;
      end; 
     
     
    var retour:boolean;
        sol:TSol;      
     
    constructor TSol.Create;
    var i:integer;       
    begin
     inherited Create(nil,'sol',1); 
     
     lineStyle(e,$FFFBF0);
     moveto(0,100);                                                    
     for i:=1 to nb do lineto(floor(i*R*dtheta+R*cos(3.14-i*dtheta)+R),floor(100-R*Sin(3.14-i*dtheta)));
     
     BeginFill($FFFBF0);
     moveto(0,180+e);
     lineto(1000,180+e);
     lineto(1000,185+e);
     lineto(0,185+e);
     lineto(0,180+e);
     EndFill();
     roue:=TRoue.create(self);
    end;   
     
     
    constructor TRoue.Create(parent:MovieClip);
    var a,b:double;
    begin
      inherited Create(parent,'roue', 1);
      _x := R;
      _y := 100;
      a:= r * 0.414213562;
      b:= r * 0.707106781;
      lineStyle(2*e, $FFFBF0);
      moveTo(r, 0);
      curveTo( r, -a, +b, -b);
      curveTo( a, -r, 0, -r);
      curveTo(-a, -r, -b, -b);
      curveTo(-r, -a, -r, 0);
      curveTo(-r, +a, -b, +b);
      curveTo(-a, +r, 0, +r);
      curveTo( a, +r, +b, +b);
      curveTo( r, +a, +r, 0);
      EndFill();
      retour:=true;
      Rayon := TRayon.Create(self);
    end;
     
     
    constructor TRayon.Create(Parent: MovieClip);
    begin
      inherited Create(parent,'rayon',1);
      lineStyle(e,$FFFBF0);
      moveto(+R,0);
      lineto(0,0);
      moveto(0,-R);
      lineto(0,R);
      lineStyle(e,$ff0000);
      moveto(0,0);
      lineto(-R,0);
    end;
     
     
    procedure TRoue.onEnterFrame;                                                                                         
    var j:integer;
    begin
     
      if retour then
      begin
       _x := _x + R*dtheta;
       Rayon._rotation:=Rayon._rotation +1;
      end
      else
      begin
       _x:= _x -R*dtheta  ;
       Rayon._rotation:=Rayon._rotation -1;
      end;
     
      if (_x+R>=1000) or (_x-R<=0) then retour:=not retour;
    end;
    begin
      sol:= TSol.Create;
    end.


    a+

  6. #6
    Expert éminent sénior
    à mon avis tu as des problèmes d'arrondi, tu peux soit passer _x et _y en Double dans la déclaration de MovieClip, soit recalculer _x := R + i * dtheta en gardant un compteur de position (i) sur onEnterFrame qui augmente puis diminue ne fonction de "retour"
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre expérimenté
    Merci, c'est sans doute les arrondis...
    Il y a un truc dont je viens de me rendre compte... _x, _y sont des integer et :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    begin
       _x := _x + R*dtheta;  //ici, ça devrait planter, on affecte une valeur réelle à un entier...et pourtant, ça compile... 
       Rayon._rotation:=Rayon._rotation +1;
      end
      else
      begin
       _x:= _x -R*dtheta  ;//idem
       Rayon._rotation:=Rayon._rotation -1;
      end;


    j'irai même plus loin, j'ai retiré mes floor dans le lineto est ça compile...?
    et j'ai toujours mon décalage

    ps:je viens de me rendre compte aussi que dans l'unit flash8, moveto et lineto ont leur paramètres en double...donc c'est normal. mais _x et _y non...

  8. #8
    Expert éminent sénior
    bien vu lors de l'évaluation de l'addition le total garde le type du premier membre, idem pour la soustraction...par contre la multiplication par un Double donne bien un Double.

    ça sera corrigé dans la prochaine version
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre expérimenté
    Oui, en effet...J'attends la prochaine version avec impatience lol.
    En tout cas, ton outil est génial...
    ça tient sur rien du tout, transportable sur clé USB...
    Possibilité de voir en direct les modifs avec le preview..et génération direct d'un fichier flash.

    Que demande le peuple

    a+