Visual Basic 2011 Excel VBA Drehende Animationen programmieren SelMcKenzie Selzer-McKenzie
Author D.Selzer-McKenzie
Heute zeige ich Ihnen, wie Sie mit einfachsten Mitteln eine drehende Animationen, die z.B. jeweils gezeichnet wird, programmieren können. Das Objekt dieser Animation können Sie vergrössern, vergleinern und auch spiegeln, alles während der Animation.
Den Code habe ich vorgeschrieben und Sie sollten das Video anhalten, um ihn abschreiben zu können. Genau muss es sein. Ich habne deshalb die Schrift so vergrössert, dass man es gut lesen kann.
Und wie Sie sehen, die Animation funktioniert perfekt, kann natürlich genausogut mit anderen Objekten oder Bildern gemacht werden, was ja besonders bei der Spiele-Programmierung zum Einsatz kommt.
Selzer-McKenzie
Der Code lautet:
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Vom Windows Form Designer generierter Code "
Public Sub New()
MyBase.New()
' Dieser Aufruf ist für den Windows Form-Designer erforderlich.
InitializeComponent()
' Initialisierungen nach dem Aufruf InitializeComponent() hinzufügen
End Sub
' Die Form überschreibt den Löschvorgang der Basisklasse, um Komponenten zu bereinigen.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
' Für Windows Form-Designer erforderlich
Private components As System.ComponentModel.IContainer
'HINWEIS: Die folgende Prozedur ist für den Windows Form-Designer erforderlich
'Sie kann mit dem Windows Form-Designer modifiziert werden.
'Verwenden Sie nicht den Code-Editor zur Bearbeitung.
Friend WithEvents KnopfVergrössern As System.Windows.Forms.Button
Friend WithEvents KnopfVerkleinern As System.Windows.Forms.Button
Friend WithEvents KnopfRichtung As System.Windows.Forms.Button
Friend WithEvents KnopfSpiegeln As System.Windows.Forms.Button
Friend WithEvents Taktgeber As System.Windows.Forms.Timer
Friend WithEvents KnopfStart As System.Windows.Forms.Button
Me.components = New System.ComponentModel.Container()
Me.KnopfVergrössern = New System.Windows.Forms.Button()
Me.KnopfVerkleinern = New System.Windows.Forms.Button()
Me.KnopfRichtung = New System.Windows.Forms.Button()
Me.KnopfSpiegeln = New System.Windows.Forms.Button()
Me.Taktgeber = New System.Windows.Forms.Timer(Me.components)
Me.KnopfStart = New System.Windows.Forms.Button()
Me.SuspendLayout()
'
'KnopfVergrössern
'
Me.KnopfVergrössern.BackColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(255, Byte), Integer))
Me.KnopfVergrössern.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.KnopfVergrössern.Location = New System.Drawing.Point(32, 16)
Me.KnopfVergrössern.Name = "KnopfVergrössern"
Me.KnopfVergrössern.Size = New System.Drawing.Size(96, 32)
Me.KnopfVergrössern.TabIndex = 0
Me.KnopfVergrössern.Text = "Grösser"
Me.KnopfVergrössern.UseVisualStyleBackColor = False
'
'KnopfVerkleinern
'
Me.KnopfVerkleinern.BackColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(255, Byte), Integer))
Me.KnopfVerkleinern.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.KnopfVerkleinern.Location = New System.Drawing.Point(144, 16)
Me.KnopfVerkleinern.Name = "KnopfVerkleinern"
Me.KnopfVerkleinern.Size = New System.Drawing.Size(96, 32)
Me.KnopfVerkleinern.TabIndex = 1
Me.KnopfVerkleinern.Text = "Kleiner"
Me.KnopfVerkleinern.UseVisualStyleBackColor = False
'
'KnopfRichtung
'
Me.KnopfRichtung.BackColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(255, Byte), Integer))
Me.KnopfRichtung.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.KnopfRichtung.Location = New System.Drawing.Point(256, 16)
Me.KnopfRichtung.Name = "KnopfRichtung"
Me.KnopfRichtung.Size = New System.Drawing.Size(96, 32)
Me.KnopfRichtung.TabIndex = 2
Me.KnopfRichtung.Text = "Richtung"
Me.KnopfRichtung.UseVisualStyleBackColor = False
'
'KnopfSpiegeln
'
Me.KnopfSpiegeln.BackColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(255, Byte), Integer))
Me.KnopfSpiegeln.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.KnopfSpiegeln.Location = New System.Drawing.Point(368, 16)
Me.KnopfSpiegeln.Name = "KnopfSpiegeln"
Me.KnopfSpiegeln.Size = New System.Drawing.Size(96, 32)
Me.KnopfSpiegeln.TabIndex = 3
Me.KnopfSpiegeln.Text = "Spiegeln"
Me.KnopfSpiegeln.UseVisualStyleBackColor = False
'
'Taktgeber
'
'
'KnopfStart
'
Me.KnopfStart.BackColor = System.Drawing.Color.Green
Me.KnopfStart.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.KnopfStart.ForeColor = System.Drawing.SystemColors.ButtonHighlight
Me.KnopfStart.Location = New System.Drawing.Point(536, 16)
Me.KnopfStart.Name = "KnopfStart"
Me.KnopfStart.Size = New System.Drawing.Size(96, 32)
Me.KnopfStart.TabIndex = 4
Me.KnopfStart.Text = "START"
Me.KnopfStart.UseVisualStyleBackColor = False
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.BackgroundImage = Global._2DGrafik.My.Resources.Resources.smk_aus
Me.ClientSize = New System.Drawing.Size(783, 450)
Me.Controls.Add(Me.KnopfStart)
Me.Controls.Add(Me.KnopfSpiegeln)
Me.Controls.Add(Me.KnopfRichtung)
Me.Controls.Add(Me.KnopfVerkleinern)
Me.Controls.Add(Me.KnopfVergrössern)
Me.Name = "Form1"
Me.Text = "Vector-Graphicen in alle Richtungen drehen, vergrössern und verkleinern by SelMcK" & _
"enzie®"
Me.ResumeLayout(False)
End Sub
#End Region
Private DerDrehwinkel As Double
Private DerSinus, DerKosinus As Double
Private DerSpiegelungsfaktor As Integer
Private DerMass_Stabsfaktor As Double
Private BezugHorizontal, BezugVertikal As Double
Private DerRichtungsflag As Boolean
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
BezugHorizontal = Me.Size.Width / 2
BezugVertikal = Me.Size.Height / 2
DerDrehwinkel = 0
DerSpiegelungsfaktor = 1
DerMass_Stabsfaktor = 10
MyBase.OnLoad(e)
End Sub
Private Sub MeineMasse(ByVal dx1 As Double, ByVal dy1 As Double, ByVal R As Double)
Dim x1, y1 As Double
dx1 = DerMass_Stabsfaktor * dx1
dy1 = DerMass_Stabsfaktor * dy1
R = DerMass_Stabsfaktor * R
x1 = BezugHorizontal + dx1 * DerKosinus - DerSpiegelungsfaktor * dy1 * DerSinus
y1 = BezugVertikal - DerSpiegelungsfaktor * dy1 * DerKosinus - dx1 * DerSinus
Dim x, y, d As Single ' Hilfsvariablen
' Konvertierungen, wegen strenger Typprüfung erforderlich:
x = Convert.ToSingle(x1 - R) ' linke obere Ecke
y = Convert.ToSingle(y1 - R) ' " " "
d = Convert.ToSingle(2 * R) ' Durchmesser
' Kreis zeichnen:
Dim FarbeRot As New Pen(Color.Red, 2)
Dim Zeichnen As Graphics = Me.CreateGraphics
Zeichnen.DrawEllipse(FarbeRot, x, y, d, d)
Zeichnen.Dispose()
End Sub
Private Sub DieZeichnung(ByVal dx1 As Double, ByVal dy1 As Double, ByVal dx2 As Double, ByVal dy2 As Double) ' zeichnet relative Linie
Dim x1, y1, x2, y2 As Double
dx1 = DerMass_Stabsfaktor * dx1
dy1 = DerMass_Stabsfaktor * dy1
x1 = BezugHorizontal + dx1 * DerKosinus - DerSpiegelungsfaktor * dy1 * DerSinus
y1 = BezugVertikal - DerSpiegelungsfaktor * dy1 * DerKosinus - dx1 * DerSinus
dx2 = DerMass_Stabsfaktor * dx2
dy2 = DerMass_Stabsfaktor * dy2
x2 = BezugHorizontal + dx2 * DerKosinus - DerSpiegelungsfaktor * dy2 * DerSinus
y2 = BezugVertikal - DerSpiegelungsfaktor * dy2 * DerKosinus - dx2 * DerSinus
Dim xa, ya, xb, yb As Single ' Hilfsvariablen
' Konvertierungen,wegen strenger Typprüfung erforderlich:
xa = Convert.ToSingle(x1) ' Anfangspunkt
ya = Convert.ToSingle(y1) ' "
xb = Convert.ToSingle(x2) ' Endpunkt
yb = Convert.ToSingle(y2) ' "
' Linie zeichnen:
Dim FarbeGrün As New Pen(Color.Green, 2)
Dim Zeichnen As Graphics = Me.CreateGraphics()
Zeichnen.DrawLine(FarbeGrün, xa, ya, xb, yb)
Zeichnen.Dispose()
End Sub
Private Sub HausZeichnen() ' zeichnet Haus
'Frontseite:
DieZeichnung(0, 10, 10, 10)
DieZeichnung(10, 10, 10, 0)
DieZeichnung(10, 0, 0, 0)
DieZeichnung(0, 0, 0, 10)
' Fenster:
DieZeichnung(1, 8, 4, 8)
DieZeichnung(4, 8, 4, 4)
DieZeichnung(4, 4, 1, 4)
DieZeichnung(1, 4, 1, 8)
' Tür:
DieZeichnung(6, 0, 6, 8)
DieZeichnung(6, 8, 9, 8)
DieZeichnung(9, 8, 9, 0)
DieZeichnung(9, 0, 6, 0)
' Dachgiebel:
DieZeichnung(-1, 9, 5, 15)
DieZeichnung(5, 15, 11, 9)
' rundes Giebelfenster:
MeineMasse(5, 12, 1)
' Schornstein:
DieZeichnung(7, 13, 7, 16)
DieZeichnung(7, 16, 9, 16)
DieZeichnung(9, 16, 9, 11)
End Sub
Private Sub Taktgeber_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Taktgeber.Tick
Dim Zeichnen As Graphics = Me.CreateGraphics
Zeichnen.Clear(Me.BackColor) ' Zeichnung löschen
If DerRichtungsflag Then
DerDrehwinkel = DerDrehwinkel + Math.PI / 100 ' im Uhrzeigersinn
Else
DerDrehwinkel = DerDrehwinkel - Math.PI / 100 ' entgegen Uhrzeigersinn
End If
DerSinus = Math.Sin(DerDrehwinkel)
DerKosinus = Math.Cos(DerDrehwinkel)
Call HausZeichnen()
End Sub
' Vergrößern:
Private Sub KnopfVergrössern_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KnopfVergrössern.Click
DerMass_Stabsfaktor += 1
End Sub
' Verkleinern:
Private Sub KnopfVerkleinern_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KnopfVerkleinern.Click
DerMass_Stabsfaktor -= 1
End Sub
' Spiegeln:
Private Sub KnopfSpiegeln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KnopfSpiegeln.Click
DerSpiegelungsfaktor = -DerSpiegelungsfaktor
End Sub
' Richtung ändern:
Private Sub KnopfRichtung_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KnopfRichtung.Click
DerRichtungsflag = Not DerRichtungsflag
End Sub
Private Sub KnopfStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KnopfStart.Click
Start$ = "START" : Stop$ = "STOP"
If KnopfStart.Text = Start$ Then
KnopfStart.Text = Stop$
KnopfStart.BackColor = Color.Red
Taktgeber.Enabled = True
ElseIf KnopfStart.Text = Stop$ Then
KnopfStart.Text = Start$
KnopfStart.BackColor = Color.Green
Taktgeber.Enabled = False
End If
End Sub
End Class
Keine Kommentare:
Kommentar veröffentlichen
Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.