私は月面着陸ゲームを作っており、左右の矢印キーを押したときに宇宙船を回転させたいと考えています。vb.netのキープレスで画像を回転する方法
私は画像ボックスとkeydownイベントを使用して画像を移動する方法を知っていますが、とにかく直接にはありません画像ボックスを回転します。私は私が望むものを達成するためにイメージを別の方法で使用する必要がありますか?どんな助けでも大歓迎です。
私は月面着陸ゲームを作っており、左右の矢印キーを押したときに宇宙船を回転させたいと考えています。vb.netのキープレスで画像を回転する方法
私は画像ボックスとkeydownイベントを使用して画像を移動する方法を知っていますが、とにかく直接にはありません画像ボックスを回転します。私は私が望むものを達成するためにイメージを別の方法で使用する必要がありますか?どんな助けでも大歓迎です。
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、寸法等...))
これは私の初めての投稿コードなので、どのように私はグループのために改善できるか教えてください。コードを使用してこのクラスを開発しました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
あるボタンのコード
あるに読ん【お願い]も[観光] – Plutonix
を取ってください。代わりのPictureBoxの画像を回転させます。 Graphics.RotateTransform + DrawImageで簡単にできました。それは完全に役に立たないので、絵のボックスを失うかもしれない。 –
実際に画像ボックスを失う可能性はありません。画像ボックス内の画像を回転すると画像の一部が四角形にカットされるので、画像を大きくしてから大きくすることができます回転させると画像のエッジはカットされますが、「宇宙船」の部分はカットされません。これと言われている画像ボックスを使用しないでください。画像ボックスをレンダリングするのに時間がかかり、再描画イベント(画像ボックスが移動したとき)のためにちらつくことがあります。 –