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

VB.NET Discussion :

Optimisation Affichage Map Iso avec Images


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Par défaut Optimisation Affichage Map Iso avec Images
    Bonsoir,

    Je suis en train de réaliser un éditeur de Carte et j'aurais besoin de vos précieux conseils.

    Tout d'abord, mon éditeur fonctionne à peu près comme ça :
    La carte est une carte isométrique
    Les images peuvent dépasser de la Cellule, ce qui force le redessinage de la Carte à chaque placement et on le ressent au niveau des performances

    J'ai placé le Calcul de l'ID de la cellule ou est la Souris et le Chargement de la Carte dans un Thread afin que ça n'empêche pas les actions de l'utilisateur et que ça paraisse plus fluide.

    J'ai une Class Cells, une Class Map qui contient une List de Cells
    Donc pour rafraichir ma map, ça se passe à peu près comme ceçi:
    For each cell as cells in map.celllist
    cell.draw(gfx1)
    next

    Qui dessine sur un Graphics puis l'assigne à ma picturebox

    Donc pour l'instant tout ça tourne assez bien, même si je doute de la parfaite optimisation de la chose.

    J'aurais voulu afficher un aperçu de l'objet qui va être placé lors du survol de la Carte.

    Quelle serait la meilleur méthode ?

    Une pictureBox avec l'image de l'objet, empêcherait l'utilisateur de cliquer

    Je pourrais dessiner dans le Graphics sans l'attribuer à la Bitmap de façon à ce qu'il ne soit que "temporaire". Mais vu qu'a chaque déplacement de la Souris je dois rafraichir la PictureBox ça prend pas mal de temps.


    EDIT: J'aimerai séparer la couche Sols de objets, pour ne pas rafraichir les deux à chaque fois lorsque ce n'est pas utile.
    Y'a t'il possibilité de superposer deux bitmaps ?
    Ou deux picturebox feront l'affaire ?
    Cela posera des problèmes au niveau de la transparence, non ?




    Merçi d'avance pour vos réponses

  2. #2
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut
    Bonjour,

    Quelle serait la meilleur méthode ?

    Une pictureBox avec l'image de l'objet, empêcherait l'utilisateur de cliquer

    Je pourrais dessiner dans le Graphics sans l'attribuer à la Bitmap de façon à ce qu'il ne soit que "temporaire". Mais vu qu'a chaque déplacement de la Souris je dois rafraichir la PictureBox ça prend pas mal de temps.
    Une petite photo ou screenshot à l'appui serait sympa, je ne comprends pas trop ton problème.

    Cela posera des problèmes au niveau de la transparence, non ?
    La transparence d'une image par rapport à une autre va en effet poser un problème. En gros Vb.net ne gère pas la transparence, où du moins il ne gère que une "fausse transparence", c'est à dire que si tu as une image avec un fond transparent, il va attribuer attribuer à ton fond de couleur transparente, la couleur du backcolor, ou la coulor définit comme transparente sous vb (transparency.key il me semble).

    Si tu veux faire de la transparence entre 2 images, tu vas devoir soit utiliser un programme (ou bout de code de quelqu'un), soit devoir le faire par toi même.

    Le principe n'est pas très compliqué, le but est de parcourir pixel par pixel l'image en arrière plan, et d'attribuer au fond de l'image de premier plan (couleur transparent) exactement la même couleur pour chaque pixel correspondant.

    En gros redessiner dans le fond de l'image du premier plan l'image d'arrière plan.

  3. #3
    Membre chevronné Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Par défaut
    Oui, il était tard et je m'aperçois que je me suis mal exprimé.

    J'ai dessine sur une Bitmap, Bitmap que j'assigne à une PictureBox.

    J'aimerais faire un "Dessin temporaire" ( colorier le contour de la case par exemple ) lorsque la souris est au dessus.

    Quels sont les solutions ?

    *Sachant que si je dessine sur la Bitmap ce ne sera pas temporaire
    *Créer une autre pictureBox et dessiner le dessin temporaire dessus ( empêche les clics sur ma Picturebox principal & pas de transparence )
    *Dessiner sur la PictureBox directement sans Bitmap puis faire un Refresh ( mais cela entraine un clignotement )

    J'espère que c'est moins confus

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Par défaut
    Bonjour,

    La solution est de dessiner le contour en mode XOR, mais ce n'est pas géré avec GDI+ il faut passer par les API GDI32.
    Voir l'API SetROP2

  5. #5
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut
    Ok, maintenant je comprends ce que tu veux.

    Comme t'as dit GeO tu peux le dessiner en mode XOR, sinon je te donne un code un peu plus compliqué mais qui utilise directement GDI+ :

    Pour le tester, crées juste un bouton sur un form :

    Tu importes les librairies avant ta "Class"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Imports System.Drawing
    Imports System.Drawing.Drawing2D
    Imports System.Drawing.Imaging
    Tu déclares dans ta Class :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Friend WithEvents PictureBox1, Picturebox2 As PictureBox
     
        Public backimg = New Bitmap(104, 104)
        Public g As Graphics = Graphics.FromImage(backimg)
        Public img As Bitmap
    Dans le click du bouton :
    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
            'Création et ajout à la collection "Controls" de 2 picturebox
            PictureBox1 = New PictureBox
            Picturebox2 = New PictureBox
            Me.Controls.Add(PictureBox1)
            Me.Controls.Add(Picturebox2)
     
            'Configuration des picturebox
            PictureBox1.Size = New Size(100, 100)
            Picturebox2.Size = New Size(104, 104)
            PictureBox1.Location = New Point(40, 40)
            Picturebox2.Location = New Point(38, 38)
            Picturebox2.BringToFront()
            PictureBox1.BringToFront()
     
            'Insertion de ton image dans la picturebox1
            img = New Bitmap(100, 100)
            img = Image.FromFile("C:\Documents and Settings\aufrancois\Bureau\Hiver.jpg")
            PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
            PictureBox1.Image = img
    Quand tu click sur le bouton, ton image apparaît .

    Tu rajoutes les évènements pour la picturebox1, quand la souris passe dessus et quand elle s'en va :
    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
    ''Quand on l'enlève la souris de l'image
        Private Sub PictureBox1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseLeave
     
            'Quand la souris quitte l'image, on dessine une image "vide", et on l'assigne à la picturebox2
            Dim img = New Bitmap(104, 104)
            Picturebox2.Image = img
     
        End Sub
     
    'Quand on vient glisser la souris sur l'image
        Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
     
            Dim brush As New SolidBrush(Color.Turquoise)
     
            Picturebox2.Size = New Size(104, 104)
            'On remplit l'image d'un fond couleur turquoise (Brush)
            g.FillRectangle(brush, 0, 0, 104, 104)
            'On dessine un rectangle noir en "contour"
            g.DrawRectangle(Pens.Black, 0, 0, 103, 103)
            'On assigne l'image à la picturebox2
            Picturebox2.Image = backimg
     
        End Sub

  6. #6
    Membre chevronné Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Par défaut
    Le Problème c'est qu'il ne m'est pas possible d'appliquer ta technique methylene.

    Ma carte ressemble à cela, dans une seule et unique picturebox


    Je vais essayer de me renseigner pour le mode XOR

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

Discussions similaires

  1. BALISE MAP souci avec image-lien
    Par darkart dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 15/04/2010, 03h23
  2. [Swing] Affichage de fiches produits avec image
    Par calogerogigante dans le forum AWT/Swing
    Réponses: 16
    Dernier message: 10/01/2008, 09h01
  3. Image Map (cliquable) avec fichier .map contenant les coordonnées
    Par minogttao dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 08/08/2007, 21h59
  4. [WinForms]Lenteur d'affichage formulaire avec image de fond
    Par olixelle dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 06/09/2006, 14h06
  5. [html] non reconnaisance d'une Map d'une image avec IE
    Par mathieu dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 30/08/2005, 10h42

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