⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tutorial1-13.html

📁 QT参考文档
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-win-commercial-3.0.5/doc/tutorial.doc:2035 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Translator" content="Cavendish">
<meta name="Qt zh_CN Documents Website" content="http://www.qiliang.net/qt">
<title>Qt教程一 —— 第十三章:游戏结束</title>
<style type="text/css"><!--
h3.fn,span.fn { margin-left: 1cm; text-indent: -1cm; }
a:link { color: #004faf; text-decoration: none }
a:visited { color: #672967; text-decoration: none }
body { background: #ffffff; color: black; font-family: "Times New Roman" }
--></style>
</head>
<body>

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr bgcolor="#E5E5E5">
<td valign=center>
 <a href="index.html">
<font color="#004faf">主页</font></a>
 | <a href="classes.html">
<font color="#004faf">所有的类</font></a>
 | <a href="mainclasses.html">
<font color="#004faf">主要的类</font></a>
 | <a href="annotated.html">
<font color="#004faf">注释的类</font></a>
 | <a href="groups.html">
<font color="#004faf">分组的类</font></a>
 | <a href="functions.html">
<font color="#004faf">函数</font></a>
</td>
<td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table>
<h1 align=center>Qt教程一 —— 第十三章:游戏结束</h1>

 
<p> <center><img src="t13.png" alt="Screenshot of tutorial thirteen"></center> 
<p> 在这个例子中我们开始研究一个带有记分的真正可玩的游戏。我们给MyWidget一个新的名字(GameBoard)并添加一些槽。
<p> 我们把定义放在gamebrd.h并把实现放在gamebrd.cpp。
<p> CannonField现在有了一个游戏结束状态。
<p> 在LCDRange中的布局问题已经修好了。
<p> <ul>
<li> <a href="t13-lcdrange-h.html">t13/lcdrange.h</a>包含LCDRange类定义。
<li> <a href="t13-lcdrange-cpp.html">t13/lcdrange.cpp</a>包含LCDRange类实现。
<li> <a href="t13-cannon-h.html">t13/cannon.h</a>包含CannonField类定义。
<li> <a href="t13-cannon-cpp.html">t13/cannon.cpp</a>包含CannonField类实现。
<li> <a href="t13-gamebrd-h.html">t13/gamebrd.h</a>包含GameBoard类定义。
<li> <a href="t13-gamebrd-cpp.html">t13/gamebrd.cpp</a>包含GameBoard类实现。
<li> <a href="t13-main-cpp.html">t13/main.cpp</a>包含MyWidget和main。
</ul>
<p> <h2> 一行一行地解说
</h2>
<a name="1"></a><p> <h3> <a href="t13-lcdrange-h.html">t13/lcdrange.h</a>
</h3>
<a name="1-1"></a><p> 

<p> <pre>    #include &lt;<a href="qwidget-h.html">qwidget.h</a>&gt;

    class QSlider;
    class QLabel;

    class LCDRange : public <a href="qwidget.html">QWidget</a>
</pre>
<p> 我们继承了<a href="qwidget.html">QWidget</a>而不是<a href="qvbox.html">QVBox</a>。QVBox是非常容易使用的,但是它也显示了它的局域性,所以我们选择使用更加强大和稍微有一些难的<a href="qvboxlayout.html">QVBoxLayout</a>。(和你记忆中的一样,QVBoxLayout不是一个窗口部件,它管理窗口部件。)
<p> <h3> <a href="t13-lcdrange-cpp.html">t13/lcdrange.cpp</a>
</h3>
<a name="1-2"></a><p> 

<p> <pre>    #include &lt;<a href="qlayout-h.html">qlayout.h</a>&gt;
</pre>
<p> 我们现在需要包含qlayout.h来获得其它布局管理API。
<p> <pre>    LCDRange::LCDRange( <a href="qwidget.html">QWidget</a> *parent, const char *name )
            : <a href="qwidget.html">QWidget</a>( parent, name )
</pre>
<p> 我们使用一种平常的方式继承QWidget。
<p> 另外一个构造函数作了同样的改动。init()没有变化,除了我们在最后加了几行:
<p> <pre>        <a href="qvboxlayout.html">QVBoxLayout</a> * l = new <a href="qvboxlayout.html">QVBoxLayout</a>( this );
</pre>
<p> 我们使用所有默认值创建一个QVBoxLayout,管理这个窗口部件的子窗口部件。
<p> <pre>    <a name="x2333"></a>    l-&gt;<a href="qboxlayout.html#addWidget">addWidget</a>( lcd, 1 );
</pre>
<p> At the top we add the <a href="qlcdnumber.html">QLCDNumber</a> with a non-zero stretch.
<p> <pre>        l-&gt;<a href="qboxlayout.html#addWidget">addWidget</a>( slider );
        l-&gt;<a href="qboxlayout.html#addWidget">addWidget</a>( label );
</pre>
<p> 然后我们添加另外两个,它们都使用默认的零伸展因数。
<p> 这个伸展控制是<a href="qvboxlayout.html">QVBoxLayout</a>(和<a href="qhboxlayout.html">QHBoxLayout</a>,和<a href="qgridlayout.html">QGridLayout</a>)所提供的,而像<a href="qvbox.html">QVBox</a>这样的类却不提供。在这种情况下我们让QLCDNumber可以伸展,而其它的不可以。
<p> <h3> <a href="t13-cannon-h.html">t13/cannon.h</a>
</h3>
<a name="1-3"></a><p> CannonField现在有一个游戏结束状态和一些新的函数。
<p> 

<p> <pre>        bool  gameOver() const { return gameEnded; }
</pre>
<p> 如果游戏结束了,这个函数返回TRUE,或者如果游戏还在继续,返回FALSE。
<p> <pre>        void  setGameOver();
        void  restartGame();
</pre>
<p> 这里是两个新槽:setGameOver()和restartGame()。
<p> <pre>        void  canShoot( bool );
</pre>
<p> 这个新的信号表明CannonField使shoot()槽生效的状态。我们将在下面使用它用来使Shoot按钮生效或失效。
<p> <pre>        bool gameEnded;
</pre>
<p> 这个私有变量包含游戏的状态。TRUE说明游戏结束,FALSE说明游戏还将继续。
<p> <h3> <a href="t13-cannon-cpp.html">t13/cannon.cpp</a>
</h3>
<a name="1-4"></a><p> 

<p> <pre>        gameEnded = FALSE;
</pre>
<p> 这一行已经被加入到构造函数中。最开始的时候,游戏没有结束(对于玩家是很幸运的 :-)。
<p> <pre>    void CannonField::shoot()
    {
        if ( isShooting() )
            return;
        timerCount = 0;
        shoot_ang = ang;
        shoot_f = f;
    <a name="x2339"></a>    autoShootTimer-&gt;<a href="qtimer.html#start">start</a>( 50 );
        emit canShoot( FALSE );
    }
</pre>
<p> 我们添加一个新的isShooting()函数,所以shoot()使用它替代直接的测试。同样,shoot告诉世界CannonField现在不可以射击。
<p> <pre>    void CannonField::setGameOver()
    {
        if ( gameEnded )
            return;
        if ( isShooting() )
            autoShootTimer-&gt;<a href="qtimer.html#stop">stop</a>();
        gameEnded = TRUE;
        <a href="qwidget.html#repaint">repaint</a>();
    }
</pre>
<p> 这个槽终止游戏。它必须被CannonField外面的调用,因为这个窗口部件不知道什么时候终止游戏。这是组件编程中一条重要设计原则。我们选择使组件可以尽可能灵活以适应不同的规则(比如,在一个首先射中十次的人胜利的多人游戏版本可能使用不变的CannonField)。
<p> 如果游戏已经被终止,我们立即返回。如果游戏会继续到我们的设计完成,设置游戏结束标志,并且重新绘制整个窗口部件。
<p> <pre>    void CannonField::restartGame()
    {
        if ( isShooting() )
    <a name="x2340"></a>        autoShootTimer-&gt;<a href="qtimer.html#stop">stop</a>();
        gameEnded = FALSE;
        <a href="qwidget.html#repaint">repaint</a>();
        emit canShoot( TRUE );
    }
</pre>
<p> 这个槽开始一个新游戏。如果炮弹还在空中,我们停止设计。然后我们重置<tt>gameEnded</tt>变量并重新绘制窗口部件。
<p> 就像hit()或miss()一样,moveShot()同时也发射新的canShoot(TRUE)信号。
<p> CannonField::paintEvent()的修改:
<p> <pre>    void CannonField::<a href="qwidget.html#paintEvent">paintEvent</a>( <a href="qpaintevent.html">QPaintEvent</a> *e )
    {
    <a name="x2337"></a>    <a href="qrect.html">QRect</a> updateR = e-&gt;<a href="qpaintevent.html#rect">rect</a>();
        <a href="qpainter.html">QPainter</a> p( this );

        if ( gameEnded ) {
            p.<a href="qpainter.html#setPen">setPen</a>( black );
    <a name="x2335"></a>        p.<a href="qpainter.html#setFont">setFont</a>( QFont( "Courier", 48, QFont::Bold ) );
    <a name="x2334"></a>        p.<a href="qpainter.html#drawText">drawText</a>( <a href="qwidget.html#rect">rect</a>(), AlignCenter, "Game Over" );
        }
</pre>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -