Friday, January 28, 2022

[用Golang寫小遊戲教學] 第九章 超簡化的碰撞檢測遊戲

[前言]



這是一個簡單的碰撞檢測遊戲,遊戲功能如下:
1、空格鍵發射紅色塊,紅色塊遇到左、右、上邊界反彈,遇到下邊界遊戲結束。
2、左右鍵移動白色塊接紅色塊,每接到一次加一分。
3、每5秒鐘隨機生成一個黃色塊,紅色塊觸碰到黃色塊時,黃色塊消失並加十分,黃色塊同時最多存在5個

但,這對於初學者來說還是太難理解其運作方式,我把這個小遊戲再精簡成超簡化的碰撞檢測遊戲,遊戲功能如下:
1、空格鍵發射紅色塊,紅色塊遇到左、右、上與下邊界反彈,遊戲不會自動結束。
2、左上角會顯示紅色塊目前的座標
3、在遊戲中按下空格鍵可以暫停,再按一次繼續。

[超簡化的碰撞檢測遊戲]

這邊會需要將Golang執行環境先準備好,請參考:

請利用git command 將超簡化的碰撞檢測遊戲複製下來

git clone https://github.com/teyenliu/simpleebitens.git

 需要先下載 ebiten package

go get github.com/hajimehoshi/ebiten/v2

執行遊戲 (下列例子是執行在Windows )

cd simpleebitens\collisiontest
go run main.go

 


其中最關鍵的函式用來碰撞檢測的說明如下:

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: