2012-02-23 11 views
1

VB netで単純なボールボールアプリケーションを作成しようとしています。 私はタイマーとFillEllipse()メソッドを使用して、タイマーのすべての目盛りで新しいサークルを作成しようとしています。 コード:VB.NETフォームの背景をクリアするには

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
     Dim Gr As Graphics = Me.CreateGraphics 

     Gr.FillEllipse(Brushes.Teal, X, Y, W, H) 
     CollisionDetect() 
     X = X + X_Dir 
     Y = Y + Y_Dir 

     Gr.Dispose() 

    End Sub 

結果は?フォームは、最後の円をクリアすることなく、連続的に描画されます。これは、あなたが一緒に球体の「線」で終わることを意味します。明確にするため

: Xがよく、X-COORDS YがY- Y-COORDSである

X_Dirは整数で、それが次回のループ反復にループの反復ごとに加算され、それは別の場所にあるでしょう。 Y_DirはY座標の場合と同じですが、

CollisionDetect()が空です。それはまだ満たされている、それはフォームの側面との衝突を処理します。 W、Hはそれぞれ幅と高さです。

アイデア?

+0

CLSメソッドが.Netへの移植時に使いこなすのは難しいですが、そうでなければ私はそれを提案します。 – N0Alias

答えて

0

通常、ペイントイベントが発生するとペイントされます。フォームに希望の背景色のコントロールPanelを追加します。あなたが描く前に、パネル

Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint 
    e.Graphics.FillEllipse(Brushes.Teal, X, Y, W, H) 
End Sub 

パネルのPaintイベントを処理し、常に自動的にクリアされます。

変更Paintイベントは、パネルは、例えば、別の形で隠されていた場合、自動的に発射し、持っていることを

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
    Panel1.Invalidate() ' This triggers the Paint event 
    CollisionDetect() 
    X = X + X_Dir 
    Y = Y + Y_Dir 
End Sub 

ノートにタイマーティックイベントハンドラが再描画されます。コンピュータがビジー状態で、ペイントできない場合、一部のペイントイベントはスキップされる可能性があります。したがって、ゲームロジック(計算)はTimer1_Tickにしてください。あなたがフォーム上に直接描画することを好む場合


は、あなたが行うことができ、パネルのペイントイベントの代わりに、フォームのPaintイベントを使用して、代わりにPanel1.Invalidate()Me.Invalidate()を呼び出すことによって。

+0

長方形を描くか?例をお願いします – Azerty560

+0

Timer1.tickの最後のような意味ですか、私はその最後に四角形を描きますか? – Azerty560

+0

ありがとう、これは非常に便利でした! :D – Azerty560

関連する問題