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
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
)
hier gleich noch der Quellcode (erklärt sich hoffentlich von selbst)
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?
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

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

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: