PictureBox Rotation funktioniert nicht

  • Themenstarter Themenstarter r0ttenSystem
  • Beginndatum Beginndatum
R

r0ttenSystem

Guten Morgen zusammen!

Zu meinem Problem:

Für ein Spiel brauche Ich eine Rotate Funktion, um ein Bild in Richtung des MausCursors zu drehen (wird ein Shooter in 2D). Nach einer weile suchen habe Ich auch etwas passendes gefunden (muss an dieser Stelle sagen das ich die Funktion "BildDrehen" nur über Copy&Paste übernommen habe, kann also sein das darin der fehler liegt, naja). Es funktioniert auch alles so wie es soll, bis auf die Berechnung des Winkels :mad:

Naja schauts euch an http://www.imgbox.de/?img=t44302w132.jpg

Den Cursor musst Ich leider mit Paint einfügen (die Stelle stimmt aber ca :rolleyes:)

hier gleich noch der Quellcode (erklärt sich hoffentlich von selbst)

Code:
Option Explicit

' Benötigte API-Funktionen
Private Declare Function PlgBlt Lib "gdi32.dll" ( _
  ByVal hdcDest As Long, _
  lpPoint As POINTAPI, _
  ByVal hdcSrc As Long, _
  ByVal nXSrc As Long, ByVal nYSrc As Long, _
  ByVal nWidth As Long, ByVal nHeight As Long, _
  ByVal hbmMask As Long, _
  ByVal xMask As Long, ByVal yMask As Long) As Long

Private Type POINTAPI
  X As Long
  Y As Long
End Type

Private Const pi180 = 3.14159265358979 / 180
Private PtList(2) As POINTAPI

Dim a As Double             'Zwischenwert
Dim XC As Integer           'X Stelle des Cursors
Dim YC As Integer           'Y Stelle des Cursors
Dim XB As Integer           'X Stelle des Bildes
Dim YB As Integer           'Y Stelle des Bildes
Dim StreckeA As Double
Dim StreckeB As Double
Dim StreckeC As Double
Dim Pi As Double
Dim dblWinkel As Double     'Winkel

Public Sub BildDrehen(ByVal picSource As PictureBox, ByVal picDest As PictureBox, _
  Optional ByVal DrehWinkel As Long = 0, _
  Optional ByVal intZoom As Integer = 46, _
  Optional ByVal horzDrehWinkel As Long = 0, _
  Optional ByVal vertDrehWinkel As Long = 0)
    
  Dim i As Integer
  Dim NewX As Double, NewY As Double
  Dim SinAng1 As Double, CosAng1 As Double
  Dim SinAng2 As Double, SinAng3 As Double
  Dim dblZoom As Double

  With picSource
    .Visible = False
    .ScaleMode = vbPixels
    .AutoRedraw = True
    .AutoSize = True
    picDest.ScaleMode = vbPixels
    picDest.AutoRedraw = True
  
    ' Punktliste zurücksetzen:
    PtList(0).X = -(.ScaleWidth / 2)
    PtList(0).Y = -(.ScaleHeight / 2)
    PtList(1).X = (.ScaleWidth / 2)
    PtList(1).Y = -(.ScaleHeight / 2)
    PtList(2).X = -(.ScaleWidth / 2)
    PtList(2).Y = (.ScaleHeight / 2)
    
    ' Variablen vorberechnen:
    dblZoom = Tan(intZoom * pi180)
    SinAng1 = Sin((DrehWinkel + 90) * pi180)
    CosAng1 = Cos((DrehWinkel + 90) * pi180)
    SinAng2 = Sin((horzDrehWinkel + 90) * pi180) * dblZoom
    SinAng3 = Sin((vertDrehWinkel + 90) * pi180) * dblZoom
    
    ' Punkte transformieren:
    For i = 0 To 2
      NewX = (PtList(i).X * SinAng1 + PtList(i).Y * CosAng1) * SinAng2
      NewY = (PtList(i).Y * SinAng1 - PtList(i).X * CosAng1) * SinAng3
      PtList(i).X = NewX + (picDest.ScaleWidth / 2)
      PtList(i).Y = NewY + (picDest.ScaleHeight / 2)
    Next i
    
    ' alte Darstellung löschen
    picDest.Cls
    picDest.Picture = Nothing
    
    ' neue Darstellung zeichnen:
    Call PlgBlt(picDest.hDC, PtList(0), .hDC, 0, 0, _
      .ScaleWidth, .ScaleHeight, 0, 0, 0)
    
    ' und in die Anzeige PicBox übernehmen:
    picDest.Picture = picDest.Image
  End With
End Sub

Private Sub Form_Load()
  Call BildDrehen(picOriginalBild, picAnzeigeBox)
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

XC = X
YC = Y
'Mittelpunkt des Bildes
XB = (picAnzeigeBox.Left + picAnzeigeBox.Width / 2)
YB = (picAnzeigeBox.Top + picAnzeigeBox.Height / 2)
'Pi berechnen
Pi = 4 * Atn(1)

StreckeA = Sqr((XC - XB) ^ 2 + (YB - YB) ^ 2)
StreckeB = Sqr((XC - XC) ^ 2 + (YC - YB) ^ 2)
StreckeC = Sqr((XC - XB) ^ 2 + (YC - YB) ^ 2)

Label1.Caption = XC
Label2.Caption = XB
Label3.Caption = YC
Label4.Caption = YB
Label5.Caption = StreckeA
Label6.Caption = StreckeB
Label7.Caption = StreckeC

a = (StreckeB / StreckeC)

'Checken ob der Cursor oberhalb oder unterhalb des Bildes ist --> Winkel ändern
If YC > YB Then a = -a

'Berechnung des Winkels
dblWinkel = (Atn(a) * 180 / Pi)

Label10.Caption = dblWinkel

'Bild drehen
Call BildDrehen(picOriginalBild, picAnzeigeBox, dblWinkel)

End Sub

Das Originalbild wurde mit Paint gezeichnet, jedoch so das es sich im Mittelpunkt des Bildes befindet (ansonsten funktioniert die Rotation nicht).

Um das zusammen zu fassen: Meiner Meinung nach wird der Winkel falsch berechnet, da man das Bild beispielsweise auch nicht um 90 Grad drehen kann.

Unklarheiten kann Ich erst später beantworten, hab noch bisselwas zu tun (so gegen 13:00 bin Ich wieder am PC)

Danke schonmal im Vorraus für eure Hilfe :)

r0ttenSystem


Edit: Kann den niemand helfen?
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück