none
[VB2008] 拋物線跟碰撞偵測問題 RRS feed

  • 問題

  • 請問要如何在 PictureBox1 的物件做拋物線跟碰撞偵測問題

    或者在 ImageList1 的物件做拋物線跟碰撞偵測問題

     

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

    If (PictureBox1.Left <= PictureBox2.Left + PictureBox2.Width) And (PictureBox1.Left >= PictureBox2.Left - PictureBox1.Width) And (PictureBox1.Top <= PictureBox2.Top + PictureBox2.Height) And (PictureBox1.Top >= PictureBox2.Top - PictureBox1.Height) Then
                PictureBox1.Visible = True
                PictureBox2.Visible = False

    我有用這個碰撞偵測是沒問題  可是換成拋物線就無法碰撞偵測了

     

    2011年11月12日 下午 02:04

解答

  • 一個 PictureBox ,一個 Label ,兩個 button ,一個命名為 buttonBall

    Public Class Form1
    	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    		Dim g As Graphics = PictureBox1.CreateGraphics
    		PictureBox1.Size = New Size(400, 400)
    		buttonBall.Size = New Size(50, 50)
    		buttonBall.Location = New Point(500 * Rnd() - 50, 500 * Rnd() - 50)
    		Dim BallRect As New RectangleF(buttonBall.Location, buttonBall.Size)
    
    		PictureBox1.Region = New System.Drawing.Region(PictureBox1.ClientRectangle)
    		PictureBox1.Region.Intersect(BallRect)
    
    		If PictureBox1.Region.GetBounds(g) <> BallRect Then Label1.Text = "碰撞" Else Label1.Text = "未碰撞"
    
    		g.Dispose()
    	End Sub
    End Class
    
    


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月16日 下午 12:49
  • 安你好

    或是參考以下

    直接利用 矩形 結構   Rectangle 判斷碰撞(就是判斷是否產生交集)

     

           Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
            '建立碰撞體(PictureBox)的 Rectangle 結構
            Dim boundsRect As Rectangle = New Rectangle(Me.PictureBox1.Location, Me.PictureBox1.Size)
            '建立被碰撞體(PictureBox2)的 Rectangle 結構
            Dim PicRectangle As Rectangle = New Rectangle(Me.PictureBox2.Location, Me.PictureBox2.Size)
            '利用 IntersectsWith 判斷碰撞
            MsgBox(boundsRect.IntersectsWith(PicRectangle))
        End Sub
    


    圓形或不規則形狀要再研究。

    參考 

    Rectangle.IntersectsWith 方法

    http://msdn.microsoft.com/zh-tw/library/system.drawing.rectangle.intersectswith(v=vs.80).aspx

    PS : 我是來這學習討論的,畢竟以前未做過類似的功能需求

    2011年11月16日 下午 03:56

所有回覆

  • 推薦你去看這本,看完後你連上面這種作法都會砍掉重練:

    http://www.google.com.tw/#hl=zh-TW&source=hp&q=%E5%BF%AB%E9%80%9F+3D+%E7%B9%AA%E5%9C%96%E6%BC%94%E7%AE%97%E6%B3%95


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月12日 下午 03:32
  • 如果不在乎精度 (4 bytes 整數):

    API 關鍵字:PtInRect

    .Net 類別:Region.IsVisible


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月12日 下午 03:36
  • 請問哪邊有再賣這本書 還是網站有說明 快速 3D 繪圖演算法
    2011年11月13日 上午 11:22
  • 我以前是在電腦書店買的。還有一本相關的書名叫做 OpenGL 聖經。

    台灣開發者不太看演算法這類書,所以賣的不是很好。可能要托相熟的書店叫貨吧...

    上面 Google 網址可以找到很多人在拍賣,包含順發也有出清...


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月13日 上午 11:56
  • 請問還有沒有vb2008的相關書籍.有在說明拋物線跟碰撞偵測問題.我在墊腳石書局找了好多相關書都沒有做這方面的介紹.也沒有快速 3D 繪圖演算法

    還是有哪邊網頁有做專門的介紹.剛去金石堂網路看了一下有快速 3D 繪圖演算法可是供應商不往來.明天我在去找看看

     


    2011年11月13日 下午 01:32
  • 這邊沒看到你的拋物線方程式,你這段怎樣處理?

    前面說了,如果你不求精度,用 API / .Net 的 Region 即可,用這個只要你拋物線方程式正確,不用管圖元 Cut 的問題。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月13日 下午 05:50
  • 這邊是程式碼

    Public Class Form1

        '---------- Local structures ----------

        'Positions [位置的變數]
        Structure struc_pos
            Dim x, y As Integer 'Current position [目前的 x,y]
            Dim ini_x, ini_y As Integer 'Initial position [拋物線參考的最初 x,y,就是物理中表示的 x0,y0]
            Dim ang As Single 'Current angle [目前的角度,為碰撞時可轉換]
            Dim vx, vy As Single 'Current velocity [目前的速度分量]
            Dim ini_vx, ini_vy As Single 'Initial velocity [一開始的 速度分量,就是物理中表示的 vx0,vy0]
            Dim ini_v As Single 'Initial velocity [一開始的速度]
            Dim g As Single  'Gravity constant [重力常數]
        End Structure

        '---------- Local constants ----------

        'Initial positions
        Const user_ini_v As Single = 90 '[設定一開始的速度(可調整)]
        Const user_ini_x As Integer = 50, user_ini_y As Integer = 500 '[圖片一開始的座標(可調整)]

        '---------- Local variables ----------

        'Graphics [繪圖]
        Dim g As System.Drawing.Graphics
        Dim dstRect, srcRect As Rectangle

        'List [清單]
        Dim listPic As New List(Of Image) 'List of picture
        Dim listAng As New List(Of Integer) 'List of angle

        'Collection [集合]
        Dim collRep As New Collection

        'Positions [宣告座標的巢狀結構]
        Dim pos As struc_pos

        'Flags [旗標]
        Dim stat_moving As Integer 'Status (Pausing->0, Moving->1) [紀錄是否在移動]
        Dim stat_ang, max_ang As Integer 'Angle [角度(DEG),與最大值]
        Dim passedTime, multiTi As Single 'Time [已經過時間,與時間加倍量]

        'Help texts
        Const hlp_1 As String = "(1) 按 ""上"",""下"" 切換角度" & vbNewLine & "(2) 按 ""空白鍵"" 開始發射/停止" & vbNewLine & vbNewLine & "當物體碰撞到底下邊緣才會消失"


        Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

            local_kc_dir(e.KeyCode)

        End Sub

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

            Dim i As Integer

            '--- Variables ---

            'Position
            With pos
                .g = 9.8
                .ini_v = user_ini_v
            End With

            'Status
            stat_moving = 0
            stat_ang = 6 '[設定一開始是第三張圖片,30度的]

            'Time
            multiTi = 15 '[時間加倍量,太低圖片會跑很慢]

            '--- List of Images ---
            '[讀取圖片,並讀取角度值]
            max_ang = -1
            For i = 0 To 360 Step 15
                listPic.Add(Image.FromFile("00_" & i & ".gif"))
                listAng.Add(i)
                max_ang += 1
            Next

            '--- Obj. ---

            'PictureBox1
            local_renew_resetpic()
            PictureBox1.Visible = False

            'Timer1
            Timer1.Interval = 50

            '--- Sub ---
            local_change_pic()

        End Sub

        Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

            dstRect = Me.ClientRectangle
            srcRect = dstRect

            g = e.Graphics

            '--- Picture ---
            dstRect = New Rectangle(New Point(pos.x, pos.y), PictureBox1.Size)

            g.DrawImage(PictureBox1.Image, dstRect, srcRect, GraphicsUnit.Pixel)

            '--- Help text ---
            Dim tempFont As New Font("Arial", 12)

            If stat_moving = 0 Then
                g.DrawString(hlp_1, tempFont, Brushes.Black, New Point(60, 60))
            End If

            '--- Dispose ---
            e.Graphics.Dispose()

        End Sub

        Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If Timer1.Enabled = False Then Exit Sub

            'Accumulate time [時間累積]
            passedTime = passedTime + (Timer1.Interval / 1000) * multiTi

            'Renew position of PictureBox1 [更新圖片座標]
            local_renew_pospic()

            'Check collision with form [檢查是否碰撞]
            local_check_colli(New Rectangle(pos.x, pos.y, PictureBox1.Width, PictureBox1.Height), Me)

            If collfind(0) = 0 Then '[假如碰撞,這是呼叫 collfind 去找 collRep 中元素是否沒有 0 這個值,也就是函數檢查中檢查到碰撞]
                If collfind(4) = 1 Then '[底下的碰撞,再呼叫 local_start_moving 即可停止]
                    local_start_moving()
                Else
                    local_after_colli(collRep(1)) '[其他上、左、右邊的碰撞,轉換座標、速度、角度的函數,為了碰撞後接下來的反彈而作]
                End If
            End If
            PictureBox1.Location = New Point(pos.ini_x, pos.ini_y)

            If (PictureBox1.Left <= PictureBox2.Left + PictureBox2.Width) And (PictureBox1.Left >= PictureBox2.Left - PictureBox1.Width) And (PictureBox1.Top <= PictureBox2.Top + PictureBox2.Height) And (PictureBox1.Top >= PictureBox2.Top - PictureBox1.Height) Then
                PictureBox1.Visible = True
                PictureBox2.Visible = False
            End If
        End Sub



        Private Sub local_kc_dir(ByRef kc As Integer)

            Dim flagchange As Boolean = False

            'Determine the key
            Select Case kc
                Case Keys.Up
                    If stat_moving = 0 And (stat_ang < max_ang) Then stat_ang += 1 : flagchange = True
                Case Keys.Down
                    If stat_moving = 0 And (stat_ang > 0) Then stat_ang -= 1 : flagchange = True
                Case Keys.Space     'Start moving object when SPACE has been pressed, stop moving when pressing again
                    local_start_moving()
            End Select

            'Change image of PictureBox1
            If flagchange Then local_change_pic()

        End Sub

        Private Sub local_change_pic()

            PictureBox1.Image = listPic(stat_ang)
            Me.Refresh()

        End Sub

        Private Sub local_start_moving()

            'Switch value
            stat_moving = Not stat_moving


            'Calibrate positions [調整座標]
            local_clb_pos(0)

            'Enable Timer1
            passedTime = 0
            Timer1.Enabled = CBool(stat_moving)

            'Reset position
            If stat_moving = 0 Then
                local_renew_resetpic()
            End If

        End Sub

        Private Sub local_clb_pos(ByRef mode As Integer)

            '----- Formula ----- [物理公式參考]
            'vx=vx
            'vy=vy-(g*t)

            'x=x0+(v0x*t)
            'y=y0+(v0y*t)-(1/2*g*t^2)
            '___________________

            With pos
                If mode = 0 Then 'Initial values
                    .ang = math_degtorad(listAng(stat_ang)) '[把角度 DEG格式 轉換到 RAD格式]
                    .ini_vx = .ini_v * Math.Cos(.ang) : .ini_vy = .ini_v * Math.Sin(.ang) '[設定 vx0,vy0 好讓接下來移動中公式使用]
                Else
                    .vx = .ini_vx '[斜向拋射中 vx 不會變]
                    .vy = .ini_vy - (.g * passedTime) '[斜向拋射 vy=vy0-(gt)]
                    .ang = Math.Atan(.vy / .vx) '[用 ArcTan() 來更新角度的值]
                    If .vx < 0 And .vy > 0 Then .ang = math_revang(0, .ang) '[底下這兩行是為了修正 ArcTan 的結果]
                    If .vx < 0 And .vy < 0 Then .ang = .ang + Math.PI

                    '--- Debug ---
                    Me.Text = "ang=" & .ang * 180 / Math.PI & " vx=" & .vx & " vy=" & .vy & " Delta y=" & (.vy * passedTime) - (0.5 * .g * (passedTime ^ 2))
                    '_____________

                    .x = .ini_x + (.ini_vx * passedTime) '[底下兩行是更新目前座標 x,y]
                    .y = .ini_y + -((.ini_vy * passedTime) - (0.5 * .g * (passedTime ^ 2)))
                End If
            End With

        End Sub

        Private Sub local_check_colli(ByRef rect As Rectangle, ByVal obj_dst As Object)

            collRep.Clear()

            If rect.Y <= 0 Then collRep.Add(3) : Exit Sub '[與天花板碰撞]
            If rect.Y + rect.Height >= obj_dst.height Then collRep.Add(4) : Exit Sub '[與地板碰撞]
            If rect.X <= 0 Then collRep.Add(1) : Exit Sub '[與左邊碰撞]
            If rect.X + rect.Width >= obj_dst.width Then collRep.Add(2) : Exit Sub '[與右邊碰撞]

            collRep.Add(0)

        End Sub

        Private Sub local_renew_resetpic()

            'PictureBox1
            With PictureBox1
                local_change_pic()

                pos.ini_x = user_ini_x : pos.ini_y = user_ini_y : pos.ini_v = user_ini_v

                pos.x = pos.ini_x : pos.y = pos.ini_y

                Me.Refresh()
            End With

        End Sub

        Private Sub local_renew_pospic()

            'Recalibrate positions [重新調整座標]
            local_clb_pos(1)

            'Renew position of picture [將觸發 Form1_Paint]
            Me.Refresh()

        End Sub

        Private Sub local_after_colli(ByRef mode As Integer)

            passedTime = 0

            With pos
                'Reset position & velocity [將目前的 x,y 載入到 x0,y0 等於是下次的拋物線從碰撞的地方開始]
                .ini_x = .x : .ini_y = .y
                .ini_v = Math.Sqrt(.vx ^ 2 + .vy ^ 2)

                'Reverse angle [轉換角度]
                .ang = math_revang(Fix((mode - 1) / 2), .ang)

                'Reset initial velocity (vx & vy) [利用轉換而來的角度來取得 vx0,vy0]
                .ini_vx = .ini_v * Math.Cos(.ang) : .ini_vy = .ini_v * Math.Sin(.ang)

                'Force reversing direction of velocity [有時邊緣的碰撞會造成連續碰撞,為了修正,而強制偵測並強制轉換 vx0,vy0]
                Select Case mode
                    Case 1
                        If .ini_vx < 0 Then .ini_vx = -.ini_vx
                    Case 2
                        If .ini_vx > 0 Then .ini_vx = -.ini_vx
                    Case 3
                        If .ini_vy > 0 Then .ini_vy = -.ini_vy
                    Case 4
                        If .ini_vy < 0 Then .ini_vy = -.ini_vy
                End Select

            End With

        End Sub



        Private Function math_degtorad(ByRef deg As Single) As Single
            Return deg * Math.PI / 360 '[Rad = Deg * pi / 360]
        End Function

        Private Function math_revang(ByRef mode As Integer, ByRef ang As Single) As Single

            'mode=0 -> By Y Axis [Y軸反射,例如 30度(DEG) 會轉成 150度(DEG)]
            'mode=1 -> By X Axis [X軸反射,例如 30度(DEG) 會轉成 330度(DEG),不過這裡是 RAD 的轉換]

            If mode = 0 Then
                Return Math.PI - (ang Mod Math.PI) + Fix(ang / Math.PI) * Math.PI
            Else
                Return (Math.PI * 2) - ang
            End If

        End Function

        Public Function collfind(ByRef f As Integer) '[在 collRep 集合中尋找元素]

            Dim l As Long

            collfind = 0
            For l = 1 To collRep.Count
                If collRep(l) = f Then Return 1
            Next

        End Function

    End Class

    2011年11月14日 上午 09:46
  • 把你 PictureBox 框跟 GIF 圖片框做

    Region.Exclude

    傳回來的的等同 GIF 框,就是沒碰到邊,變得比 GIF 框小,就是碰觸到邊界。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月14日 下午 12:33
  • 還是有些看不懂.不知道要怎麼修改.是要加入在Timer1_Tick裡面嗎?請問程式碼要怎麼修改.
    2011年11月14日 下午 03:01
  • 寫程式請先用模擬測試,而最後 Timer_Tick 直接呼叫即可。

    線上手冊的範例,一個用 PictureBox 的框來代,一個用你預期出現位置的框來代

    http://msdn.microsoft.com/zh-tw/library/fbf20bxa.aspx

     

    如果範例程式碼你看不懂的話,那本 3D 快速繪圖演算法 你還是別買了,那本的數學理論都是用矩陣簡記呈現,會更難看懂。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月14日 下午 03:11
  • 研究了好久還是看不太懂.原理是不是重新將PictureBox 的框用顏色區分.再以顏色下去做偵測.做出新的框.最後再用Timer_Tick呼叫

    範例程式碼我也看不懂.這種修改方式對我的能力來說很難.也不知要如何做修改.不知道還有沒有其他的方法可以解決碰撞問題.
    2011年11月15日 上午 08:57
  • 安你好

    MSDN 範例

    http://msdn.microsoft.com/zh-tw/library/fbf20bxa.aspx

    簡單做個

    碰撞範例

    參考專案檔

    https://docs.google.com/open?id=0B9lli7Wsp0g3Y2ZkN2Y3NmItMDlhOS00NWFkLWE5YTItZGM5ZmFmYzRhM2Vj

     

    這是GOOGLE DOC 的連結 ,開啟後請選擇畫面左上角,File -->Download ...

    PS : 這是用 VS2005 並參考 MSDN 範例修改

     

     

    2011年11月15日 上午 11:12
  • 謝謝幫忙我在去研究了
    2011年11月15日 上午 11:21
  • 不是,顏色只是讓你容易辨識。

    線上手冊範例不含註解列才九行程式碼看不懂... 已經不知道該說啥了。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月15日 上午 11:57
  • 看了三個多小時.那九行程式碼只看的懂大約3分之一.也有重新開一個簡單的拋物線程式碼.結果做出來是有碰撞偵測.但是一按下去就偵測到碰撞了.也找不出修改的問題點.有些程式碼也找不到翻譯的注解.難得大大也幫我找了那麼簡單的只有九行程式碼.我卻還是搞不懂..我都不知要怎麼辦了.vb2008我所學的也是很基本.不知大大是不是願意在幫我找比較基本的.還是請大大能不能幫忙我完成這個程式.

    2011年11月15日 下午 02:37
  • 只有九行。

    把你看得懂的地方標記上去,把你看不懂的地方,而你認為是甚麼也標記上去。

    才知道你的死結在哪裡。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月15日 下午 03:19
  • TO : 天之心

    範例程式~直接轉換為 2008 應該是可以直接執行的,

    雖然程式沒有加上,註解

    如心冷大所說,把你不懂的地方PO上來,一起來討論這樣比較快。

     

    2011年11月15日 下午 04:27
  • 不知道這樣判斷到底對不對

     

    Public Sub Exclude_RectF_Example(ByVal e As PaintEventArgs)

            Dim cRect As New RectangleF(PictureBox2.Left - Me.PictureBox1.Left, _

             PictureBox2.Top - Me.PictureBox1.Top, PictureBox2.Width, PictureBox2.Height)

            ' PictureBox1跟PictureBox2的邊緣碰撞

     

     

            ''用紅色筆刷繪製未碰觸的區域

            Dim myRegion1 As New Region(New Rectangle(Me.PictureBox2.Location, Me.PictureBox2.Size))

            '宣告my PictureBox2 長方形4個點

     

            myRegion1.Exclude(complementRect) '宣告(150, 150, 100, 100)

           

    'Dim myBrush As New SolidBrush(Color.Red)  '這邊就不知怎麼修改也看不太懂

            'e.Graphics.FillRegion(myBrush, myRegion1)   '這邊就不知怎麼修改也看不太懂

     

     

            ''用藍色填充碰觸的區域。

            Dim myRegion As New Region(New Rectangle(Me.PictureBox1.Location, Me.PictureBox1.Size))

             '宣告my PictureBox1 長方形4個點

     

    myRegion.Complement(cRect) '宣告PictureBox2跟PictureBox1的4個邊域碰撞 

          

     

    ' Dim myBrush1 As New SolidBrush(Color.Blue)  '這邊就不知怎麼修改也看不太懂

     

            'e.Graphics.FillRegion(myBrush1, myRegion)  '這邊就不知怎麼修改也看不太懂

     

     

            If myRegion.GetBounds(e.Graphics).Left < 100 And myRegion.GetBounds(e.Graphics).Top < 70

            '這邊是回傳值邊的碰撞偵測的範圍

     Then

                PictureBox1.Visible = True

            Else

                PictureBox2.Visible = False

            End If

        End Sub


    • 已編輯 天之心 2011年11月16日 上午 11:32
    2011年11月16日 上午 11:31
  • 一個 PictureBox ,一個 Label ,兩個 button ,一個命名為 buttonBall

    Public Class Form1
    	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    		Dim g As Graphics = PictureBox1.CreateGraphics
    		PictureBox1.Size = New Size(400, 400)
    		buttonBall.Size = New Size(50, 50)
    		buttonBall.Location = New Point(500 * Rnd() - 50, 500 * Rnd() - 50)
    		Dim BallRect As New RectangleF(buttonBall.Location, buttonBall.Size)
    
    		PictureBox1.Region = New System.Drawing.Region(PictureBox1.ClientRectangle)
    		PictureBox1.Region.Intersect(BallRect)
    
    		If PictureBox1.Region.GetBounds(g) <> BallRect Then Label1.Text = "碰撞" Else Label1.Text = "未碰撞"
    
    		g.Dispose()
    	End Sub
    End Class
    
    


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月16日 下午 12:49
  • 我記錯方法了,應該看的是 Region.Intersect ...

    上面是範例程式碼,用亂數讓 buttonBall 換位置,然後偵測是否碰撞到邊界。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月16日 下午 12:50
  • 看的懂的我有標示.也做一些修改.但是在執行碰撞時.碰撞都ㄧ值偵測到.圖的大小我都設(50, 50)卻變成大範圍的偵測到

    二個 PictureBox ,ㄧ個 Label ,一個 button 

    Public Class Form1
        Dim g As Integer
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim g As Graphics = PictureBox1.CreateGraphics
            PictureBox1.Size = New Size(50, 50) '圖的大小
            PictureBox2.Size = New Size(50, 50) '圖的大小
            PictureBox2.Location = New Point(500 * Rnd() - 50, 500 * Rnd() - 50) 'PictureBox2取亂數移位置範圍
            Dim BallRect As New RectangleF(PictureBox2.Location, PictureBox2.Size) '(PictureBox2,地點,座標)

            PictureBox1.Region = New System.Drawing.Region(PictureBox1.ClientRectangle) ' PictureBox1=新的 PictureBox1的數值
            PictureBox1.Region.Intersect(BallRect) 'PictureBox1字串(回傳值)

            If PictureBox1.Region.GetBounds(g) <> BallRect Then Label1.Text = "碰撞" Else Label1.Text = "未碰撞"
            'PictureBox1(g)=傳回g值.偵測有沒有碰撞
            g.Dispose()
        End Sub

    End Class



    • 已編輯 天之心 2011年11月16日 下午 02:17
    2011年11月16日 下午 02:13
  • 你原先的問題是 球  (buttonBall) 在 框 (PictureBox1) 裡面碰撞,你回的兩個 PictureBox 都是 50,50 ,是改成兩顆球在碰撞嗎?
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月16日 下午 02:38
  • 我有用這個程式做試驗  一個 PictureBox ,一個 Label ,兩個 button ,一個命名為 buttonBall   碰撞也是有問題

    改成這個方式  二個 PictureBox ,ㄧ個 Label ,一個 button  問題也是一樣

     

    2011年11月16日 下午 02:44
  • 我有再試一個新程式   二個 PictureBox  二個Button  一個Timer1

    也是有做xy軸移動.是以PictureBox1做偵測.以斜線做移動也是有碰撞偵測

    我想這原理因該跟拋物線是一樣的.帶入原先的程式拋物線最後是以哪個做偵測.然而程式是以選圖片角度去呼叫拋物線做執行.

    我在想若是用4個邊做碰撞偵測.是不是需要最新的數值.我也有看到一個新的方式.是以中心點做偵測.還在研究中.

     

    Public Class Form1


        Dim x1 As Integer = 100, y1 As Integer = 100

        Dim x2 As Short = 5, y2 As Short = 7  '每次移動的數值,這裡可調整角度



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



            Dim x As New System.Drawing.Point(x1, y1)

            PictureBox1.Location = x

            x1 += x2 : y1 += y2



            If x1 <= 0 Then

                x2 = -x2

            ElseIf y1 <= 0 Then

                y2 = -y2

            ElseIf x1 >= 300 Then '300是可移動的空間(可調)

                x2 = -x2

            ElseIf y1 >= 300 Then

                y2 = -y2

            End If
            If (PictureBox1.Left <= PictureBox2.Left + PictureBox2.Width) And (PictureBox1.Left >= PictureBox2.Left - PictureBox1.Width) And (PictureBox1.Top <= PictureBox2.Top + PictureBox2.Height) And (PictureBox1.Top >= PictureBox2.Top - PictureBox1.Height) Then
                PictureBox1.Visible = True
                PictureBox2.Visible = False

            End If
        End Sub



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

            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

    End Class

    2011年11月16日 下午 02:57
  • 你兩個大小都 50,50 ,除非只有瞬間恰巧重疊,否則當然是永遠碰撞。

    哪有碰撞框跟球一樣大的道理...

    一般球外型不變的情況下,只要算左上角位置即可。

    當球心座標出來,

    球.Location = New Point(球心x - 球半徑, 球心y - 球半徑)


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月16日 下午 03:07
  • 安你好

    或是參考以下

    直接利用 矩形 結構   Rectangle 判斷碰撞(就是判斷是否產生交集)

     

           Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
            '建立碰撞體(PictureBox)的 Rectangle 結構
            Dim boundsRect As Rectangle = New Rectangle(Me.PictureBox1.Location, Me.PictureBox1.Size)
            '建立被碰撞體(PictureBox2)的 Rectangle 結構
            Dim PicRectangle As Rectangle = New Rectangle(Me.PictureBox2.Location, Me.PictureBox2.Size)
            '利用 IntersectsWith 判斷碰撞
            MsgBox(boundsRect.IntersectsWith(PicRectangle))
        End Sub
    


    圓形或不規則形狀要再研究。

    參考 

    Rectangle.IntersectsWith 方法

    http://msdn.microsoft.com/zh-tw/library/system.drawing.rectangle.intersectswith(v=vs.80).aspx

    PS : 我是來這學習討論的,畢竟以前未做過類似的功能需求

    2011年11月16日 下午 03:56
  • 安你好

    另外研究 Region 判斷碰撞

    參考以下 

    Region.Intersect 方法 (Rectangle)

    http://msdn.microsoft.com/zh-tw/library/7wysx694(v=VS.80).aspx

     

          Try
             '建立被碰撞體(PictureBox2)的 Rectangle 結構
             Dim PicRectangle As Rectangle = New Rectangle(Me.PictureBox2.Location, Me.PictureBox2.Size)
             '建立碰撞體(PictureBox1)的 Region 
             Dim myRegion As New Region(New Rectangle(Me.PictureBox1.Location, Me.PictureBox1.Size))
             myRegion.Intersect(PicRectangle)
             '取得碰撞區域的 RectangleF,做為判斷是否產生碰撞
             Dim boundsRect As RectangleF = myRegion.GetBounds(e.Graphics)
             Debug.Print(boundsRect.ToString())
             If boundsRect.Width > 0 Then
                 Timer1.Stop()
                 Timer1.Enabled = False
                 MsgBox("碰撞")
             End If
          Catch ex As Exception
              MsgBox(ex.ToString())
          End Try
    


    2011年11月16日 下午 04:11
  •   程式我有修改過.碰撞偵測都正常.我帶入主程式之後一樣有問題.不知道是哪邊出問題

      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim g As Graphics = PictureBox1.CreateGraphics
            PictureBox1.Size = New Size(500, 500)
            buttonBall.Size = New Size(50, 50)
            'buttonBall.Location = New Point(Center_x - Radius, Center_y - Radius)
            'buttonball.Location = New Point(球心x - 球半徑, 球心y - 球半徑)
            buttonBall.Location = New Point(500 * Rnd() - 50, 500 * Rnd() - 50)
            Dim BallRect As New RectangleF(buttonBall.Location, buttonBall.Size)

            PictureBox1.Region = New System.Drawing.Region(PictureBox1.ClientRectangle)
            PictureBox1.Region.Intersect(BallRect)

            'If PictureBox1.Region.GetBounds(g) <> BallRect Then PictureBox1.Visible = False Else buttonBall.Visible = True
            If PictureBox1.Region.GetBounds(g) <> BallRect Then Label1.Text = "碰撞" Else Label1.Text = "未碰撞"
            'If (PictureBox1.Left <= buttonBall.Left + buttonBall.Width) And (PictureBox1.Left >= buttonBall.Left - PictureBox1.Width) And (PictureBox1.Top <= buttonBall.Top + buttonBall.Height) And (PictureBox1.Top >= buttonBall.Top - PictureBox1.Height) Then


            g.Dispose()
        End Sub

     

     

    我把這段程式帶進去主程式結果還是不行

        Private Sub local_kc_dir(ByRef kc As Integer)

            Dim flagchange As Boolean = False

            'Determine the key
            Select Case kc
                Case Keys.Up
                    If stat_moving = 0 And (stat_ang < max_ang) Then stat_ang += 1 : flagchange = True
                    PictureBox1.Top = PictureBox1.Top - 1
                    Balloon.Top = Balloon.Top - 1
                Case Keys.Down
                    If stat_moving = 0 And (stat_ang > 0) Then stat_ang -= 1 : flagchange = True
                    PictureBox1.Left = PictureBox1.Left + 1
                    Balloon.Left = Balloon.Left + 1
                Case Keys.Space     'Start moving object when SPACE has been pressed, stop moving when pressing again
                    local_start_moving()


                    Dim g As Graphics = Balloon.CreateGraphics
                    Balloon.Size = New Size(400, 400)
                    PictureBox1.Size = New Size(50, 50)
                    'Balloon.Location = New Point(m_x - a_X, m_y - a_Y)
                    'buttonball.Location = New Point(球心x - 球半徑, 球心y - 球半徑)
                    'PictureBox1.Location = New Point(500 * Rnd() - 50, 500 * Rnd() - 50)
                    Dim BallRect As New RectangleF(PictureBox1.Location, PictureBox1.Size)

                    Balloon.Region = New System.Drawing.Region(Balloon.ClientRectangle)
                    Balloon.Region.Intersect(BallRect)

                    If Balloon.Region.GetBounds(g) <> BallRect Then Balloon.Visible = False Else PictureBox1.Visible = True
                    'If PictureBox1.Region.GetBounds(g) <> BallRect Then Label1.Text = "碰撞" Else Label1.Text = "未碰撞"
                    'If (PictureBox1.Left <= buttonBall.Left + buttonBall.Width) And (PictureBox1.Left >= buttonBall.Left - PictureBox1.Width) And (PictureBox1.Top <= buttonBall.Top + buttonBall.Height) And (PictureBox1.Top >= buttonBall.Top - PictureBox1.Height) Then

                    g.Dispose()





            End Select

            'Change image of PictureBox1
            If flagchange Then local_change_pic()

        End Sub

    2011年11月17日 下午 01:39
  • 安阿.這2個方法我在去研究看看.謝謝

    Region.Intersect 方法 (Rectangle)

    Rectangle.IntersectsWith

    2011年11月17日 下午 02:33
  • 貼程式碼時,請用工具列上的 插入代碼塊 功能,會幫你標記顏色,不然一堆註解沒拿掉,誰是有用的程式碼都沒辦法看。

                     Balloon.Size = New Size(400, 400)
                     PictureBox1.Size = New Size(50, 50)
                     'Balloon.Location = New Point(m_x - a_X, m_y - a_Y)
                     'buttonball.Location = New Point(球心x - 球半徑, 球心y - 球半徑)
     
    

    請解釋為何你的球比你的彈跳框還大?


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月17日 下午 03:37
  • 請問這樣註解正確ㄇ

     

     

    Public Class Form1


        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim g As Graphics = PictureBox1.CreateGraphics
            PictureBox1.Size = New Size(50, 50)
    'PictureBox1的大小

            buttonBall.Size = New Size(50, 50)
    '球的大小 

            buttonBall.Location = New Point(500 * Rnd() - 50, 500 * Rnd() - 50)'球取亂數移動位置範圍

            Dim BallRect As New RectangleF(buttonBall.Location, buttonBall.Size)'球的亂數.球的框大小

            PictureBox1.Region = New System.Drawing.Region(PictureBox1.ClientRectangle)   

    'PictureBox1.地區=新的系統圖的地區(PictureBox1的長方形)

            PictureBox1.Region.Intersect(BallRect)'PictureBox1讀取Intersect(BallRect)


            If PictureBox1.Region.GetBounds(g) <> BallRect Then Label1.Text = "
    碰撞" Else Label1.Text = "未碰撞"
          

      'PictureBox1傳回(g)



            g.Dispose()
        End Sub
    End Class



    • 已編輯 天之心 2011年11月18日 上午 10:33
    2011年11月18日 上午 10:30
  • 請問在程式碼裡要修改哪個物件才能達到下列的判斷式

    請問要怎麼把目標物修改大小為(100, 100),然後球的大小(50, 50)在目標物的範圍內是有碰撞.超出範圍是沒有碰撞.當帶入程式中目標物的大小範圍以外都是有碰撞的.

    Public Class Form1

     

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

            Dim g As Graphics = PictureBox1.CreateGraphics

            PictureBox1.Size = New Size(500, 500) '這個是目標物.大小(500,500)

            Balloon.Size = New Size(50, 50) '球的大小(50, 50)在目標物大小(500,500)範圍內是沒有碰撞.超出範圍才有碰撞.

            '請問要怎麼把目標物修改大小為(100, 100),然後球的大小(50, 50)在目標物的範圍內是有碰撞.超出範圍是沒有碰撞.

     

            Balloon.Location = New Point(500 * Rnd() - 50, 500 * Rnd() - 50)

            Dim BallRect As New RectangleF(Balloon.Location, Balloon.Size)

     

            PictureBox1.Region = New System.Drawing.Region(PictureBox1.ClientRectangle)

            PictureBox1.Region.Intersect(BallRect)

     

     

            If PictureBox1.Region.GetBounds(g) <> BallRect Then Label1.Text = "碰撞" Else Label1.Text = "未碰撞"

            g.Dispose()


    • 已編輯 天之心 2011年11月18日 下午 12:07
    2011年11月18日 下午 12:05
  • 你自己都註解了,當然改為 100, 100

    PictureBox1.Size = New Size(100, 100) '這個是目標物.大小(100,100)
    

    這裡要注意,你碰撞框尺寸縮小了,你如果不把亂數範圍縮小,碰撞的機率會大很多:

    Balloon.Location = New Point(140 * Rnd() - 20 + PictureBox1.Left, 140 * Rnd() - 20 + PictureBox1.Top)
    

     

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月18日 下午 12:37
  • 我有是這放入程式.要放在kc_dir還是Timer1_Tick好.我放在2張圖片.圖片001.在PicturBox1的範圍內是"未碰撞".我要如何修改才能變成"碰撞"

     


     

     

     


    2011年11月18日 下午 02:39
  • 另一張圖002在PicturBox1的範圍外是"碰撞".我要如何修改才能變成"未碰撞".我的表單大小在(700,700).PicturBox1是(100,100)超過範圍外的就會變成圖002一樣都是碰撞.請問這要如何宣告

    2011年11月18日 下午 02:41
  • 安你好

    你的程式,是否誤解了,Region.Intersect 的使用

    Region.Intersect 是將 Region 所指定的範圍 更新為 互相交集就是碰撞的區域

    PictureBox1.Region.Intersect(BallRect)

    If PictureBox1.Region.GetBounds(g) <> BallRect Then Label1.Text = "碰撞" Else Label1.Text = "未碰撞"

     

    故判斷碰撞應該是取的碰撞區域是否有值才對

    請參考以下

    請將你的 If PictureBox1.Region.GetBounds(g) <> BallRect Then Label1.Text = "碰撞" Else Label1.Text = "未碰撞"

    改為以下注意紅色部分

      '取得碰撞區域的 RectangleF,做為判斷是否產生碰撞
             Dim boundsRect As RectangleF = PictureBox1.Region.GetBounds(g)
             '請看一下碰撞和未碰撞時 PictureBox1.Region 的 Rectangle結構
    MsgBox(boundsRect.ToString()) If boundsRect.Width > 0 Then Label1.Text = "碰撞"
              Else 
                   Label1.Text = "未碰撞"
             End If

    2011年11月18日 下午 03:32
  • 你的 PictureBox 到底是碰撞框還是球?

    Ball 在 碰撞框 內 ,當然是未碰撞

    Ball 超出 碰撞框 外,當然是已碰撞

     

    當偵測到 Ball 碰到碰撞框了,就應該進入反彈動作,這邊沒做反彈動作,只偵測是否碰撞。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月18日 下午 03:53
  • 請問 PictureBox1.Size = New Size(100, 100) '這個是目標物.大小(100,100) 

    我把圖用自動產生.可是碰撞偵測還是把目標物設定在(100,100). 我把這個程式碼刪除:PictureBox1.Size = New Size

    也是一樣的結果.要怎麼宣告PictureBox1圖大小(50,50).PictureBox1的座標在(150,200).球要在這個座標才會有碰撞.

    或是怎麼宣告圖片的座標在指定位置碰撞大小

     程式中的PictureBox1.Size = New Size(100, 100).這個座標是在Form1(100, 100)的範圍中碰撞偵測

     

     

     

     

     

     



    • 已編輯 天之心 2011年11月20日 上午 02:49
    2011年11月20日 上午 02:19
  • 你的 PictureBox 到底是碰撞框還是球?

    已經問過好幾次了,你這句一直沒明確說清楚。

    Ball 是球,那麼反過來說,PictureBox1 就應該是框。

    你的框要宣告 50x50 ,球卻要宣告為 100x100 ,你有沒有講反阿?哪有框比球還小...

    就算框是宣告為 100x100 也不對,100x100 的框剛好把球包緊緊的,從頭到尾都算碰撞。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月20日 上午 04:44
  • 我知道問題點在哪了.我把她畫出來我是要以PictureBox1是背景圖也就是框.ball是球.PictureBox2當成目標物.然後球在框裡面做拋物線動作.對目標物做碰撞偵測.也就是要做碰撞偵測的是目標物大小的框.而不是背景圖的框

    • 已編輯 天之心 2011年11月20日 下午 12:54
    2011年11月20日 上午 05:28
  • 那交集要分兩次。

    對 PictureBox1 的框要等於球。

    對 PictureBox2 的目標要等於 0 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月20日 下午 03:29
  • 第一項是PictureBox1.Size = Balloon.Size

    第二項是PictureBox2.Size = 0

    這樣改對ㄇ.

    圖1的地方我想改做固定點碰撞偵測.可是宣告目標物大小時.圖跟碰撞偵測位置不相同.

    我想到一個問題.下面那行程式.我的主程式是用xy做拋物線.再做拋物線動作時.xy的數值會跟這改變.那程式所做的碰撞偵測.會感應到碰撞ㄇ.

    我有po程式碼在上面日期2011年11月16日 下午 02:57

    Balloon.Location = New Point(500 * Rnd() - 50, 500 * Rnd() - 50)

     

    Public Class Form1

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

     

            Dim g As Graphics = PictureBox2.CreateGraphics

            PictureBox2.Size = New Size(0, 0) '這個是目標物.大小(500,500)

            PictureBox2.Size = New Size(400, 400)

            Balloon.Size = New Size(50, 50) '球的大小(50, 50)在目標物大小(500,500)範圍內是沒有碰撞.超出範圍才有碰撞.

     

            '請問要怎麼把目標物修改大小為(100, 100),然後球的大小(50, 50)在目標物的範圍內是有碰撞.超出範圍是沒有碰撞.

            Balloon.Location = New Point(500 * Rnd() - 50, 500 * Rnd() - 50)

            Dim BallRect As New RectangleF(Balloon.Location, Balloon.Size)

            PictureBox2.Region = New System.Drawing.Region(PictureBox2.ClientRectangle)

            PictureBox2.Region.Intersect(BallRect)

            Dim boundsRect As RectangleF = PictureBox2.Region.GetBounds(g)

            '請看一下碰撞和未碰撞時 PictureBox1.Region Rectangle結構 

            'MsgBox(boundsRect.ToString())

            If boundsRect.Width > 0 Then

                Label1.Text = "碰撞"

            Else

                Label1.Text = "未碰撞"

            End If

            g.Dispose()

        End Sub

    End Class


    2011年11月21日 下午 01:40
  • 先把你程式碼及註解清一清,不要前後矛盾吧。

    前後矛盾也不知道哪句是對的,怎麼討論下去?


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月21日 下午 02:03
  • TO 天之心

    在PO一個 練習的專案

    https://docs.google.com/open?id=0B9lli7Wsp0g3ZTM0YWIxYmUtOGRmNy00MDk2LWEyZDEtYzRkZmZiNWZhYjI2

    PictureBox1 是背景框 Size(500,500)

    PictureBox2 是目標物 Size(100,100)

    Balloon 是球 Size(50,50)

    Button1 啟動 Timer1 偵測

    Button2 停止 Timer1 偵測

    Label1 顯示碰撞訊息,會分別顯示碰到目標物(PictureBox2)或是背景框(PictureBox1)的邊界

    鍵盤 W S A D ,控制  Balloon (球) 上下左右

    請參考以上

    另你回覆的註解

    '球的大小(50, 50)在目標物大小(500,500)範圍內是沒有碰撞.超出範圍才有碰撞.

     

            '請問要怎麼把目標物修改大小為(100, 100),然後球的大小(50, 50)在目標物的範圍內是有碰撞.超出範圍是沒有碰撞.

    一下說目標物大小(500,500)範圍內是沒有碰撞.超出範圍才有碰撞.

    又說目標物修改大小為(100, 100) 目標物的範圍內是有碰撞.超出範圍是沒有碰撞.

    這不是矛盾嗎?

    2011年11月22日 上午 03:51
  • 我有重新再整理過.應該是這樣說明.球的大小跟目標物大小都(50,50)的話,主要是[球的大小]碰到[目標物大小]的範圍內.就偵測到碰撞.然後球的移動範圍只要沒有碰到目標物就不會偵測到碰撞.只有球跟目標物有碰撞偵測的發生.練習專案我在去研究看看.謝謝了

     


    • 已編輯 天之心 2011年11月24日 下午 01:23
    2011年11月24日 下午 01:22