伊莉討論區

標題: 關於打磚塊遊戲 反彈有點問題 [打印本頁]

作者: A2515925    時間: 2012-4-19 09:38 PM     標題: 關於打磚塊遊戲 反彈有點問題

提示: 作者被禁止或刪除 內容自動屏蔽
作者: darkjack    時間: 2012-4-19 10:40 PM

你的主執行檔 沒法執行,而你的程式碼又是取片段,實在無從幫起
作者: A2515925    時間: 2012-4-19 11:03 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: darkjack    時間: 2012-4-20 07:07 AM

本帖最後由 darkjack 於 2012-4-20 07:13 AM 編輯

你的主程式還是一樣 不能執行,會有錯誤,我猜想你應該是用 vb 2010 的 Framework 4 作業?

而你的程式碼我整個複製之後
因為你是用自定名稱的 控件 我自己修改之後會變成這種畫面 = =
[attach]74223174[/attach]

而我滑鼠移動之後 整個介面都會移動
如果按下 button1 (應該是你設定的開始)
則那個框框 會在下方一直重複從左畫到右

如果可以,可否請你放上你的執行圖 ?

因為你的 變數 B 我猜想應該是你要畫 的棒子吧?


而反彈 最簡單的寫法就是用三角函數(反彈角可能會太過固定)
至於重畫之後 ,你說要把東西都回歸
就是你一開始 button1 寫的程式碼,那邊不就是你一開始寫的東西嗎?



作者: A2515925    時間: 2012-4-20 12:46 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: darkjack    時間: 2012-4-20 10:40 PM

本帖最後由 darkjack 於 2012-4-20 10:41 PM 編輯

我剛剛想嘗試 用 FrameWork 4.5Beta 安裝結果不能安裝
用 FrameWork 4 我要安裝,顯示我電腦已經有 FrameWork4 了

我用你丟上來的原始碼 直接copy 過去 VS 2008

是有出現了棒子 但是卻少了 磚塊


  1.   Dim b = New Label
  2.   'Dim l = New Label   '<===全域 就會出現棒子 ,取消 卻只出現磚塊
  3.   Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  4.     Dim L = New Label '<===寫在 裡面卻又會有些錯誤
複製代碼


而你用的專案 2010 我 2008 也不能用

給你一些參考解答
邊界問題 你看看 外介面 跟內介面 是否差距太小

把內介面的 最大超出範圍值設定小一點看看


問題應該是在這段
  1.    Private Function chkHit(ByVal Q As Label) As Boolean
  2.         If Q.Visible = False Then Return False
  3.         If B.Left < Q.Left - B.Width Then Return False
  4.         If B.Left > Q.Left + Q.Width Then Return False
  5.         If B.Top > Q.Top + Q.Height Then Return False
  6.         If B.Top < Q.Top - B.Height Then Return False
  7.         If bx < Q.Left - B.Width And B.Left >= Q.Left - B.Width Then
  8.             dx = -1
  9.         End If
  10.         If bx > Q.Left + Q.Width And B.Left <= Q.Left + Q.Width Then
  11.             dx = 1
  12.         End If
  13.         If by < Q.Top - B.Height And B.Top >= Q.Top - B.Height Then
  14.             dy = -1
  15.         End If
  16.         If by > Q.Top + Q.Height And B.Top <= Q.Top + Q.Height Then
  17.             dy = 1
  18.         End If
  19.         Q.Visible = False
  20.         Return True
  21.     End Function
複製代碼



作者: ahway9988    時間: 2012-4-21 01:02 AM

這個...
  1. L.Left = 347
  2. B.Left = 347
  3. B.Top = 355
  4. dx = 1
  5. dy = 1
複製代碼
加到Button2裡,可以讓球歸原位
問題1似乎不是問題,難道是我會錯您的意思,有請更正

問題2:
在Timer2裡的...
  1. If B.Top + B.Height > L.Top Then
  2.         If B.Left > L.Left And B.Left + B.Width < L.Left + L.Width Then
  3.                 dy = -1
  4.         End If
  5. End If
複製代碼
的這裡裡面,加入您的球與橫桿的關係
假如您想將桿分成3塊,即左中右來判斷球要撞上去位置
將球的方向dx因素(正負號)與桿的位置點做判斷條件
球撞上桿左側,球向dx=-1
球撞上桿右側,球向dx=1
另外比較麻煩的是球撞上中間位置的判斷,因為會改變到vx值(移動量),如果您予許的話,那不管球從哪方向來,撞擊到桿中間位置,就讓它成為0吧(vx=0),這樣球就只會上下動了
此時球是不是處於上下動狀態?在這種狀態下如果再次撞擊到桿子的話仍可套用前項3項條件,只不過還得新增幾個式子
以下是最終整理後:
球撞上桿左側,球向dx=-1,vx=3(vx=3這是您的原設定值)
球撞上桿右側,球向dx=1,vx=3
球撞上桿中間,vx=0
至於桿的左中右就由您自己定義位置大小了
以上希望能幫到忙,有錯請糾正







補充內容 (2012-4-21 01:15 AM):
簡單說dx是控制方向,vx才是啟動您的球要動不動,球不動(左右動)那就是上下動了
作者: A2515925    時間: 2012-4-21 08:09 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: ahway9988    時間: 2012-4-21 09:26 PM

  1.                 If B.Left + B.Width \ 2 < L.Left + 25 Then
  2.                     dx = -1
  3.                     vx = 3
  4.                 ElseIf B.Left + B.Width \ 2 > L.Left + 35 Then
  5.                     dx = 1
  6.                     vx = 3
  7.                 Else
  8.                     vx = 0
  9.                 End If
複製代碼

加入我說的timer2的If B.Top + B.Height > L.Top Then ~ end if裡

應該就可以了


其中要算上球的厚度,加上球的厚度的一半才是判斷球中心點撞擊在桿子上的關係條件



作者: A2515925    時間: 2012-4-21 09:37 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: ahway9988    時間: 2012-4-21 10:47 PM

本帖最後由 ahway9988 於 2012-4-22 12:56 AM 編輯

非也,您僅需在球碰到桿子時增加或改變vx,vy的數值即可,別忘了vx,vy它不只是球的恆動量,也是開關亦是加(減)速器
比方說您需要在球碰到桿子或球在移動時間裡過了n秒增加(改變)它的速度,建議您設置一個變數varAny(請自定變數)儲存球到碰到桿子次數或球在移動過程經過了幾秒,在碰到桿子的條件區塊裡或是在timer1區塊後設計您要在第幾次之後或是第幾秒之後改變它(vx and vy)的值
當然這裡會造成一個問題,承上個問題:桿子的左中右的條件式裡的vx將不在是恆為值3,而是vx=varAny
不知道這樣說了一大篇您看得懂嗎?


當然這裡會造成一個問題,承上個問題:桿子的左中右的條件式裡的vx將不在是恆為值3,而是vx=varAny
不知道這樣說了一大篇您看得懂嗎?

更正為:
當然這裡會造成一個問題,承上個問題:桿子的左中右的條件式裡的vx將不在是恆為值3,而是vx=varVX
所以仍然需再另設一儲存變數varVX記錄變化(加速)後的vx值
不知道這樣說了一大篇您看得懂嗎?


不好意思,更正錯誤了



作者: A2515925    時間: 2012-4-21 11:35 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: ahway9988    時間: 2012-4-22 09:05 PM

當然可以,這樣是隨機變換球速,看你自己需求
不過如此執行起來好像有點怪怪的XD
作者: A2515925    時間: 2012-4-23 07:30 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: ahway9988    時間: 2012-4-23 11:20 PM

A2515925 發表於 2012-4-23 07:30 AM
是阿,我也覺得怪怪的,順便問一下,如何判斷磚塊被打光呢?

我只想到兩種方法
1是每次撞擊完即判斷每個磚塊是否已經打過了,不知道是不是您設的L.Visable
2是另設一個變數儲存每撞擊過的磚磈數量剩下多少,即每撞一次磚塊(該變數)就少1
我是覺得第2方法比較有效率,第3種方法待高人點出XD





歡迎光臨 伊莉討論區 (http://www67.eyny.com/) Powered by Discuz!