?? qt教程一 —— 第十一章:給它一個炮彈.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0061)http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-11.html -->
<!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-win-commercial-3.0.5/doc/tutorial.doc:1506 --><HTML><HEAD><TITLE>Qt教程一 —— 第十一章:給它一個炮彈</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content=Cavendish name=Translator>
<META content=http://www.qiliang.net/qt name="Qt zh_CN Documents Website">
<STYLE type=text/css>H3.fn {
MARGIN-LEFT: 1cm; TEXT-INDENT: -1cm
}
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>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
<BODY>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR bgColor=#e5e5e5>
<TD vAlign=center><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/index.html"><FONT
color=#004faf>主頁</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/classes.html"><FONT
color=#004faf>所有的類</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/mainclasses.html"><FONT
color=#004faf>主要的類</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/annotated.html"><FONT
color=#004faf>注釋的類</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/groups.html"><FONT
color=#004faf>分組的類</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/functions.html"><FONT
color=#004faf>函數</FONT></A> </TD>
<TD vAlign=center align=right><IMG height=32
src="Qt教程一 —— 第十一章:給它一個炮彈.files/logo32.png" width=64 align=right
border=0></TD></TR></TBODY></TABLE>
<H1 align=center>Qt教程一 —— 第十一章:給它一個炮彈</H1>
<P>
<CENTER><IMG alt="Screenshot of tutorial eleven"
src="Qt教程一 —— 第十一章:給它一個炮彈.files/t11.png"></CENTER>
<P>在這個例子里我們介紹了一個定時器來實現動畫的射擊。
<P>
<UL>
<LI><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t11-lcdrange-h.html">t11/lcdrange.h</A>包含LCDRange類定義。
<LI><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t11-lcdrange-cpp.html">t11/lcdrange.cpp</A>包含LCDRange類實現。
<LI><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t11-cannon-h.html">t11/cannon.h</A>包含CannonField類定義。
<LI><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t11-cannon-cpp.html">t11/cannon.cpp</A>包含CannonField類實現。
<LI><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t11-main-cpp.html">t11/main.cpp</A>包含MyWidget和main。
</LI></UL>
<P>
<H2>一行一行地解說 </H2><A name=1></A>
<P>
<H3><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t11-cannon-h.html">t11/cannon.h</A>
</H3><A name=1-1></A>
<P>CannonField現在就有了射擊能力。
<P>
<P><PRE> void shoot();
</PRE>
<P>當炮彈不在空中中,調用這個槽就會使加農炮射擊。
<P><PRE> private slots:
void moveShot();
</PRE>
<P>當炮彈正在空中時,這個私有槽使用一個<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qtimer.html">定時器</A>來移動射擊。
<P><PRE> private:
void paintShot( <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html">QPainter</A> * );
</PRE>
<P>這個函數來畫射擊。
<P><PRE> <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qrect.html">QRect</A> shotRect() const;
</PRE>
<P>當炮彈正在空中的時候,這個私有函數返回封裝它所占用空間的矩形,否則它就返回一個沒有定義的矩形。
<P><PRE> int timerCount;
<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qtimer.html">QTimer</A> * autoShootTimer;
float shoot_ang;
float shoot_f;
};
</PRE>
<P>這些私有變量包含了描述射擊的信息。<TT>timerCount</TT>保留了射擊進行后的時間。<TT>shoot_ang</TT>是加農炮射擊時的角度,<TT>shoot_f</TT>是射擊時加農炮的力量。
<P>
<H3><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t11-cannon-cpp.html">t11/cannon.cpp</A>
</H3><A name=1-2></A>
<P>
<P><PRE> #include <math.h>
</PRE>
<P>我們包含了數學庫,因為我們需要使用sin()和cos()函數。
<P><PRE> CannonField::CannonField( <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html">QWidget</A> *parent, const char *name )
: <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html">QWidget</A>( parent, name )
{
ang = 45;
f = 0;
timerCount = 0;
autoShootTimer = new <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qtimer.html">QTimer</A>( this, "movement handler" );
<A name=x2311></A> <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qobject.html#connect">connect</A>( autoShootTimer, SIGNAL(<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qtimer.html#timeout">timeout</A>()),
this, SLOT(moveShot()) );
shoot_ang = 0;
shoot_f = 0;
<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html#setPalette">setPalette</A>( QPalette( QColor( 250, 250, 200) ) );
}
</PRE>
<P>我們初始化我們新的私有變量并且把<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qtimer.html#timeout">QTimer::timeout</A>()信號和我們的moveShot()槽相連。我們會在定時器超時的時候移動射擊。
<P><PRE> void CannonField::shoot()
{
<A name=x2308></A> if ( autoShootTimer-><A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qtimer.html#isActive">isActive</A>() )
return;
timerCount = 0;
shoot_ang = ang;
shoot_f = f;
<A name=x2309></A> autoShootTimer-><A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qtimer.html#start">start</A>( 50 );
}
</PRE>
<P>只要炮彈不在空中,這個函數就會進行一次射擊。<TT>timerCount</TT>被重新設置為零。<TT>shoot_ang</TT>和<TT>shoot_f</TT>設置為當前加農炮的角度和力量。最后,我們開始這個定時器。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -