亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? qt教程一 —— 第十三章:游戲結束.htm

?? 嵌入式QT開發系列文檔
?? HTM
?? 第 1 頁 / 共 2 頁
字號:
        <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html">QPainter</A> p( this );

        if ( gameEnded ) {
            p.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html#setPen">setPen</A>( black );
    <A name=x2335></A>        p.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html#setFont">setFont</A>( QFont( "Courier", 48, QFont::Bold ) );
    <A name=x2334></A>        p.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html#drawText">drawText</A>( <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html#rect">rect</A>(), AlignCenter, "Game Over" );
        }
</PRE>
<P>繪畫事件已經通過如果游戲結束,比如<TT>gameEnded</TT>是TRUE,就顯示文本“Game 
Over”而被增強了。我們在這里不怕麻煩來檢查更新矩形,是因為在游戲結束的時候速度不是關鍵性的。 
<P>為了畫文本,我們先設置了黑色的畫筆,當畫文本的時候,畫筆顏色會被用到。接下來我們選擇Courier字體中的48號加粗字體。最后我們在窗口部件的矩形中央繪制文本。不幸的是,在一些系統中(特別是使用Unicode的X服務器)它會用一小段時間來載入如此大的字體。因為Qt緩存字體,我們只有第一次使用這個字體的時候才會注意到這一點。 

