[前言]
我們在 [用Golang寫小遊戲教學] 第三章 初探Ebiten (A dead simple 2D game library for Go) 這章的內容有提到一個連結:
這是一個簡單的碰撞檢測遊戲,遊戲功能如下:
1、空格鍵發射紅色塊,紅色塊遇到左、右、上邊界反彈,遇到下邊界遊戲結束。
2、左右鍵移動白色塊接紅色塊,每接到一次加一分。
3、每5秒鐘隨機生成一個黃色塊,紅色塊觸碰到黃色塊時,黃色塊消失並加十分,黃色塊同時最多存在5個
但,這對於初學者來說還是太難理解其運作方式,我把這個小遊戲再精簡成超簡化的碰撞檢測遊戲,遊戲功能如下:
1、空格鍵發射紅色塊,紅色塊遇到左、右、上與下邊界反彈,遊戲不會自動結束。
2、左上角會顯示紅色塊目前的座標
3、在遊戲中按下空格鍵可以暫停,再按一次繼續。
[超簡化的碰撞檢測遊戲]
請利用git command 將超簡化的碰撞檢測遊戲複製下來
git clone https://github.com/teyenliu/simpleebitens.git
需要先下載 ebiten package
go get github.com/hajimehoshi/ebiten/v2
執行遊戲 (下列例子是執行在Windows )
其中最關鍵的函式用來碰撞檢測的說明如下:
func (s *Square) CollisionDetection(w, h float64) {
//假設移動步伐後的座標
x, y := s.x+s.stepX, s.y+s.stepY
//移動步伐
tx, ty := s.stepX, s.stepY
//移動步伐需做碰撞測試,遇到邊界要反彈
if x <= 0 { //碰撞左邊垂直邊 (-stepX,stepY)
tx = -s.x
ty = tx * math.Tan(s.angle)
s.stepX *= -1
} else if x+s.w >= w { //碰撞右邊垂直邊 (-stepX,stepY)
tx = 320 - s.w - s.x
ty = tx * math.Tan(s.angle)
s.stepX *= -1
} else if y <= 0 { //碰撞上方水平邊 (stepX,-stepY)
ty = -s.y
tx = ty / math.Tan(s.angle)
s.stepY *= -1
} else if y+s.h >= h { //碰撞下方水平邊 (stepX,-stepY)
ty = 240 - s.h - s.y
tx = ty / math.Tan(s.angle)
s.stepY *= -1
}
//將真正的移動步伐更新到球內
s.x += tx
s.y += ty
//將球的圖形利用移動步伐來推移
s.Opts.GeoM.Translate(tx, ty)
}
No comments:
Post a Comment