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

📄 qt教程一 —— 第十一章:给它一个炮弹.htm

📁 嵌入式QT开发系列文档
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!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 &lt;math.h&gt;
</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-&gt;<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-&gt;<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 + -