反応が遅い?
投稿者 初心者  ()
投稿日時
2008/7/31 20:03:00
全て表示
投稿者 るきお  ()
投稿日時
2008/8/1 05:53:00
画像をすばやく左右に移動させたいのであればPictureBoxを使わないで直接描画します。
ただし、これでもそれほど速くなく、もっと速くしたいのであればDirectXの導入を検討します。
以下、直接描画する例です。
移動量を増やせば一応素早くはなりますが動きが荒くなりますよね。
他の方からも指摘が出ているように入力方式も見直した方がいいかもしれませんが、とりあえずKeyDownを踏襲しました。
Public Class Form1
Dim Photo As Image
Dim PhotoLocation As Point
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
Select Case e.KeyCode
Case Keys.Right
PhotoLocation.X += 20
Case Keys.Left
PhotoLocation.X -= 20
Case Else
Return
End Select
Me.Invalidate()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Photo = Image.FromFile("C:\Windows\隅田川.bmp")
PhotoLocation = New Point(200, 100)
Me.KeyPreview = True
Me.DoubleBuffered = True
Me.BackColor = Color.Black
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
e.Graphics.DrawImage(Photo, PhotoLocation)
End Sub
End Class
ただし、これでもそれほど速くなく、もっと速くしたいのであればDirectXの導入を検討します。
以下、直接描画する例です。
移動量を増やせば一応素早くはなりますが動きが荒くなりますよね。
他の方からも指摘が出ているように入力方式も見直した方がいいかもしれませんが、とりあえずKeyDownを踏襲しました。
Public Class Form1
Dim Photo As Image
Dim PhotoLocation As Point
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
Select Case e.KeyCode
Case Keys.Right
PhotoLocation.X += 20
Case Keys.Left
PhotoLocation.X -= 20
Case Else
Return
End Select
Me.Invalidate()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Photo = Image.FromFile("C:\Windows\隅田川.bmp")
PhotoLocation = New Point(200, 100)
Me.KeyPreview = True
Me.DoubleBuffered = True
Me.BackColor = Color.Black
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
e.Graphics.DrawImage(Photo, PhotoLocation)
End Sub
End Class
投稿者 るきお  ()
投稿日時
2008/8/1 06:01:00
補足します。
「PictureBoxを使わないで直接描画します。 」と書きましたが、これは別にFormに描画という意味ではなく、DrawImageなどの描画メソッドを使って描画するという意味で、
描画先はFormでもPictureBoxでも大差ありません。
私のサンプルを実行するには何もないフォームにコードを貼り付けてプログラムを開始するだけです。何もコントロールを配置する必要はありません。
ただし、初心者さんが提示されたコードと速度はほとんど変わらないです。若干速い気はしますが気のせいかもしれません…。
「PictureBoxを使わないで直接描画します。 」と書きましたが、これは別にFormに描画という意味ではなく、DrawImageなどの描画メソッドを使って描画するという意味で、
描画先はFormでもPictureBoxでも大差ありません。
私のサンプルを実行するには何もないフォームにコードを貼り付けてプログラムを開始するだけです。何もコントロールを配置する必要はありません。
ただし、初心者さんが提示されたコードと速度はほとんど変わらないです。若干速い気はしますが気のせいかもしれません…。
投稿者 初心者  ()
投稿日時
2008/9/12 06:22:00
皆さん、例を出してくれると幸いです。
投稿者 玲  ()
投稿日時
2008/9/14 03:16:00
>>6
何を作ってるんだ?
あのさぁ、キーボードでキャラ動かしたりするのは、やめた方がよい。
ちなみに私はキーボードで動かすonlineGameは、やらない。理由?
指が疲れる。1時間でケイレンしそうになった。
マウスで処理した方がいいよ。
画面にジョイスティクを描画するか、ラベルでも使った方がいい。
koeigameはマウスで動かせるから、あまり疲れない。
{上}{下}{右}{左}
処理は速い。
何を作ってるんだ?
あのさぁ、キーボードでキャラ動かしたりするのは、やめた方がよい。
ちなみに私はキーボードで動かすonlineGameは、やらない。理由?
指が疲れる。1時間でケイレンしそうになった。
マウスで処理した方がいいよ。
画面にジョイスティクを描画するか、ラベルでも使った方がいい。
koeigameはマウスで動かせるから、あまり疲れない。
{上}{下}{右}{左}
処理は速い。
投稿者 玲  ()
投稿日時
2008/9/14 05:03:00
>>6
まぁ、反映してるかどうか知らんが。
見えてる?
マウス処理なら50倍の速さになる。
それにツッコミ所は、イベントのトコ。
Form1_keydownでよいのでは?
それと、マウス処理で50倍の速さになっても、gameセンターのように綺麗に移動しないよ。
もうちょっと、速い言語なら綺麗に動く。
マシン語に近い言語なら綺麗に動く。
まぁ、反映してるかどうか知らんが。
見えてる?
マウス処理なら50倍の速さになる。
それにツッコミ所は、イベントのトコ。
Form1_keydownでよいのでは?
それと、マウス処理で50倍の速さになっても、gameセンターのように綺麗に移動しないよ。
もうちょっと、速い言語なら綺麗に動く。
マシン語に近い言語なら綺麗に動く。
投稿者 初心者  ()
投稿日時
2008/9/14 05:25:00
>>8
Form1_KeyDownってどうやって作る(?)のですか?
Form1_KeyDownってどうやって作る(?)のですか?
投稿者 初心者  ()
投稿日時
2008/9/14 05:27:00
>>9
それと、マウス処理ってどんな感じですか?学校の授業とかで急がしのでVBあまり勉強できていないので、どうかお願いします。
それと、マウス処理ってどんな感じですか?学校の授業とかで急がしのでVBあまり勉強できていないので、どうかお願いします。
投稿者 初心者  ()
投稿日時
2008/9/14 06:30:00
Form1_KeyDownは解決しました。ご迷惑をお掛けしました。
投稿者 玲  ()
投稿日時
2008/9/14 07:55:00
>>11
学校の勉強のが難しいはず。
basicは簡単なはずですよ。
ではでは。
学校の勉強のが難しいはず。
basicは簡単なはずですよ。
ではでは。
投稿者 初心者  ()
投稿日時
2008/9/14 08:19:00
>>12
解決しました。みなさんのおかげです。学校の授業やVBをこれからもがんばっていきたいと思っています。本当に感謝しています。
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.Right Then
Timer1.Enabled = True
End If
If e.KeyCode = Keys.Left Then
Timer2.Enabled = True
End If
End Sub
Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
If e.KeyCode = Keys.Right Then
Timer1.Enabled = False
ElseIf e.KeyCode = Keys.Left Then
Timer2.Enabled = False
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Label1.Location.X <= 192 Then
Label1.Location = New Point(Label1.Location.X + 5, Label1.Location.Y)
End If
End Sub
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
If Label1.Location.X >= 0 Then
Label1.Location = New Point(Label1.Location.X - 5, Label1.Location.Y)
End If
End Sub
解決しました。みなさんのおかげです。学校の授業やVBをこれからもがんばっていきたいと思っています。本当に感謝しています。
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.Right Then
Timer1.Enabled = True
End If
If e.KeyCode = Keys.Left Then
Timer2.Enabled = True
End If
End Sub
Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
If e.KeyCode = Keys.Right Then
Timer1.Enabled = False
ElseIf e.KeyCode = Keys.Left Then
Timer2.Enabled = False
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Label1.Location.X <= 192 Then
Label1.Location = New Point(Label1.Location.X + 5, Label1.Location.Y)
End If
End Sub
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
If Label1.Location.X >= 0 Then
Label1.Location = New Point(Label1.Location.X - 5, Label1.Location.Y)
End If
End Sub