本單元要製作一個單機版的打桌球遊戲介面,不好意思,可能與商業化的體感遊戲差很多,只是最簡易的平面反彈的程式,目的是讓同學深入了解遊戲中物體碰撞與反彈的程式機制。本課程是線上遊戲設計,當然下一單元也要將此程式變成線上互動遊戲,TCP網路通訊模式的特性就是穩定且快速,也是商業線上對戰遊戲的基礎技術,如果只是之前的五子棋遊戲棋並無法顯現其快速反應的特性,這個遊戲就是希望讓同學感受到線上對戰的即時性。
←請按右鍵下載此圖
表單介面設計

如上圖淡黃色區塊是一個 Panel容器物件,改名(Name屬性)為"G";內部下方是一個黑色的 Label,命名為"H1"代表玩家自用的球拍;上方綠色板子也是 Label,命名為"H2",代表對手的球拍;中間的球影像也用 Label製作,命名為"Q";下方是一個 Button,命名為"GO"。還有一個 Timer物件,使用預設名稱Timer1即可。
以上更名都是為了簡化程式碼與方便辨識物件。

讓球運動的程式
請在GO按鍵與Timer1事件寫程式如下:

按下啟動鍵時我們先宣告一個X與Y值為(5, -5)的 Point物件給球(Q)的 Tag屬性,其實是作為它的速度向量。也就是球的位置(Left & Top)與速度(Tag)現在都是球自己的屬性,這種設計比宣告公用變數當作球的速度要好,因為比較容易辨識,尤其是遊戲中有多個動態物體時會更方便,也更貼近物理概念。接著就是啟動計時器讓球持續移動,每次移動就是取出速度值(Tag),再依據速度移動一個單位。試試看,執行程式按下啟動鍵球就會往右上方移動了!

碰撞處理程式
請建立如下的自訂副程式 chkHit

這個副程式的使用方式是呼叫時傳入移動的物體為第一個參數,在此範例中就是Q(球)了!第二個參數是可能被移動物體碰撞的物體,本例中可能是容器物體"G";或者擊球板H1或H2。最後一個參數 inside 是聲明物件是內部或外部碰撞?如Q在G內部撞牆壁就是內部碰撞(inside=True);Q與H1或H2的外緣相撞就是外部碰撞(inside=False)。
內部碰撞當然就是檢查有沒有超過容器物體的邊界(牆壁)碰到就必須改變速度方向。
外部碰撞則是先排除動態物件在整個被碰物件外面的狀態,如果不能排除就是碰到了!
如下示意圖,譬如球的右緣小於物件的左緣就是2的情況,如果都不是1234四種狀況那就是確定碰到物體了!

接著幾行程式其實是檢驗碰到上下左右哪一個邊界,再依碰到的方向改變速度的走向。
這個程式相當簡短但是可以正確處理此範例所需的各種碰撞狀況!
接著請在Timer1事件中加入呼叫chkWin的程式如下:

此時開啟程式測試已經可以看到球會完全正確地在牆壁之間彈跳,碰到H1或H2球拍也會正確反彈了!

拖曳球拍的程式
拖曳己方球拍"H1"物件的程式如下:

拍子也可以動了!在此是限制只能在一個高度橫移,所以只控制X軸。同時限制只能在遊戲區內部移動,以免拍子移出這個區域造成抓不回來的狀況。當然對手的球拍必須經由網路指令來移動,我們將在下個單元處理。