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

时间:2016-09-16 22:08:38

标签: vb.net

我正在进行月球着陆器游戏,并希望在按下左右箭头键时旋转飞船。

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

2 个答案:

答案 0 :(得分:0)

创建一个继承自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所说的想法(可能也要自己做Draw​​Image并跳过mybase.onpaint - 它就像e.graphics.onpaint(TheImage,dimension等)一样。 ..))

答案 1 :(得分:0)

这是我第一次发布代码,请告诉我如何为小组改进代码。我使用http://www.devasp.net/net/articles/display/391.html enter code here

中的代码开发了这个类

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

  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