1. #1
    Robot Forum
    Avatar de forum
    Inscrit en
    novembre 1999
    Messages
    1 650
    Détails du profil
    Informations forums :
    Inscription : novembre 1999
    Messages : 1 650
    Points : 1 144
    Points
    1 144

    Par défaut Jeu des points à relier

    Bonjour,

    Je vous propose un nouvel élément à télécharger : Jeu des points à relier.

    Thèmes abordés :
    • Chargement d'un fichier xml
    • Ajout et suppression dynamique d'événements souris
    • Dessin

    cf version Flash.

    Qu'en pensez-vous ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Inscrit en
    décembre 2011
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 986
    Points : 5 726
    Points
    5 726
    Billets dans le blog
    1

    Par défaut

    Excellent exemple, très pédagogique. On peut imaginer une multitude de variations sur la base de ce code.

    Je trouve particulièrement intéressante l'utilisation du fichier XML. J'ai découvert à cette occasion ce format que je ne connaissais que de nom : ça m'a tout de suite plu. Merci aux auteurs !

    A propos de fichiers, qu'en est-il des fichiers .txt ? Actuellement a-t-on la possibilité de les utiliser ?
    L'Art est long et le Temps est court.

  3. #3
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    6 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 075
    Points : 17 833
    Points
    17 833

    Par défaut

    Flash n'est pas prévu pour...mais il plus ou moins possible de le faire

    le programme ci-dessous affiche son propre source dans un TextField.
    cependant, les accents sont interprétés comme de l'UTF8 et les #13#10 provoquent deux passages à la ligne.

    Maintenant, si le fichier texte est en UTF8 avec des retours à la ligne Unix ça fonctionnera.

    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
     
    program LoadText;
     
    uses
      Flash8;
     
    var
      t: TextField;
     
    type
      TLoadVars = class(LoadVars)
        constructor Create;
        procedure onData(src: string);
      end;
     
    constructor TLoadVars.Create;
    begin
      inherited Create();
    // lire son propre source
      if not load('loadText.fpr') then
        t.Text := "erreur générale"
      else
        t.Text := '';
    end;
     
    procedure TLoadVars.onData(src: string);
    begin
      t.Text := t.Text + src;
    end;
     
    begin
      t := TextField.Create(_root, '', 1, 0, 0, Stage.Width, Stage.Height);
      t.SetNewTextFormat(TextFormat.Create('Courier New', 12));
      TLoadVars.Create;
    end.
    Note que LoadVars est normalement utilisé pour lire des données formatées comme une URL "var1=data1&var2=data2", j'utilise "onData" qui permet d'avoir les données lues avant traitement.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Inscrit en
    décembre 2011
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 986
    Points : 5 726
    Points
    5 726
    Billets dans le blog
    1

    Par défaut

    Merci pour le code et les explications.
    L'Art est long et le Temps est court.

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Inscrit en
    décembre 2011
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 986
    Points : 5 726
    Points
    5 726
    Billets dans le blog
    1

    Par défaut

    En jouant avec ton code, je suis retombé sur une difficulté que j'avais déjà rencontrée. Mettons que je veuille supprimer tous les 'a' du texte qui va s'afficher. La ligne que j'ai mise en commentaire me fait obtenir un message d'erreur. Est-ce que c'est un bug ou est-ce que c'est mon code qui n'est pas bon ?

    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
    procedure TLoadVars.onData(src: string);
    var
      i: integer;
      temp: string;
    begin
      t.Text := t.Text + src;
     
      temp := '';
     
      for i:=1 to length(t.Text) do
      begin
        //if t.Text[i] = 'a' then t.Text[i] := '';// "array expected"
        if not t.Text[i] = 'a' then temp := temp + t.Text[i];
      end;
     
      t.Text := temp;
    end;
    L'Art est long et le Temps est court.

  6. #6
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    6 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 075
    Points : 17 833
    Points
    17 833

    Par défaut

    les deux mon capitaine

    alors t.Text[i] := ... n'est pas acceptable, tu peux modifier la propriété "Text" mais pas un caractère de celle-ci. ça reviendrait à lire, modifier puis réécrire la propriété Text: string en une seule opération...remarque pourquoi pas...mais non

    Sous Delphi tu ne peux pas non plus écrire Edit1.Text[1] := 'z'...mais tu peux faire un if Edit1.Text[1] = 'z' tu extrais un caractère de la chaîne lue...ça marche.

    d'autre part, tu peux ne pas affecter une chaîne vide à un caractère pour le supprimer. la syntaxe Pascal serait Delete(s, i, 1)...mais elle n'est pas supportée par FlashPascal pour l'instant.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Inscrit en
    décembre 2011
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 986
    Points : 5 726
    Points
    5 726
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Paul TOTH Voir le message
    alors t.Text[i] := ... n'est pas acceptable, tu peux modifier la propriété "Text" mais pas un caractère de celle-ci. ça reviendrait à lire, modifier puis réécrire la propriété Text: string en une seule opération...remarque pourquoi pas...mais non

    Sous Delphi tu ne peux pas non plus écrire Edit1.Text[1] := 'z'...mais tu peux faire un if Edit1.Text[1] = 'z' tu extrais un caractère de la chaîne lue...ça marche.
    C'est compris. Voici mon code pour éliminer les sauts de lignes indésirables :

    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
    procedure TLoadVars.onData(src: string);
    var
      temp: string;
      i: Integer;
    begin
      temp := '';
      for i := 1 to Length(src) do
      begin
        if ord(src[i])=10 then
          temp := temp
        else
          temp := temp + src[i];
      end;
      t.text := temp;
    end;
    J'ai chargé un fichier texte assez long et j'ai eu la bonne surprise de pouvoir faire défiler le texte de haut en bas avec la roulette de la souris.


    Citation Envoyé par Paul TOTH Voir le message
    d'autre part, tu peux ne pas affecter une chaîne vide à un caractère pour le supprimer. la syntaxe Pascal serait Delete(s, i, 1)...mais elle n'est pas supportée par FlashPascal pour l'instant.
    Celle-là je la fais à chaque fois ! C'est pourtant logique : un tableau peut être vide, un caractère ne peut pas être... rien.

    J'imagine que la procedure Delete() fait à peu près la même chose que le code ci-dessus : elle refait toute la chaîne en déplaçant les éléments. Cette fois je crois que c'est rentré.
    L'Art est long et le Temps est court.

  8. #8
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    6 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 075
    Points : 17 833
    Points
    17 833

    Par défaut

    t'as tout compris

    et j'aime beaucoup ton temp := temp, on sait jamais
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Inscrit en
    décembre 2011
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 986
    Points : 5 726
    Points
    5 726
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Paul TOTH Voir le message
    et j'aime beaucoup ton temp := temp, on sait jamais


    Autrement j'aurais bien aimé apprendre à utiliser les fichiers XML. J'ai lu et relu ton exemple. Je vois le principe mais j'ai du mal à passer à l'application. Le format lui-même est ce qu'il y a de plus simple, mais les formules pour accéder au contenu du fichier sont assez lourdes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with TXMLPoint(n.childNodes[0].attributes) do


    Si tu pouvais écrire un exemple encore plus facile, ce serait bien.
    L'Art est long et le Temps est court.

  10. #10
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    6 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 075
    Points : 17 833
    Points
    17 833

    Par défaut

    ok

    personnellement je déteste les fichiers XML

    ok, donc l'objet XML est le point de départ, il est lui-même un XMLNode et en possède les méthodes et propriétés.

    chaque élément entre <> du fichier XML sera un XMLNode

    XMLNode.nodeName te permet d'avoir le texte entre les <> justement.
    XMLNode.firstChild est le premier élément entre <node> et </node>
    XMLNode.childNodes.length te donne le nombre de ces éléments
    XMLNode.childNodes[i] est le ième élément

    donc si on reprend le fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <game>
     <lines>
       <line x1="..." y1="..." x2="..." y2="..."/>
     </lines>
     <points>
      <point x="..." y="..." type=".."/>
     </points>
    </game>
    on a un premier noeud (XML.firstChild) dont le nodeName est 'game'
    il possède deux enfants (childNodes.length = 2)
    XML.firstChild.childNodes[0] est le noeud 'lines'
    XML.firstchild.childNodes[1] est le noeud points

    ces deux noeuds possèdent une série d'enfants qui sont sous la forme abrégée <node/> qui correspond à <node></node> quand il n'y a rien entre les deux.

    ces noeuds ont par contre des attributs. Sous ActionScript2 qui n'est pas fortement typé, on peut écrire "childNodes[i].attributes.x1" pour lire l'attribut x1 du noeud.

    En flash Pascal "attributes" est un TObject qui ne possède donc aucune propriété...d'où le transtypage en TXMLLigne qui n'est jamais instancié mais qui donne les membres attendus.

    Attention cependant, je vois que pour TXMLLigne j'ai déclaré des Integer, en fait c'est faux, ce sont des string...sauf que ça ne pose pas de problème à flash dans ce cas particulier car on les utilise directement dans des paramètres de type Number et flash fait tout seule la conversion.

    pour TXMLPoint j'ai par contre déclaré des string et j'utilise StrToInt (qui est un alias de parseInt) pour les convertir en nombre, sinon l'opération "x + 18" concatène "18" au nombre placé dans x. 10 devient dont "1018" et non 28.

    Pourquoi ce comportement ? tout simplement parce que Flash considère que l'attribut est un string; et un string + un entier (ce qui n'est pas autorisé en FlashPascal) se traduit par une concaténation de chaînes.

    En indiquant dans FlashPascal que x est un string, on est obligé de passer par StrToInt qui forcera la conversion, sinon - peu importe ce que considère FlashPascal - Flash estime que c'est un string.

    je ne sais pas si j'ai été clair, mais quoi qu'il en soit, il faut déclarer les classes permettant de lire "attributes" uniquement avec des string.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Inscrit en
    décembre 2011
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 986
    Points : 5 726
    Points
    5 726
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Paul TOTH Voir le message
    je ne sais pas si j'ai été clair, mais quoi qu'il en soit, il faut déclarer les classes permettant de lire "attributes" uniquement avec des string.
    Clair et complet.

    Je m'en vais écrire un exemple pour retenir tout cela.
    L'Art est long et le Temps est court.

  12. #12
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Inscrit en
    décembre 2011
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 986
    Points : 5 726
    Points
    5 726
    Billets dans le blog
    1

    Par défaut

    J'ai enfin écrit un code qui fonctionne. Si comme moi vous aimez bien les exemples "ras des pâquerettes", vous aimerez sans doute celui-ci.

    Je suis parti d'un fichier xml que j'avais trouvé dans ce tutoriel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <developpez>
      <membre>
        <pseudo>darrylsite</pseudo>
        <messages>500</messages>
        <statut>redacteur</statut>
      </membre>
      <membre>
        <pseudo>martin</pseudo>
        <messages>1500</messages>
        <statut>moderateur</statut>
      </membre>
    </developpez>
    Mon programme lit les noms des nœuds et les affiche.

    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
    {$FRAME_WIDTH 400}{$FRAME_HEIGHT 300}
    program Ex; uses Flash8;
     
    type
      TXML = class(XML)
        procedure onLoad(success: Boolean); override;
        procedure initialisation;
      end;
      TXMLString = class
        s: string;
      end;
     
    var
      xml: TXML;
      t: TextField;
     
    procedure TXML.onLoad(success: Boolean);
    begin
      if success then initialisation;
    end;
     
    procedure TXML.initialisation;
    begin
      t := TextField.Create(nil, 't', 0, 10, 10, 380, 280);
     
      t.text := Self.firstChild.nodeName + #13;
      t.text := t.text + Self.firstChild.childNodes[0].nodeName + #13;
      t.text := t.text + Self.firstChild.childNodes[1].nodeName + #13;
      t.text := t.text + Self.firstChild.childNodes[0].childNodes[0].nodeName + #13;
     
      //developpez
      //membre
      //membre
      //pseudo
     
      t.background := True;
      t.backgroundColor := $EBEBEB;
    end;
     
    begin
      xml := TXML.Create();
      xml.ignoreWhite := True;
      xml.load('data.xml');
    end.
    Par contre, je n'ai pas su extraire le contenu.
    L'Art est long et le Temps est court.

  13. #13
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    6 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 075
    Points : 17 833
    Points
    17 833

    Par défaut

    avec nodeValue peut-être ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal

  14. #14
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Inscrit en
    décembre 2011
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 986
    Points : 5 726
    Points
    5 726
    Billets dans le blog
    1

    Par défaut

    Avec nodeValue en effet, et avec cette explication trouvée dans un tutoriel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      WriteLn(PassNode.NodeValue); // ce sera vide
      // Le texte du nœud est réellement  un nœud enfant distinct
      WriteLn(PassNode.FirstChild.NodeValue); // affiche correctement "abc"
    Maintenant mon exemple est à peu près complet.

    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
    procedure TXML.initialisation;
    begin
      t := TextField.Create(nil, 't', 0, 10, 10, 380, 280);
     
      t.text := '1) ' + Self.firstChild.nodeName + #13;
      t.text := t.text + '2) ' + Self.firstChild.childNodes[0].nodeName + #13;
      t.text := t.text + '3) ' + Self.firstChild.childNodes[1].nodeName + #13;
      t.text := t.text + '4) ' + Self.firstChild.childNodes[0].childNodes[0].nodeName + #13;
      t.text := t.text + '5) ' + Self.firstChild.childNodes[0].childNodes[0].nodeValue + #13;
      t.text := t.text + '6) ' + Self.firstChild.childNodes[0].childNodes[0].localName + #13;
      t.text := t.text + '7) ' + IntToStr(Self.firstChild.childNodes.length) + #13;
      t.text := t.text + '8) ' + Self.firstChild.childNodes[0].childNodes[0].firstChild.nodeValue;
     
      // 1) developpez
      // 2) membre
      // 3) membre
      // 4) pseudo
      // 5) null
      // 6) pseudo
      // 7) 2
      // 8) darrylsite
     
      t.background := True;
      t.backgroundColor := $EBEBEB;
    end;
    L'Art est long et le Temps est court.

Discussions similaires

  1. Jeu des points à relier
    Par freegreg dans le forum Téléchargez
    Réponses: 0
    Dernier message: 03/10/2011, 08h39
  2. Impossible de relier des points avec plot
    Par Sylver52 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 28/05/2009, 08h21
  3. Relier des points
    Par florianlang dans le forum Débutant
    Réponses: 6
    Dernier message: 11/06/2008, 20h21
  4. Relier des points dans une paintbox par une courbe
    Par Benjikos dans le forum Débutant
    Réponses: 4
    Dernier message: 19/08/2007, 13h06
  5. pb relier des points avec la SDL en C
    Par rafale001 dans le forum SDL
    Réponses: 1
    Dernier message: 25/02/2007, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo