嗯,既然我們有控制器的類別了,是不是該找個範例來好好利用利用?
Qt的範例中是有幾個遊戲,我拿了俄羅斯方塊來試一試。
該範例位置:%QTDIR%\example\widgets\tetrix
線上版本本人修改版本(含已編譯程式)
控制器配置:
Start |
開始遊戲 |
Select |
暫停 |
左/右(方向鍵或左類比) |
方塊左移/右移 |
A/叉 |
方塊加快掉落(下移一行) |
B/圈 |
方塊落至底部 |
LB/L1 |
方塊左轉 |
RB/R1 |
方塊右轉 |
因為沒有特別調整,類比搖桿可能會太過敏感鍵盤/滑鼠配置:
點擊Start |
開始遊戲 |
點擊Pause |
暫停 |
左/右 |
方塊左移/右移 |
D |
方塊加快掉落(下移一行) |
空白鍵 |
方塊落至底部 |
上 |
方塊左轉 |
下 |
方塊右轉 |
這一版本採用Qt的事件系統驅動,然後發現在實做上還要再多加些東西。
如果你有觀察結構會發現,我們要控制的物件有兩個:遊戲視窗、方塊的臺面(方塊會出現的中央區域)
在網路上找了一找,發現到,預設的各種事件在子物件不處理的情形下會自動傳遞給親物件。
但是,我們的自訂事件就不是如此了。
這表示我們要自己處理傳遞這件事情。
好在這程式的結構簡單,我們可以使用event filter處理。
具體如下:
class B : QWidget
{
......
public:
bool eventFilter(QObject*, QEvent*);
......
};
A::A()
: QWidget()
{
......
B *p_b = new B(this);
installEventFilter(p_b);
}這樣一來,在事件傳給A之前會被送到B的eventFilter函式中處理。
首先 QObject 代表者原本要接收事件的物件,而 QEvent 正是該事件。
接下來要怎麼做就很清楚了:把我們想處理的事件處理掉(return true),把其它事件扔出去(return false)。
只是弄到這邊我不免擔心,要是以後有三層結構怎麼辦?