C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[14]: オブジェクトを動かすことについて


(過去ログ 70 を表示中)

[トピック内 21 記事 (1 - 20 表示)]  << 0 | 1 >>

■40725 / inTopicNo.1)  オブジェクトを動かすことについて
  
□投稿者/ だめ男 (1回)-(2009/09/01(Tue) 23:47:04)

分類:[.NET 全般] 

はじめまして、最近VB.NETを始めたばかりの超初心者ですが
宜しくお願いします。
現在の環境はvisual stagio2003です。

本題ですが、今、タイマー機能を使ってオブジェクト(ピクチャーボックス)を動かすプログラムを作っています。
フォームに配置された1つのボタンを押すと、フォームの左端からピクチャーボックスがスタートしてフォームの4隅を動き回るというプログラムを作っているんですがどうしても3隅までしか動きません。以下にコードを載せますのでどこが違うのかご指摘下さい。
__________________________________________________
Dim goingup As Boolean




Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
goingup = True
Timer1.Enabled = True
Button1.Text = "止まれ"



End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If goingup = True Then
PictureBox1.Left = PictureBox1.Left + 30
End If
If PictureBox1.Left > 600 Then
goingup = False
PictureBox1.Top = PictureBox1.Top + 30
End If
If PictureBox1.Top > 300 Then
PictureBox1.Left = PictureBox1.Left - 30
End If
If PictureBox1.Left > (Me.Size.Width - 10) Then
PictureBox1.Top = PictureBox1.Top + 30
End If
End Sub
引用返信 編集キー/
■40733 / inTopicNo.2)  Re[1]: オブジェクトを動かすことについて
□投稿者/ Azulean (439回)-(2009/09/02(Wed) 00:15:08)
No40725 (だめ男 さん) に返信
> 以下にコードを載せますのでどこが違うのかご指摘下さい。

下記の場所の If 文の条件と、その中の処理が多分違うのでしょう。

> If PictureBox1.Left > (Me.Size.Width - 10) Then
> PictureBox1.Top = PictureBox1.Top + 30
> End If

よく読み直した上で分からなければ、この If 文に書いた条件はどういうものか、If 文の中で実行される計算式は何を意味しているかを説明してみて下さい。
引用返信 編集キー/
■40735 / inTopicNo.3)  Re[2]: オブジェクトを動かすことについて
□投稿者/ だめ男 (2回)-(2009/09/02(Wed) 01:22:10)
No40733 (Azulean さん) に返信
>> If PictureBox1.Left > (Me.Size.Width - 10) Then
>> PictureBox1.Top = PictureBox1.Top + 30
>> End If
回答ありがとうございます。
えーと
条件;フォーム左端から10ピクセル前をピクチャーボックスが超えたとき
処理;ピクチャーボックスを上方向に移動させる

こんな認識でコードを記述していましたがどうでしょうか?
引用返信 編集キー/
■40736 / inTopicNo.4)  Re[3]: オブジェクトを動かすことについて
□投稿者/ やじゅ (1301回)-(2009/09/02(Wed) 01:57:22)
やじゅ さんの Web サイト
2009/09/02(Wed) 02:00:08 編集(投稿者)

No40735 (だめ男 さん) に返信
> PictureBox1.Top = PictureBox1.Top + 30
> 処理;ピクチャーボックスを上方向に移動させる

上方向? + + − −
引用返信 編集キー/
■40738 / inTopicNo.5)  Re[4]: オブジェクトを動かすことについて
□投稿者/ だめ男 (3回)-(2009/09/02(Wed) 02:31:30)
No40736 (やじゅ さん) に返信
> 2009/09/02(Wed) 02:00:08 編集(投稿者)
すみません、やはり間違っていましたか?
では上じゃなくて下方向に30ピクセル動かすということでしょうか??
TOPプロパティは垂直方向に動かすんですよね。
引用返信 編集キー/
■40739 / inTopicNo.6)  Re[4]: オブジェクトを動かすことについて
□投稿者/ ?? (4回)-(2009/09/02(Wed) 02:35:36)
(1)-------------------------------
    (+Y)
     |
     |
     |
  A   |     B
     |
     |
−−−−−+−−−−−−(+X)
     |
     |
  C   |     D
     |
     |
     |

(2)-------------------------------
    (-Y)
     |
     |
     |
  C   |     D
     |
     |
−−−−−+−−−−−−(+X)
     |
     |
  A   |     B
     |
     |
     |
    (+Y)


コンピュータの座標系は、B のところ。真ん中の+のところが(0,0)
だから、X を増加させると下方向に移動するんです。

(1)図の B のような座標系で管理したいなら、(0,0) の位置は、1024 * 768 ドットの画面だと、
(767,0) になります。

>> PictureBox1.Top = PictureBox1.Top + 30
だから、これは、上じゃなくて下方向に30ドット移動って意味になります。


引用返信 編集キー/
■40740 / inTopicNo.7)  Re[5]: オブジェクトを動かすことについて
□投稿者/ ?? (5回)-(2009/09/02(Wed) 02:40:43)
>X を増加させると下方向に移動するんです。
Y に訂正。
引用返信 編集キー/
■40741 / inTopicNo.8)  Re[6]: オブジェクトを動かすことについて
□投稿者/ だめ男 (4回)-(2009/09/02(Wed) 03:01:56)
No40740 (?? さん) に返信


回答ありがとうございます。
>>> PictureBox1.Top = PictureBox1.Top + 30
だから、これは、上じゃなくて下方向に30ドット移動って意味になります。
↑これはわかりました。しかし・・・

>コンピュータの座標系は、B のところ。真ん中の+のところが(0,0)
だから、Y を増加させると下方向に移動するんです。

のBのところがよくわかりません・・・。

(1)と(2)の図のどちらの事か理解できなくて、すみません。


引用返信 編集キー/
■40742 / inTopicNo.9)  Re[3]: オブジェクトを動かすことについて
□投稿者/ Azulean (440回)-(2009/09/02(Wed) 07:14:55)
No40741 (だめ男 さん) に返信
> (1)と(2)の図のどちらの事か理解できなくて、すみません。
(2)です。

No40735 (だめ男 さん) に返信
> >> If PictureBox1.Left > (Me.Size.Width - 10) Then
> 条件;フォーム左端から10ピクセル前をピクチャーボックスが超えたとき
Me.Size はフォームのサイズです。Width は幅になります。その値は本当に左端でしょうか?
引用返信 編集キー/
■40744 / inTopicNo.10)  Re[4]: オブジェクトを動かすことについて
□投稿者/ よこはいり (10回)-(2009/09/02(Wed) 07:49:52)
2009/09/02(Wed) 09:01:42 編集(投稿者)
これでどうでしょうか  

    Dim goingup As Boolean


    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If goingup = True Then
            PictureBox1.Left = PictureBox1.Left + 5
        End If
        If PictureBox1.Left > 600 Then
            goingup = False
            PictureBox1.Top = PictureBox1.Top + 5
        End If
        If PictureBox1.Top > 300 Then
            PictureBox1.Left = PictureBox1.Left - 5
        End If
        If PictureBox1.Left < 100 Then
            PictureBox1.Top = PictureBox1.Top - 5
        End If
        
        If PictureBox1.Top < 100 Then
            PictureBox1.Left = PictureBox1.Left + 5
        End If
    End Sub




    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        goingup = True
        Timer1.Enabled = Not Timer1.Enabled(もう一度クリックすると止まるようにしました)
         If Timer1.Enabled = True Then
            Button1.Text = "止まれ "
        Else
            Button1.Text = "スタート "
        End If
    End Sub

*ちなみにMe.Size.Width はForm1の幅の最大値です。640×480のサイズならMe.Size.Width =640です。
      
   

引用返信 編集キー/
■40749 / inTopicNo.11)  Re[5]: オブジェクトを動かすことについて
□投稿者/ じゅげむ (1回)-(2009/09/02(Wed) 09:12:18)
2009/09/02(Wed) 09:13:37 編集(投稿者)
                                           

           (0.0)                                                          
         ──────────────────── X                
               │                             →   +                       
               │↓                                                            
               │ +                                                           
               │                                                              
               │                                                              
               │                                                              
               │                                                              
               │                                                              
               │                                                              
               │                                                              
               │                                                              
               │                                                              
               │                                                              
               │                                                              
        Y















引用返信 編集キー/
■40773 / inTopicNo.12)  Re[6]: オブジェクトを動かすことについて
□投稿者/ だめ男 (5回)-(2009/09/02(Wed) 15:42:04)
No40749 (じゅげむ さん) に返信
回答が遅くなってすみません。
実は回答番号40741で回答した後に、本と回答を何度も読み直して、回答された座標どおりに考えたら理解でき、すぐに動かすことができました。
その時に報告ができず遅れて報告してしまいその分回答の手間をおかけしてすみません。
できたコードは、よこはいりさんと同じコードになりました。
このプログラムを始めたときには、本をほとんど読まず、基礎をすっとばして、いきなり始めたので皆さんのアドバイスが最初は理解しにくかったですが、本を何度も読んでいくとアドバイスが理解できるようになりとても参考になりました。
ありがとうございました。
解決済み
引用返信 編集キー/
■40784 / inTopicNo.13)  Re[7]: オブジェクトを動かすことについて
□投稿者/ Azulean (443回)-(2009/09/03(Thu) 00:09:50)
No40773 (だめ男 さん) に返信
> できたコードは、よこはいりさんと同じコードになりました。

だとすると、Left + 5 という行が 2 つあることになりますね。
もうちょっと見直せる可能性は残っていますので、余裕ができたときにでも、どのように見直せるか、コードを共通化できるか等、考えてみて下さい。

例えば、goingup という変数は最初しか使わないのかとか。
解決済み
引用返信 編集キー/
■40785 / inTopicNo.14)  Re[8]: オブジェクトを動かすことについて
□投稿者/ だめ男 (6回)-(2009/09/03(Thu) 01:24:00)
No40784 (Azulean さん) に返信
> ■No40773 (だめ男 さん) に返信
>>できたコードは、よこはいりさんと同じコードになりました。
>
> だとすると、Left + 5 という行が 2 つあることになりますね。
> もうちょっと見直せる可能性は残っていますので、余裕ができたときにでも、どのように見直せるか、コードを共通化できるか等、考えてみて下さい。
>
> 例えば、goingup という変数は最初しか使わないのかとか。

回答ありがとうございます。
わかりました、もうちょっと考えてみます。

で今、考えついたんですが
> だとすると、Left + 5 という行が 2 つあることになりますね。
上のLeft + 5を一本化というか共通化するとは以下のような感じでしょうか?

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If goingup = True Then
PictureBox1.Left = PictureBox1.Left + 5
End If
If PictureBox1.Left > 600 Then
goingup = False
PictureBox1.Top = PictureBox1.Top + 5
End If
If PictureBox1.Top > 300 Then
PictureBox1.Left = PictureBox1.Left - 5
End If
If PictureBox1.Left < 100 Then
PictureBox1.Top = PictureBox1.Top - 5
End If

If PictureBox1.Top < 100 Then
goingup = True
End If
End Sub

一応最後の部分を変えただけでも動きましたがどうでしょうか?

引用返信 編集キー/
■40786 / inTopicNo.15)  Re[9]: オブジェクトを動かすことについて
□投稿者/ Azulean (444回)-(2009/09/03(Thu) 06:54:45)
No40785 (だめ男 さん) に返信
> 上のLeft + 5を一本化というか共通化するとは以下のような感じでしょうか?
手元で実行してみましたが、PictureBox1 の最初のスタート地点はLeft = 0, Top = 0 ではなく、別の場所からなのでしょうか?
Left = 0, Top = 0 からスタートすると、最初に右上に消えていくと思いますが…。
(要するに goingup = True と Left < 100 が同時に成立している)
前回の指摘の際に漏れていて申し訳ありません。


改善するためのヒント:
・右に移動する、下に移動する、左に移動する、上に移動するのどの状態なのかを保持できるようにする。
・それぞれの状態別のコードで次の状態に遷移する判定を入れる。
・それぞれの状態別のコードで実際に Top, Left の値を変更する。

# そもそもの前提として、斜めに移動するはなしですよね?
引用返信 編集キー/
■40791 / inTopicNo.16)  Re[10]: オブジェクトを動かすことについて
□投稿者/ よこはいり (11回)-(2009/09/03(Thu) 10:17:02)
No40786 (Azulean さん) に返信
> 改善するためのヒント:
> ・右に移動する、下に移動する、左に移動する、上に移動するのどの状態なのかを保持できるようにする。
> ・それぞれの状態別のコードで次の状態に遷移する判定を入れる。
> ・それぞれの状態別のコードで実際に Top, Left の値を変更する。
> 

確かにおかしいですね。それに加えてストップを押してからスタートを押すと動きません。
なんともおかしなコードをアップしまして申し訳ないです
私も勉強したいと思います。

引用返信 編集キー/
■40794 / inTopicNo.17)  Re[11]: オブジェクトを動かすことについて
□投稿者/ よこはいり (12回)-(2009/09/03(Thu) 11:30:16)
2009/09/03(Thu) 20:10:28 編集(投稿者)
2009/09/03(Thu) 20:02:37 編集(投稿者)


■No40786 (Azulean さん) に返信

力技で解決しました。(こういうのはよろしくないと思うのですが)
こういったワザではプログラミングは上達しないでしょうか?もといプログラミングの素養に欠けるのかな?

Public Class Form1

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Timer2.Enabled = True
        
        
        If PictureBox1.Left > 600 Then
            Timer2.Enabled = False
            PictureBox1.Top = PictureBox1.Top + 5
        End If
        If PictureBox1.Top > 300 Then
            Timer2.Enabled = False
            PictureBox1.Left = PictureBox1.Left - 5
        End If
        If PictureBox1.Left < 0 Then
            Timer2.Enabled = False
            PictureBox1.Top = PictureBox1.Top - 5
        End If

        If PictureBox1.Top < 0 Then
       Timer2.Enabled = True
        
           
        End If
    End Sub

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


        Timer1.Enabled = Not Timer1.Enabled
        If Timer1.Enabled = True Then
            Button1.Text = "止まれ "
        Else
            Button1.Text = "スタート "

        End If
        



    End Sub




    
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        PictureBox1.Left += 5
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        PictureBox1.Left = 0
        PictureBox1.Top = 0
    End Sub
End Class

引用返信 編集キー/
■40819 / inTopicNo.18)  Re[12]: オブジェクトを動かすことについて
□投稿者/ よこはいり (13回)-(2009/09/03(Thu) 20:47:19)
> ■No40786 (Azulean さん) に返信
> 
> 力技で解決しました。(こういうのはよろしくないと思うのですが)
> こういったワザではプログラミングは上達しないでしょうか?もといプログラミングの素養に欠けるのかな?
> 
> Public Class Form1
> 
>     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
>         Timer2.Enabled = True
>         
>         
>         If PictureBox1.Left > 600 Then
>             Timer2.Enabled = False
>             PictureBox1.Top = PictureBox1.Top + 5
>         End If
>         If PictureBox1.Top > 300 Then
>             Timer2.Enabled = False
>             PictureBox1.Left = PictureBox1.Left - 5
>         End If
>         If PictureBox1.Left < 0 Then
>             Timer2.Enabled = False
>             PictureBox1.Top = PictureBox1.Top - 5
>         End If
> 
>         If PictureBox1.Top < 0 Then
>        Timer2.Enabled = True
>         
>            
>         End If
>     End Sub
> 
>     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
> 
> 
>         Timer1.Enabled = Not Timer1.Enabled
>         If Timer1.Enabled = True Then
>             Button1.Text = "止まれ "
>         Else
>             Button1.Text = "スタート "
> 
>         End If
>         
> 
> 
> 
>     End Sub
> 
> 
> 
> 
>     
>     Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
>         PictureBox1.Left += 5
>     End Sub
> 
>     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
>         PictureBox1.Left = 0
>         PictureBox1.Top = 0
>     End Sub
> End Class

これもおかしいですね。一度ストップして再度スタートを押すと押した場所によっておかしな挙動をします。
あ〜あ。こんなプログラムもまともに作れない私は アホ!

引用返信 編集キー/
■40827 / inTopicNo.19)  Re[12]: オブジェクトを動かすことについて
□投稿者/ Azulean (448回)-(2009/09/04(Fri) 00:16:55)
goingup というフラグなのに、それが True の時は右に移動するよく分からないロジックであったことに気がついた。orz

■No40794 (よこはいり さん) に返信
> 力技で解決しました。(こういうのはよろしくないと思うのですが)
> こういったワザではプログラミングは上達しないでしょうか?もといプログラミングの素養に欠けるのかな?
Timer を分ける必要はありません。
現在の移動方向を覚えておき、それに基づいて移動処理と次の移動方向に切り替えるかの判定をすれば良いでしょう。

下記に実際に手元で動かしたコードから、一部をコメントに置き換えたものを載せています。
必要に応じて穴埋めして下さい。
ElseIf であれば、どこかに一度入れば、他のブロックは実行されません。

' 今進んでいる方向を表すための列挙値
Private Enum Direction
    Right 
    Down
    Left
    Up
End Enum

' 今進んでいる方向を表すメンバー変数
Private CurrentDirection As Direction = Direction.Right

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    ' 今はどちらに進んでいるか
    If CurrentDirection = Direction.Right Then
        ' 右へ
        If ' 右端到達 Then
            ' 次からは下に移動する
            CurrentDirection = Direction.Down
        End If
    ElseIf CurrentDirection = Direction.Down Then
        ' 下へ
        If ' 下端到達 Then
            ' 次からは左に移動する
            CurrentDirection = Direction.Left
        End If
    ElseIf CurrentDirection = Direction.Left Then
        ' 左へ
        If ' 左端到達 Then
            ' 次からは上に移動する
            CurrentDirection = Direction.Up
        End If
    ElseIf CurrentDirection = Direction.Up Then
        ' 上へ
        If ' 上端到達 Then
            ' 次からは右に移動する
            CurrentDirection = Direction.Right
        End If
    End If
End Sub

引用返信 編集キー/
■40858 / inTopicNo.20)  Re[13]: オブジェクトを動かすことについて
 
□投稿者/ よこはいり (14回)-(2009/09/04(Fri) 15:19:17)
No40827 (Azulean さん) に返信

有り難うございます。

Public Class Form1
    Private Enum Direction
        Right
        Down
        Left
        Up
    End Enum

    ' 今進んでいる方向を表すメンバー変数
    Private CurrentDirection As Direction = Direction.Right

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        ' 今はどちらに進んでいるか
        If CurrentDirection = Direction.Right Then
            ' 右へ
            PictureBox1.Left += 5
            If PictureBox1.Left > 600 Then
                ' 次からは下に移動する
                CurrentDirection = Direction.Down
            End If
        ElseIf CurrentDirection = Direction.Down Then
            ' 下へ
            PictureBox1.Top += 5
            If PictureBox1.Top > 300 Then
                ' 次からは左に移動する
                CurrentDirection = Direction.Left
            End If
        ElseIf CurrentDirection = Direction.Left Then
            ' 左へ
            PictureBox1.Left -= 5
            If PictureBox1.Left < 0 Then
                ' 次からは上に移動する
                CurrentDirection = Direction.Up
            End If
        ElseIf CurrentDirection = Direction.Up Then
            ' 上へ
            PictureBox1.Top -= 5
            If PictureBox1.Top < 0 Then

                CurrentDirection = Direction.Right
            End If
        End If
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


        Timer1.Enabled = Not Timer1.Enabled
        If Timer1.Enabled = True Then
            Button1.Text = "止まれ "
        Else
            Button1.Text = "スタート "

        End If
        Button1.Text = "止まれ "



    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        PictureBox1.Left = 0
        PictureBox1.Top = 0
    End Sub



End Class

解決済み
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -