ゲームでラベルを停止させるには??

解決


  2008-12-20 04:20:45  No: 141123

はじめまして。
私は今、VBでゲームを作っています。
そのゲームでは、ボタンを押してラベルを動かしたり、他のボタンを押してラベルを止めたりしています。
そこで今、困っているのが、Form1内の端にぶつかるとラベルが止まるという感じにしたいんです。
でも、何を記述していいのかわかりません。
解る方、解答をよろしくお願いします。

Public Class Form1

    Dim Vec As Integer

    Private Sub Timer1_Tick( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Timer1.Tick

        If Label1.Location.X + Label1.Size.Width >= Me.Width - 8 Then
            Vec = -4
        ElseIf Label1.Location.X <= 0 Then
            Vec = 4
        End If
        Label1.Location = New Point(Label1.Location.X + Vec, Label1.Location.Y)

    End Sub

    Private Sub Button1_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click

        Vec = -4
        Timer1.Enabled = True

    End Sub

    Private Sub Button2_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button2.Click

        Timer1.Enabled = False

    End Sub

    Private Sub Button3_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button3.Click

        Me.Close()

    End Sub

    Private Sub Button4_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button4.Click

        Vec = 4
        Timer1.Enabled = True

    End Sub
End Class


とおりすがり  2008-12-20 04:43:38  No: 141124

Timer1_Tick()で、Label1.Location.X + VecがForm1内の端にぶつかっていないかチェックすればよいのではないでしょうか。


  2008-12-20 05:26:00  No: 141125

解答ありがとうございます。
しかし、すいません。
私の知識ではとても、わかりません。
詳しい説明とVBのプログラムをお願いします。


アクア  URL  2008-12-20 08:41:16  No: 141126

アクアと申します。どうぞ宜しくお願い致します。

当方の環境を申し上げます。
OSはWindows Vista Ultimate SP1
VisualBasic2008 Professional Editionです。

ご質問なさる際は開発環境の記載を心掛けてください。
ただし今回ご提示いただいたコードを推察するとVisualBasic.NET(2002)以上であれば大丈夫でしょう。

今回の質問は
フォームのどちらかの端にLabelが当たると止まるようにしたい。
という事ですよね。

Timer_Tick()のプロシージャに記載されている内容は一定の時間の経過に従いイベントを実行し、イベントが発生する毎にLabelコントロールの座標を変化させています。
ご提示いただいたコードでの記述箇所は3行目から14行目までのコードです。

とおりすがりさんのアドバイスで
> Timer1_Tick()で、
とありますが、このプロシージャの中のコードに注目すると既にLabelの位置を変化させる判定があるのが確認できます。
そして今回の質問を解決するには当にこのプロシージャ内に命令文に手を加える事が必要となります。

理解を深めるために、このプロシージャを日本語に分解します。
If(もし) Label1のx座標+Label1の幅 >= このフォームの幅-8 Then(ならば)
    変数(Vec)に -4を代入する
ElseIf(上の条件に該当しない場合で、もし) Label1のx座標が <=0 Then(ならば)
  変数(Vec)に 4を代入する
End If
Label1の位置 = (x座標を現在のx座標+変数(Vec),現在のy座標のまま)の座標軸に代入する

となります。
更にデフォルメして表現すると(本当の意味で正しい表現ではありません。)

If(もし) Label1がこのフォームの右端 Then(ならば)
    左に進む
ElseIf(上の条件でなくて、もし) Label1がこのフォーム左端 Then(ならば)
    右に進む
End If

となります。
質問はフォームのどちらかの端にLabelが当たると止まるようにしたい訳ですから、進まずにこのプロシージャの処理から抜ければいいのです。
      ‾‾‾‾
プロシージャから抜ける処理は
Exit Sub
もしくは
Return
と記述します。

現実の業務でプログラムを作る場合にこんなコードを書いたら、上司から確実に叱られますが、宿題レベルなら十分でしょう。^^;;;


アクア  URL  2008-12-20 08:46:39  No: 141127

ズレたので修正。

修正前:
質問はフォームのどちらかの端にLabelが当たると止まるようにしたい訳ですから、進まずにこのプロシージャの処理から抜ければいいのです。
      ‾‾‾‾

修正後:
質問はフォームのどちらかの端にLabelが当たると止まるようにしたい訳ですから、
進まずに
‾‾‾‾
このプロシージャの処理から抜ければいいのです。


とおりすがり  2008-12-20 23:25:49  No: 141128

>私の知識ではとても、わかりません。
>詳しい説明とVBのプログラムをお願いします。

提示されたプログラムをご自分で書かれているなら十分可能だと思いますよ。それを考えるのが作る楽しさでは?

左に移動中か、右に移動中かはVecで判定できるわけですから、
左に移動中で左端にぶつかったらタイマーを停止・Exit Sub
右に移動中で右端にぶつかったらタイマーを停止・Exit Sub
それだけでOKかと。

Timer_Tick()内の”Vec=4”や”Vec=-4”を”Vec=0"に置き換えてみて
ください。ヒントになるかも。


  2008-12-21 08:51:56  No: 141129

わかりやすい説明ありがとうございます。
ようやく理解ができました。
本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加