2016-09-16 8 views
0

私は月面着陸ゲームを作っており、左右の矢印キーを押したときに宇宙船を回転させたいと考えています。vb.netのキープレスで画像を回転する方法

私は画像ボックスとkeydownイベントを使用して画像を移動する方法を知っていますが、とにかく直接にはありません画像ボックスを回転します。私は私が望むものを達成するためにイメージを別の方法で使用する必要がありますか?どんな助けでも大歓迎です。

+0

あるボタンのコード

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 

あるに読ん【お願い]も[観光] – Plutonix

+1

を取ってください。代わりのPictureBoxの画像を回転させます。 Graphics.RotateTransform + DrawImageで簡単にできました。それは完全に役に立たないので、絵のボックスを失うかもしれない。 –

+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) 

(すぎのdrawImage自分で行うとmybase.onpaintをスキップする必要がある場合があります - それはe.graphics.onpaintのように行われています(TheImage、寸法等...))

0

これは私の初めての投稿コードなので、どのように私はグループのために改善できるか教えてください。コードを使用してこのクラスを開発しましたhttp://www.devasp.net/net/articles/display/391.htmlenter code here

私はこれが役に立ちそうです。これは、これはクラス

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 
関連する問題