IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

C++Builder Discussion :

Images mobiles sur une autre image


Sujet :

C++Builder

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Points : 242
    Points
    242
    Par défaut Images mobiles sur une autre image
    Bonjour,
    voilà quel est mon problème autour duquel je tourne depuis un "certain temps".

    Je voudrais simuler une descente permanente de boules dans une autres image.

    Je crée une trentaine de petites images, régulièrement espacées sur la hauteur.
    Je j'augmente périodiquement de 1 pixel le Top de chaque image.
    Lorsque l'image la plus basse, donc avec le Top le plus grand, je la réinstalle
    en haut en soustrayant de son Top la hauteur.

    Cela semble fonctionner un court moment, et encore.

    Il y a un TImage, Image2, et une CheckBox, cbStop.
    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
    void __fastcall TfEssaiXE6::bImagesClick(TObject *Sender)
    {
    	int x1, y1, h, dy, largeur, hauteur, i, Nb, ymax, rayon, iTop;
     
    	TImage** TabImages;
    	largeur = Image2->Width;
    	hauteur = Image2->Height;
    	x1 = Image2->Left + largeur/2;
    	y1 = Image2->Top;
    	h = hauteur;
     
    	TCanvas *pcanvas = Image2->Canvas;
    	pcanvas->Brush->Color = clWhite;
    	TRect aRect = TRect(0, 0, largeur, hauteur);
    	pcanvas->FillRect(aRect);
     
    	Nb = 30;
    	dy = h/Nb;
    	ymax = y1 + h - dy;
    	rayon = 5;
     
    	// Création des images
      	TabImages = new TImage*[Nb];
      TabImages[i]->Canvas->Brush->Color = clRed;	
    	for(i = 0; i < Nb; i++)
    	{
    		TabImages[i] = new TImage(Application);
    		TabImages[i]->Parent = fEssaiXE6;
    		TabImages[i]->SetBounds(x1 - rayon, y1 + i*dy, x1 + rayon, y1 + i*dy + 2*rayon);
    		TabImages[i]->Canvas->Brush->Color = clRed;		
    		TabImages[i]->Canvas->Ellipse(0, 0, 2*rayon, 2*rayon);		
    	}
     
    	while(!cbStop->Checked)
    	{    
    		for(i = 0; i < Nb; i++)
    		{
    			iTop = TabImages[i]->Top;
    			iTop++;
    			if( iTop > ymax)  iTop = iTop - Nb*dy;
     
    			TabImages[i]->Top = iTop;
    			Application->ProcessMessages();
    		}
    		Application->ProcessMessages();
    		Sleep(10);
    	}
    	Application->ProcessMessages();
     
    	delete [] TabImages;
    J'ai testé avec les versions XE2 et XE6 et j'ai les mêmes problèmes.
    Si quelqu'un découvre l'erreur dans ce code, je suis preneur.

    Merci d'avance.
    Gilbert PASQUALINI

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, si tu commences un nouveau projet qui utilise des animations avec XE6, je te conseil d'utiliser FireMonkey au lieu de la VCL. Sinon si tu utilises la VCL, ne crée pas plein de TImage, dessine directement sur le Canvas de l'image pour éviter le scintillement. N'utilise pas de Sleep avec un while, prend un TTimer à la place.

    Au lieu de ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TImage** TabImages;
    ...
    TabImages = new TImage*[Nb];
    Je préfère ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        DynamicArray<TImage*> TabImages;
        TabImages.Length = Nb;
    Tu vas pouvoir viré cette ligne:
    Il y a aussi un paquet de conteneur dans la std qui sont bien.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Points : 242
    Points
    242
    Par défaut
    Merci de vous intéresser à mon problème.
    Je n'ai jamais utilisé de FireMonkey, il faudra que j'essaie.

    Si je dessine directement sur l'image (ici Image2), il faudra que j'efface l'ensemble des petites images précédents avant de dessiner les nouvelles.
    Cela peut se faire en remplissant un rectangle.

    J'avais également essayé en mettant les images dans un container List de la stl.
    Cela n'avais rien amélioré.

    Je vais essayer en dessinant directement sur l'image de base.
    Je ferai cet essai mercredi.

    Je vous tiendrai au courant.
    Gilbert PASQUALINI

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Points : 242
    Points
    242
    Par défaut
    J'ai essayé en dessinant directement sur le Canvas de l'image.
    J'ai mis le code dans un Timer.
    Cela fonctionne.

    Dans ce cas particulier, est-ce qu'un Thread ajouterait quelque chose de différent d'un Timer.

    J'ai essayé de mettre le code dans un Thread, ,mais j'ai des résultats aberrants.
    Gilbert PASQUALINI

  5. #5
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    J'ai essayé de mettre le code dans un Thread, ,mais j'ai des résultats aberrants
    Cette méthode est pourtant conseillée

    ceci est très vraisemblablement du a des problème de synchronisation entre le thread principal de ton application utilisant la VCL et le code de ton thread interagissant avec celui ci
    problème épineux lors de conflit d'accès
    Résolution possible avec la méthode synchronize de l'object Thread bien que peu performant
    j'utilise personnellement l'envoi de message au Thread Principal via les API Post Message
    cette manière de faire est asynchrone et c'est l'OS en charge de la distribution des messages au programme principal
    la réception des dit Message peut se faire de différentes manières

    cdlt

    Il existe sur le Net beaucoup de doc et d'exemples a ce sujet la plupart en Anglais espéranto de l'informatique
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Points : 242
    Points
    242
    Par défaut
    Merci, je vais essayer de comprendre le comportement des Thread.

    Dans un autre ordre de préoccupation, j'ai testé FireMonkey.
    Je suis dérouté. On trouve, a priori, les mêmes composants que ceux de la VCL, mais ils n'ont ni les mêmes propriétés, ni les mêmes méthodes.
    Pour le moment, je n'ai pas trouvé de documentations très "musclée" sur FireMonkey.
    Gilbert PASQUALINI

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Points : 242
    Points
    242
    Par défaut
    L'utilisation du Thread fonctionne bien en utilisant la méthode "Synchronyse()"'.

    Merci encore à Crayon

    j'ai oublié, mais mes remerciements vont également à DjmSoftware
    Gilbert PASQUALINI

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rotation d'une image sur une autre image de fond
    Par domas_24 dans le forum 2D
    Réponses: 0
    Dernier message: 16/03/2011, 01h39
  2. Réponses: 6
    Dernier message: 21/10/2010, 14h54
  3. Modification hauteur et largeur d'une image suite à un double-click sur une autre image
    Par LorenzoIlMagnifico dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 18/11/2009, 16h10
  4. Image (edg) sur une autre image (img)
    Par kmaniche dans le forum Images
    Réponses: 7
    Dernier message: 07/06/2006, 17h20
  5. Mettre une image sur une autre image et tableau
    Par Michaël dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 19/06/2005, 18h31

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