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 :

Problem avec g.RotateTransform(n)


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2013
    Messages : 57
    Par défaut Problem avec g.RotateTransform(n)
    Bonjour
    Je suis en train de faire un jeu 2D en VB.NET mais j'ai un problème...

    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
     
    'le code suivant doit afficher une image de vaisseau ainci qu'un cercle autour de celui-ci indiquant son équipe mais lorsque j'utilise l'objet "graphics" g , avec g.rotatetransphorm(n degrés)l'image se décalle(elle ne se met pas au bon endroit)
    'Je crois savoir d'où vient le probleme(mais je ne sais pas comment le résoudre)mais je vais mettre tout le code au cas ou
    'cette fonction est aussi sensée déplacer le vaisseau en fonction de sa direction et de sa vitesse mais cette fonctionalité es fonctionnelle
    Dim var1 As unit = Unité.Item(encour)
            Dim ancX As Integer = var1.CooX
            Dim AncY As Integer = var1.CooY
            Dim Pi = 3.1415926536
            var1.CooX = Math.Round(Math.Sin(2 * Pi * (var1.Direction Mod 360) / 360) * var1.vitesse) + ancX
            var1.CooY = Math.Round(Math.Cos(2 * Pi * (var1.Direction Mod 360) / 360) * var1.vitesse) + AncY
            g.RotateTransform(var1.Direction)
            Select Case var1.type
                Case "Cargo"
                    g.DrawImage(My.Resources.CargoV, var1.CooX + 12, var1.CooY + 12)
                Case "CargoR"
                    g.DrawImage(My.Resources.CargoR, var1.CooX + 12, var1.CooY + 12)
                Case "Bombardier"
                    g.DrawImage(My.Resources.Bombardier, var1.CooX + 12, var1.CooY + 12)
                Case "Bombardier2"
                    g.DrawImage(My.Resources.Bombardier2, var1.CooX + 12, var1.CooY + 12)
                Case "Chasseur"
                    g.DrawImage(My.Resources.chasseur, var1.CooX + 12, var1.CooY + 12)
     
     
            End Select
            Select Case var1.équipe
                Case "Rébélion"
                    g.DrawEllipse(Pens.Blue, var1.CooX, var1.CooY, 75, 75)
                    If var1.Nom = "Joueur" Then g.DrawEllipse(Pens.Green, var1.CooX, var1.CooY, 75, 75)
                Case "Neutre"
                    g.DrawEllipse(Pens.Gray, var1.CooX, var1.CooY, 75, 75)
                Case "Asservents"
                    g.DrawEllipse(Pens.Red, var1.CooX, var1.CooY, 75, 75)
            End Select
            Unité.Item(encour) = var1
            g.ResetTransform()
    Je crois que le bug vient de la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    g.RotateTransform(var1.Direction)
    si c'est bien que je n'utilise pas la bonne chose (g.RotateTransform)merci de m'indiquer une autre solution

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g.RotateTransform(var1.Direction)
    L'origine O des axes x,y est au sommet Left-Top(Haut-Gauche) du control ou tu dessines (picturebox,panel ou autre)...
    -axe Ox oriente de gauche à droite
    -axe Oy oriente de haut vers le bas ....
    Graphics.RotateTransform fait tourner tous les objets autour de O l'origine de GDI... Pas tres utile !!!...
    Par contre si on veut tourner un objet autour de lui-meme il faut utiliser un matrix et calculer le centre de la figure (rectangle,bitmap,control etc...)...

    voici 2 exemples de code(le 2eme est anime pour mieux voir la difference) qui illustre l'effet de chaque methode:
    exemple 1:
    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
     
     
    Imports System.Drawing.Drawing2D
     
    Public Class Form1
        Private angle As Single = 30
        Private Sub btnGRotate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGRotate.Click
     
            Me.Invalidate()
        End Sub
     
     
     
     
        Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
            Dim gr As Graphics = e.Graphics
            gr.Clear(Color.White)
            Dim rect As Rectangle = New Rectangle(50, 50, 100, 100)
     
            '**************DESSIN NORMAL EN BLEU DU RECTANGLE
     
            gr.FillRectangle(Brushes.RoyalBlue, rect)
            gr.DrawRectangle(Pens.Black, rect)
     
            '**************DESSIN DU RECTANGLE EN ROUGE :pivote autour de xOy =>g.rotatetransform
            gr.RotateTransform(angle)
            gr.DrawRectangle(Pens.Red, rect)
     
            '**************DESSIN DU RECTANGLE EN BLEU :pivote autour de son centre 
            gr.ResetTransform()
     
     
            'calculer  centre figure
            Dim centerRect As Point = New Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2)
            'utiliser un matrix
            Dim m As Matrix = New Matrix
            m.RotateAt(angle, centerRect)
            gr.Transform = m
            gr.DrawRectangle(Pens.DarkBlue, rect)
     
            gr.ResetTransform()
        End Sub
     
        Private Sub Form1_SizeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.SizeChanged
            Me.Invalidate()
        End Sub
     
     
    End Class
    exemple 2 (anime ) :

    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
     
    Imports System.Drawing.Drawing2D
     
    Public Class Form2
        Private angle As Single = 0
        Private Sub btnStartRotation_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartRotation.Click
            Me.DoubleBuffered = True
            Timer1.Enabled = True
        End Sub
     
     
        Private Sub Form2_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
            Dim gr As Graphics = e.Graphics
            gr.Clear(Color.White)
            Dim rect As Rectangle = New Rectangle(50, 50, 100, 100)
     
            '**************DESSIN NORMAL EN BLEU DU RECTANGLE
            gr.FillRectangle(Brushes.RoyalBlue, rect)
            gr.DrawRectangle(Pens.Black, rect)
     
            '**************DESSIN DU RECTANGLE EN ROUGE :pivote autour de xOy =>g.rotatetransform
            gr.RotateTransform(angle)
            gr.DrawRectangle(Pens.Red, rect)
     
            '**************DESSIN DU RECTANGLE EN BLEU :pivote autour de son centre 
            gr.ResetTransform()
     
     
            'calculer  centre figure 
            Dim centerRect As Point = New Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2)
            'utiliser un matrix
            Dim m As Matrix = New Matrix
            m.RotateAt(angle, centerRect)
            gr.Transform = m
            gr.DrawRectangle(Pens.DarkBlue, rect)
     
            gr.ResetTransform()
        End Sub
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            angle += 5
            Me.Invalidate()
     
        End Sub
     
        Private Sub btnStopRotation_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStopRotation.Click
            Timer1.Enabled = False
        End Sub
    End Class
    bon code......

  3. #3
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2013
    Messages : 57
    Par défaut Un grand merci a toi
    Ce code fonctionne parfaitement bien
    c'est exactement ce que je voulais
    Merci

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

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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