<P><PRE>    <A name=x2338></A>    if ( updateR.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qrect.html#intersects">intersects</A>( cannonRect() ) )
            paintCannon( &amp;p );
        if ( isShooting() &amp;&amp; updateR.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qrect.html#intersects">intersects</A>( shotRect() ) )
            paintShot( &amp;p );
        if ( !gameEnded &amp;&amp; updateR.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qrect.html#intersects">intersects</A>( targetRect() ) )
            paintTarget( &amp;p );
    }
</PRE>
<P>我們只有在設計的時候畫炮彈,在玩游戲的時候畫目標(這也就是說,當游戲沒有結束的時候)。 
<P>
<H3><A 
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t13-gamebrd-h.html">t13/gamebrd.h</A> 
</H3><A name=1-5></A>
<P>這個文件是新的。它包含最后被用來作為MyWidget的GameBoard類的定義。 
<P>
<P><PRE>    class QPushButton;
    class LCDRange;
    class QLCDNumber;
    class CannonField;

    #include "lcdrange.h"
    #include "cannon.h"

    class GameBoard : public <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html">QWidget</A>
    {
        <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/metaobjects.html#Q_OBJECT">Q_OBJECT</A>
    public:
        GameBoard( <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html">QWidget</A> *parent=0, const char *name=0 );

    protected slots:
        void  fire();
        void  hit();
        void  missed();
        void  newGame();

    private:
        <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html">QLCDNumber</A>  *hits;
        <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html">QLCDNumber</A>  *shotsLeft;
        CannonField *cannonField;
    };
</PRE>
<P>我們現在已經添加了四個槽。這些槽都是被保護的,只在內部使用。我們也已經加入了兩個QLCDNumbers(<TT>hits</TT>和<TT>shotsLeft</TT>)用來顯示游戲的狀態。 

<P>
<H3><A 
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t13-gamebrd-cpp.html">t13/gamebrd.cpp</A> 
</H3><A name=1-6></A>
<P>這個文件是新的。它包含最后被用來作為MyWidget的GameBoard類的實現, 
<P>
<P>我們已經在GameBoard的構造函數中做了一些修改。 
<P><PRE>        cannonField = new CannonField( this, "cannonField" );
</PRE>
<P><TT>cannonField</TT>現在是一個成員變量,所以我們在使用它的時候要小心地改變它的構造函數。(Trolltech的<EM>好</EM>程序員從來不會忘記這點,但是我就忘了。告誡程序員-如果“programmor”是拉丁語,至少。無論如何,返回代碼。) 

<P><PRE>        <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qobject.html#connect">connect</A>( cannonField, SIGNAL(hit()),
                 this, SLOT(hit()) );
        <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qobject.html#connect">connect</A>( cannonField, SIGNAL(missed()),
                 this, SLOT(missed()) );
</PRE>
<P>這次當炮彈射中或者射失目標的時候,我們想做些事情。所以我們把CannonField的hit()和missed()信號連接到這個類的兩個被保護的同名槽。 
<P><PRE>        <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qobject.html#connect">connect</A>( shoot, SIGNAL(<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qbutton.html#clicked">clicked</A>()), SLOT(fire()) );
</PRE>
<P>以前我們直接把Shoot按鈕的clicked()信號連接到CannonField的shoot()槽。這次我們想跟蹤射擊的次數,所以我們把它改為連接到這個類里面一個被保護的槽。 

<P>注意當你用獨立的組件工作的時候,改變程序的行為是多么的容易。 
<P><PRE>        <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qobject.html#connect">connect</A>( cannonField, SIGNAL(canShoot(bool)),
    <A name=x2348></A>             shoot, SLOT(<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html#setEnabled">setEnabled</A>(bool)) );
</PRE>
<P>我們也使用cannonField的canShoot()信號來適當地使Shoot按鈕生效和失效。 
<P><PRE>        QPushButton *restart
            = new <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpushbutton.html">QPushButton</A>( "&amp;New Game", this, "newgame" );
        restart-&gt;setFont( QFont( "Times", 18, QFont::Bold ) );

        <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qobject.html#connect">connect</A>( restart, SIGNAL(clicked()), this, SLOT(newGame()) );
</PRE>
<P>我們創建、設置并且連接這個New Game按鈕就像我們對其它按鈕所做的一樣。點擊這個按鈕就會激活這個窗口部件的newGame()槽。 
<P><PRE>        hits = new <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html">QLCDNumber</A>( 2, this, "hits" );
        shotsLeft = new <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html">QLCDNumber</A>( 2, this, "shotsleft" );
        <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlabel.html">QLabel</A> *hitsL = new <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlabel.html">QLabel</A>( "HITS", this, "hitsLabel" );
        QLabel *shotsLeftL
            = new <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlabel.html">QLabel</A>( "SHOTS LEFT", this, "shotsleftLabel" );
</PRE>
<P>我們創建了四個新的窗口部件。注意我們不怕麻煩的把<A 
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlabel.html">QLabel</A>窗口部件的指針保留到GameBoard類中是因為我們不想再對它們做什么了。當GameBoard窗口部件被銷毀的時候,Qt將會刪除它們,并且布局類會適當地重新定義它們的大小。 

<P><PRE>        <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qhboxlayout.html">QHBoxLayout</A> *topBox = new <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qhboxlayout.html">QHBoxLayout</A>;
    <A name=x2345></A>    grid-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qgridlayout.html#addLayout">addLayout</A>( topBox, 0, 1 );
        topBox-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qboxlayout.html#addWidget">addWidget</A>( shoot );
        topBox-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qboxlayout.html#addWidget">addWidget</A>( hits );
        topBox-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qboxlayout.html#addWidget">addWidget</A>( hitsL );
        topBox-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qboxlayout.html#addWidget">addWidget</A>( shotsLeft );
        topBox-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qboxlayout.html#addWidget">addWidget</A>( shotsLeftL );
    <A name=x2342></A>    topBox-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qboxlayout.html#addStretch">addStretch</A>( 1 );
    <A name=x2343></A>    topBox-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qboxlayout.html#addWidget">addWidget</A>( restart );
</PRE>
<P>右上單元格的窗口部件的數量正在變大。從前它是空的,現在它是完全充足的,我們把它們放到布局中來更好的看到它們。 
<P>注意我們讓所有的窗口部件獲得它們更喜歡的大小,改為在New Game按鈕的左邊加入了一個可以自由伸展的東西。 
<P><PRE>        newGame();
    }
</PRE>
<P>我們已經做完了所有關于GameBoard的構造,所以我們使用newGame()來開始。(newGame()是一個槽,但是就像我們所說的,槽也可以像普通的函數一樣使用。) 

<P><PRE>    void GameBoard::fire()
    {
        if ( cannonField-&gt;gameOver() || cannonField-&gt;isShooting() )
            return;
        shotsLeft-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html#display">display</A>( shotsLeft-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html#intValue">intValue</A>() - 1 );
        cannonField-&gt;shoot();
    }
</PRE>
<P>這個函數進行射擊。如果游戲結束了或者還有一個炮彈在空中,我們立即返回。我們減少炮彈的數量并告訴加農炮進行射擊。 
<P><PRE>    void GameBoard::hit()
    {
        hits-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html#display">display</A>( hits-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html#intValue">intValue</A>() + 1 );
        if ( shotsLeft-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html#intValue">intValue</A>() == 0 )
            cannonField-&gt;setGameOver();
        else
            cannonField-&gt;newTarget();
    }
</PRE>
<P>當炮彈擊中目標的時候這個槽被激活。我們增加射中的數量。如果沒有炮彈了,游戲就結束了。否則,我們會讓CannonField生成新的目標。 
<P><PRE>    void GameBoard::missed()
    {
    <A name=x2347></A>    if ( shotsLeft-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html#intValue">intValue</A>() == 0 )
            cannonField-&gt;setGameOver();
    }
</PRE>
<P>當炮彈射失目標的時候這個槽被激活,如果沒有炮彈了,游戲就結束了。 
<P><PRE>    void GameBoard::newGame()
    {
    <A name=x2346></A>    shotsLeft-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html#display">display</A>( 15 );
        hits-&gt;<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html#display">display</A>( 0 );
        cannonField-&gt;restartGame();
        cannonField-&gt;newTarget();
    }
</PRE>
<P>當用戶點擊Restart按鈕的時候這個槽被激活。它也會被構造函數調用。首先它把炮彈的數量設置為15。注意這里是我們在程序中唯一設置炮彈數量的地方。把它改變為你所想要的游戲規則。接下來我們重置射中的數量,重新開始游戲,并且生成一個新的目標。 

<P>
<H3><A 
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t13-main-cpp.html">t13/main.cpp</A> 
</H3><A name=1-7></A>
<P>這個文件僅僅被刪掉了一部分。MyWidget沒了,并且唯一剩下的是main()函數,除了名稱的改變其它都沒有改變。 
<P>
<H2>行為 </H2><A name=2></A>
<P>射中的和剩余炮彈的數量被顯示并且程序繼續跟蹤它們。游戲可以結束了,并且還有一個按鈕可以開始一個新游戲。 
<P>(請看<A 
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-07.html#compiling">編譯</A>來學習如何創建一個makefile和連編應用程序。) 

<P>
<H2>練習 </H2><A name=3></A>
<P>添加一個隨機的風的因素并把它顯示給用戶看。 
<P>當炮彈擊中目標的時候做一些飛濺的效果。 
<P>實現多個目標。 
<P>現在你可以進行<A 
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-14.html">第十四章</A>了。 
<P>[<A 
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-12.html">上一章</A>] 
[<A 
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-14.html">下一章</A>] 
[<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial.html">教程一主頁</A>] 
<P><!-- eof -->
<P>
<ADDRESS>
<HR>

<DIV align=center>
<TABLE cellSpacing=0 width="100%" border=0>
  <TBODY>
  <TR>
    <TD>Copyright &copy; 2002 <A href="http://www.trolltech.com/">Trolltech</A> 
    <TD><A href="http://www.trolltech.com/trademarks.html">Trademarks</A> 
    <TD><A 
      href="http://www.qtopia.org.cn/doc/qiliang.net/qt/zh_CN.html">譯者:Cavendish</A> 

    <TD align=right>
      <DIV align=right>Qt 
3.0.5版</DIV></TR></TBODY></TABLE></DIV></ADDRESS></BODY></HTML>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
床上的激情91.| 久久久亚洲综合| 欧美电影精品一区二区| 国产精品电影一区二区三区| 日本在线播放一区二区三区| 9l国产精品久久久久麻豆| 91精品国产综合久久福利软件 | 亚洲视频免费在线观看| 日欧美一区二区| 成人影视亚洲图片在线| 欧美一区二区日韩| 亚洲一区二区三区在线| 成人晚上爱看视频| 日韩三级精品电影久久久| 亚洲综合激情小说| 成人国产电影网| 精品欧美久久久| 亚洲一区二区三区自拍| 9i看片成人免费高清| 久久精品亚洲精品国产欧美kt∨| 天堂一区二区在线| 欧美色偷偷大香| 一区二区在线免费| 99re6这里只有精品视频在线观看| 精品乱码亚洲一区二区不卡| 五月激情综合网| 在线观看成人小视频| 亚洲色图视频网站| 99免费精品视频| 亚洲欧洲国产专区| 成人av集中营| 亚洲欧洲精品一区二区三区| 国产成人精品亚洲777人妖| 久久久久青草大香线综合精品| 蜜臀国产一区二区三区在线播放| 8x福利精品第一导航| 亚洲午夜久久久久久久久电影网| 在线观看日韩国产| 亚洲国产日产av| 欧美日韩激情一区二区| 午夜久久电影网| 7799精品视频| 久久激情五月激情| 久久久精品免费免费| 国产乱码精品1区2区3区| 26uuu亚洲婷婷狠狠天堂| 国产老女人精品毛片久久| 久久九九99视频| aaa亚洲精品一二三区| 亚洲日穴在线视频| 欧美日韩高清在线播放| 日本aⅴ亚洲精品中文乱码| 精品日韩在线观看| 成人av片在线观看| 亚洲高清久久久| 欧美一区二区啪啪| 国产99一区视频免费| 亚洲欧洲综合另类| 欧美肥大bbwbbw高潮| 国模套图日韩精品一区二区| 中文字幕免费不卡| 精品视频全国免费看| 久久99国内精品| 中文久久乱码一区二区| 欧美午夜精品久久久久久孕妇| 天天色图综合网| 国产欧美一区视频| 日本丰满少妇一区二区三区| 日本不卡高清视频| 国产精品久久久久久久久图文区| 欧美日韩综合色| 九九精品视频在线看| 综合久久给合久久狠狠狠97色| 欧美自拍偷拍一区| 国产一区在线观看视频| 亚洲激情自拍视频| 久久综合av免费| 欧美视频你懂的| 国产精品99久久久久久久女警| 一区二区三区四区在线| 精品国产亚洲在线| 欧洲一区二区三区在线| 国产伦精品一区二区三区免费迷 | 极品瑜伽女神91| 亚洲欧美日韩电影| 久久久国产综合精品女国产盗摄| 欧美在线视频不卡| 国产91精品精华液一区二区三区 | 国内外成人在线| 亚洲国产精品尤物yw在线观看| 欧美不卡一区二区| 欧美主播一区二区三区美女| 国产剧情在线观看一区二区| 日日夜夜精品免费视频| 亚洲色图.com| 欧美国产日韩精品免费观看| 欧美一级欧美一级在线播放| 色综合久久久久综合体| 国产精品亚洲午夜一区二区三区| 午夜精品福利久久久| 亚洲品质自拍视频网站| 日本一区二区三级电影在线观看 | av电影一区二区| 国产一区二区三区电影在线观看| 香蕉av福利精品导航| 亚洲免费毛片网站| 中文字幕在线不卡一区二区三区 | 国产色产综合色产在线视频| 日韩视频在线你懂得| 欧美日韩一区二区欧美激情| 93久久精品日日躁夜夜躁欧美| 国产精品99久久久久久久vr| 久久国产三级精品| 久久国产福利国产秒拍| 免费在线观看日韩欧美| 日韩av一区二| 青草国产精品久久久久久| 天堂av在线一区| 视频一区视频二区中文| 亚洲国产成人av网| 偷拍日韩校园综合在线| 亚洲大片免费看| 婷婷成人激情在线网| 日韩精品视频网| 日韩电影免费一区| 日本va欧美va欧美va精品| 蜜桃视频在线一区| 国产一区在线观看麻豆| 国产91精品一区二区麻豆网站| 国产成人夜色高潮福利影视| 成人综合日日夜夜| 91尤物视频在线观看| 欧美综合亚洲图片综合区| 欧美日韩专区在线| 3d动漫精品啪啪一区二区竹菊| 日韩亚洲国产中文字幕欧美| 日韩精品最新网址| 中文字幕国产一区| 亚洲精品午夜久久久| 石原莉奈在线亚洲二区| 老司机精品视频线观看86 | 91精品啪在线观看国产60岁| 日韩欧美国产午夜精品| 久久精品欧美一区二区三区不卡 | 亚洲一区二区五区| 喷水一区二区三区| 国产精品1区2区| 色婷婷av一区二区三区gif | 国产一区二区三区在线观看免费视频 | 亚洲免费观看高清在线观看| 亚洲综合在线免费观看| 蜜桃视频在线观看一区| 高清国产午夜精品久久久久久| 色婷婷久久99综合精品jk白丝 | 白白色 亚洲乱淫| 欧美蜜桃一区二区三区| 久久你懂得1024| 亚洲激情图片小说视频| 久久精品国产一区二区三| www.欧美.com| 日韩免费成人网| 亚洲日本青草视频在线怡红院 | 成人免费视频网站在线观看| 国产亚洲一二三区| 亚洲精品精品亚洲| 黑人精品欧美一区二区蜜桃| 日本久久一区二区三区| 精品久久一区二区| 亚洲综合999| 国产成人综合在线| 7777精品伊人久久久大香线蕉的 | 久久久亚洲精华液精华液精华液| 亚洲精品ww久久久久久p站| 国产一区二区电影| 欧美日韩精品一区二区三区四区| 久久久精品综合| 日韩精品免费专区| 色综合欧美在线| 久久久不卡网国产精品一区| 午夜精品久久久久影视| av电影在线观看一区| 精品成人一区二区三区四区| 亚洲chinese男男1069| 99久久99久久精品免费看蜜桃 | 久久蜜桃一区二区| 日本中文字幕一区二区视频| 在线观看av一区| 中文字幕亚洲精品在线观看| 国内精品写真在线观看| 欧美一区日韩一区| 亚洲一本大道在线| 一本大道久久a久久精二百| 中文字幕精品一区二区三区精品 | 国产成人精品免费视频网站| 欧美一级生活片| 日韩av电影免费观看高清完整版在线观看 | 亚洲成国产人片在线观看| 99riav一区二区三区| 国产精品国产三级国产普通话蜜臀 | 中文字幕综合网|