切換遊戲畫面
嗯,如果說要作遊戲的話,果然還是要一個方便的場景切換方式。
最一般的就是從主選單跑到遊戲序幕這樣。
過去我曾把機甲指揮官2(Mech Commander 2,不過台譯…)的源始碼大卸八塊。
發現當年他們似乎是預先載入戰鬥外各個場景的記憶體,所以看來其它場景的消耗量應該是不大的。
這對我來說也是差不多的,所以我們就模仿一下吧。
class Window : public QMainWindow
{
Q_OBJECT
public:
Window(QWidget parent = 0);
~Window();
private slots:
void when_widgetChange_required(int id);
private:
QList<QWidget*> m_widgetList;//你當然要把Widget先填進去,我們先假設有。
}
void Window::when_widgetChange_required(int id)
{
auto w = m_widgetList.value(id);//很確定的話可以用at(id)
if(w) setCentralWidget(w);
}
嗯,看起來很棒,不過實際上用起來…
當你換Widget的時候,前一個會被delete。
好吧,我們換一下設計,也就是自己來。
class Window : public QMainWindow
{
//......
protected:
void resizeEvent(QSizeEvent *);
void connectWidget(QWidget *);
void disconnectWidget();
//......
private:
QWidget *up_currentWidget;
QList<QWidget*> m_widgetList;
}
Window::~Window()
{
foreach(QWidget *w, m_menuList) {
delete w;
}
}
void Window::resizeEvent(QResizeEvent *)
{
if(up_currentWidget) {
up_currentWidget->resize(size());
}
}
void Window::connectWidget(QWidget *w)
{
up_currentWidget = w;
up_currentWidget->setParent(this);
up_currentWidget->move(0, 0);
up_currentWidget->resize(size());
up_currentWidget->show();
}
void Window::disconnectWidget()
{
if(up_currentWidget) {
up_currentWidget->setParent(nullptr);
up_currentWidget = nullptr;
}
}
void Window::when_widgetChange_required(int id)
{
disconnectWidget();
connectWidget(m_widgetList.at(id));
}
可能最容易忘的是show(),剛剛試了很多下都沒顯示,害我以為程式掛了…