如何在vb.net中旋转按键上的图像

如何在vb.net中旋转按键上的图像,vb.net,Vb.net,我正在做一个月球着陆器游戏,当按下左右箭头键时,我想让宇宙飞船旋转 我知道如何使用图片框和keydown事件移动图像,但无论如何都无法直接旋转图片框。我是否需要以不同的方式使用图像来实现我想要的?非常感谢您的帮助。创建一个继承自picturebox的新类。用那个。您可以编辑designer.vb以更改类型 这是伪代码,未经测试,因此肯定不会运行 class RotateablePictureBox inherits picturebox public property Rota

我正在做一个月球着陆器游戏,当按下左右箭头键时,我想让宇宙飞船旋转


我知道如何使用图片框和keydown事件移动图像,但无论如何都无法直接旋转图片框。我是否需要以不同的方式使用图像来实现我想要的?非常感谢您的帮助。

创建一个继承自picturebox的新类。用那个。您可以编辑designer.vb以更改类型

这是伪代码,未经测试,因此肯定不会运行

class RotateablePictureBox
    inherits picturebox

    public property RotationAngle as single

    overrides onpaint(e as ...)
        e.graphics.rotatetransform(rotationangle)
        mybase.onpaint(e)

这就是Hans Passant所说的想法(可能也必须自己绘制图像,跳过mybase.onpaint-就像e.graphics.onpaint(图像、尺寸等)一样完成)

创建一个继承自picturebox的新类。用那个。您可以编辑designer.vb以更改类型

这是伪代码,未经测试,因此肯定不会运行

class RotateablePictureBox
    inherits picturebox

    public property RotationAngle as single

    overrides onpaint(e as ...)
        e.graphics.rotatetransform(rotationangle)
        mybase.onpaint(e)

这就是Hans Passant所说的想法(可能也需要自己绘制图像,跳过mybase.onpaint-就像e.graphics.onpaint(图像、尺寸等)一样完成)

这是我第一次发布代码,所以请告诉我如何为团队改进它。我使用
中的代码开发了这个类,在这里输入代码

我希望这有帮助。这是按钮代码

  Private Sub btnRotateLeft_Click(sender As Object, e As EventArgs) Handles btnRotateLeft.Click
    ' IMAGE IS THE NEW OBJECT FROM THE CLASS. PASS THE PICTUREBOX CONTROL(pbItems)
    image.RotateLeft(pbItems)
  End Sub
这是一节课

Imports System.Math
Public Class clsImage
  Private wid As Single
  Private hgt As Single
  Public Function RotateLeft(ByVal picSource As PictureBox) As PictureBox
    'ROTATES THE IMAGE LEFT
    Dim bm_in = New Bitmap(picSource.Image)
    wid = bm_in.Width
    hgt = bm_in.Height
    Dim corners As Point() = {New Point(0, 0), New Point(wid, 0), New Point(0, hgt), New Point(wid, hgt)}
    Dim cx As Single = wid / 2
    Dim cy As Single = hgt / 2

    Dim i As Long
    'ROTATES LEFT
    For i = 0 To 3
      corners(i).X -= cx
      corners(i).Y -= cy
    Next i
    'THE ROTATION ANGLE IS HARD CODED HERE BUT COULD BE PASS TO THE CLASS
    Dim theta As Single = Single.Parse(90) * PI / 180.0
    Dim sin_theta As Single = Sin(theta)
    Dim cos_theta As Single = Cos(theta)
    Dim X As Single
    Dim Y As Single

    For i = 0 To 3
      X = corners(i).X
      Y = corners(i).Y
      corners(i).X = X * cos_theta + Y * sin_theta
      corners(i).Y = -X * sin_theta + Y * cos_theta
    Next i

    Dim xmin As Single = corners(0).X
    Dim ymin As Single = corners(0).Y

    For i = 1 To 3
      If xmin > corners(i).X Then xmin = corners(i).X
      If ymin > corners(i).Y Then ymin = corners(i).Y
    Next i

    For i = 0 To 3
      corners(i).X -= xmin
      corners(i).Y -= ymin
    Next i

    Dim bm_out As New Bitmap(CInt(-2 * xmin), CInt(-2 * ymin))
    Dim gr_out As Graphics = Graphics.FromImage(bm_out)

    ReDim Preserve corners(2)

    gr_out.DrawImage(bm_in, corners)
    picSource.Image = bm_out
    Return picSource
  End Function
  Public Function RotateRight(ByVal picSource As PictureBox) As PictureBox
    'ROTATES THE IMAGE RIGHT
    Dim bm_in = New Bitmap(picSource.Image)
    wid = bm_in.Width
    hgt = bm_in.Height
    Dim corners As Point() = {New Point(0, 0), New Point(wid, 0), New Point(0, hgt), New Point(wid, hgt)}
    Dim cx As Single = wid / 2
    Dim cy As Single = hgt / 2

    Dim i As Long
    'ROTATES RIGHT
    For i = 0 To 3
      corners(i).X -= cx
      corners(i).Y -= cy
    Next i
    'THE ROTATION ANGLE IS HARD CODED HERE BUT COULD BE PASS TO THE CLASS
    Dim theta As Single = Single.Parse(-90) * PI / 180.0
    Dim sin_theta As Single = Sin(theta)
    Dim cos_theta As Single = Cos(theta)
    Dim X As Single
    Dim Y As Single

    For i = 0 To 3
      X = corners(i).X
      Y = corners(i).Y
      corners(i).X = X * cos_theta + Y * sin_theta
      corners(i).Y = -X * sin_theta + Y * cos_theta
    Next i

    Dim xmin As Single = corners(0).X
    Dim ymin As Single = corners(0).Y

    For i = 1 To 3
      If xmin > corners(i).X Then xmin = corners(i).X
      If ymin > corners(i).Y Then ymin = corners(i).Y
    Next i

    For i = 0 To 3
      corners(i).X -= xmin
      corners(i).Y -= ymin
    Next i

    Dim bm_out As New Bitmap(CInt(-2 * xmin), CInt(-2 * ymin))
    Dim gr_out As Graphics = Graphics.FromImage(bm_out)

    ReDim Preserve corners(2)

    gr_out.DrawImage(bm_in, corners)
    picSource.Image = bm_out
    Return picSource
  End Function
End Class

这是我第一次发布代码,所以请让我知道如何为团队改进代码。我使用
中的代码开发了这个类,在这里输入代码

我希望这有帮助。这是按钮代码

  Private Sub btnRotateLeft_Click(sender As Object, e As EventArgs) Handles btnRotateLeft.Click
    ' IMAGE IS THE NEW OBJECT FROM THE CLASS. PASS THE PICTUREBOX CONTROL(pbItems)
    image.RotateLeft(pbItems)
  End Sub
这是一节课

Imports System.Math
Public Class clsImage
  Private wid As Single
  Private hgt As Single
  Public Function RotateLeft(ByVal picSource As PictureBox) As PictureBox
    'ROTATES THE IMAGE LEFT
    Dim bm_in = New Bitmap(picSource.Image)
    wid = bm_in.Width
    hgt = bm_in.Height
    Dim corners As Point() = {New Point(0, 0), New Point(wid, 0), New Point(0, hgt), New Point(wid, hgt)}
    Dim cx As Single = wid / 2
    Dim cy As Single = hgt / 2

    Dim i As Long
    'ROTATES LEFT
    For i = 0 To 3
      corners(i).X -= cx
      corners(i).Y -= cy
    Next i
    'THE ROTATION ANGLE IS HARD CODED HERE BUT COULD BE PASS TO THE CLASS
    Dim theta As Single = Single.Parse(90) * PI / 180.0
    Dim sin_theta As Single = Sin(theta)
    Dim cos_theta As Single = Cos(theta)
    Dim X As Single
    Dim Y As Single

    For i = 0 To 3
      X = corners(i).X
      Y = corners(i).Y
      corners(i).X = X * cos_theta + Y * sin_theta
      corners(i).Y = -X * sin_theta + Y * cos_theta
    Next i

    Dim xmin As Single = corners(0).X
    Dim ymin As Single = corners(0).Y

    For i = 1 To 3
      If xmin > corners(i).X Then xmin = corners(i).X
      If ymin > corners(i).Y Then ymin = corners(i).Y
    Next i

    For i = 0 To 3
      corners(i).X -= xmin
      corners(i).Y -= ymin
    Next i

    Dim bm_out As New Bitmap(CInt(-2 * xmin), CInt(-2 * ymin))
    Dim gr_out As Graphics = Graphics.FromImage(bm_out)

    ReDim Preserve corners(2)

    gr_out.DrawImage(bm_in, corners)
    picSource.Image = bm_out
    Return picSource
  End Function
  Public Function RotateRight(ByVal picSource As PictureBox) As PictureBox
    'ROTATES THE IMAGE RIGHT
    Dim bm_in = New Bitmap(picSource.Image)
    wid = bm_in.Width
    hgt = bm_in.Height
    Dim corners As Point() = {New Point(0, 0), New Point(wid, 0), New Point(0, hgt), New Point(wid, hgt)}
    Dim cx As Single = wid / 2
    Dim cy As Single = hgt / 2

    Dim i As Long
    'ROTATES RIGHT
    For i = 0 To 3
      corners(i).X -= cx
      corners(i).Y -= cy
    Next i
    'THE ROTATION ANGLE IS HARD CODED HERE BUT COULD BE PASS TO THE CLASS
    Dim theta As Single = Single.Parse(-90) * PI / 180.0
    Dim sin_theta As Single = Sin(theta)
    Dim cos_theta As Single = Cos(theta)
    Dim X As Single
    Dim Y As Single

    For i = 0 To 3
      X = corners(i).X
      Y = corners(i).Y
      corners(i).X = X * cos_theta + Y * sin_theta
      corners(i).Y = -X * sin_theta + Y * cos_theta
    Next i

    Dim xmin As Single = corners(0).X
    Dim ymin As Single = corners(0).Y

    For i = 1 To 3
      If xmin > corners(i).X Then xmin = corners(i).X
      If ymin > corners(i).Y Then ymin = corners(i).Y
    Next i

    For i = 0 To 3
      corners(i).X -= xmin
      corners(i).Y -= ymin
    Next i

    Dim bm_out As New Bitmap(CInt(-2 * xmin), CInt(-2 * ymin))
    Dim gr_out As Graphics = Graphics.FromImage(bm_out)

    ReDim Preserve corners(2)

    gr_out.DrawImage(bm_in, corners)
    picSource.Image = bm_out
    Return picSource
  End Function
End Class

请阅读并拍摄图片,而不是图片盒。使用Graphics.RotateTransform+DrawImage轻松完成。可能会丢失图片框,因为它完全没有帮助。实际上,不要“可能”丢失图片框,你必须丢失它,因为如果你将图片框内的图像旋转,它将剪切图像的一部分(呈方形),你可以把图像放大,然后当它旋转时,它会切割图像的边缘,而不是“太空船”的部分。如上所述,请勿使用图片框渲染图片框需要花费大量时间,并且可能会因重画事件(当图片框移动时)而闪烁。请阅读并同时旋转图像,而不是图片框。使用Graphics.RotateTransform+DrawImage轻松完成。可能会丢失图片框,因为它完全没有帮助。实际上,不要“可能”丢失图片框,你必须丢失它,因为如果你将图片框内的图像旋转,它将剪切图像的一部分(呈方形),你可以把图像放大,然后当它旋转时,它会切割图像的边缘,而不是“太空船”的部分。说到这里,不要使用图片框渲染图片框会花费很多时间,并且它可能会由于重画事件(当图片框移动时)而闪烁