<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/espenr/tmp/qt - 3.3.8 - espenr - 2499/qt - x11 - free - 3.3.8/doc/tutorial.doc:2027 -->
< html >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=ISO-8859-1" >
< title > t13/cannon.cpp Example File< / title >
< style type = "text/css" > < ! - -
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; }
-->< / 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" > Home< / font > < / a >
| < a href = "classes.html" >
< font color = "#004faf" > All Classes< / font > < / a >
| < a href = "mainclasses.html" >
< font color = "#004faf" > Main Classes< / font > < / a >
| < a href = "annotated.html" >
< font color = "#004faf" > Annotated< / font > < / a >
| < a href = "groups.html" >
< font color = "#004faf" > Grouped Classes< / font > < / a >
| < a href = "functions.html" >
< font color = "#004faf" > Functions< / 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 > t13/cannon.cpp Example File< / h1 >
< pre > /****************************************************************
**
** Implementation CannonField class, TQt tutorial 13
**
****************************************************************/
#include "cannon.h"
#include < < a href = "qtimer-h.html" > ntqtimer.h< / a > >
#include < < a href = "qpainter-h.html" > ntqpainter.h< / a > >
#include < < a href = "qpixmap-h.html" > ntqpixmap.h< / a > >
#include < < a href = "qdatetime-h.html" > ntqdatetime.h< / a > >
#include < math.h>
#include < stdlib.h>
< a name = "f94" > < / a > CannonField::CannonField( < a href = "ntqwidget.html" > TQWidget< / a > *parent, const char *name )
: < a href = "ntqwidget.html" > TQWidget< / a > ( parent, name )
{
ang = 45;
f = 0;
timerCount = 0;
autoShootTimer = new < a href = "ntqtimer.html" > TQTimer< / a > ( this, "movement handler" );
< a href = "ntqobject.html#connect" > connect< / a > ( autoShootTimer, SIGNAL(< a href = "ntqtimer.html#timeout" > timeout< / a > ()),
this, SLOT(moveShot()) );
shoot_ang = 0;
shoot_f = 0;
target = TQPoint( 0, 0 );
gameEnded = FALSE;
< a href = "ntqwidget.html#setPalette" > setPalette< / a > ( TQPalette( TQColor( 250, 250, 200) ) );
newTarget();
}
void < a name = "f95" > < / a > CannonField::setAngle( int degrees )
{
if ( degrees < 5 )
degrees = 5;
if ( degrees > 70 )
degrees = 70;
if ( ang == degrees )
return;
ang = degrees;
< a href = "ntqwidget.html#repaint" > repaint< / a > ( cannonRect(), FALSE );
emit angleChanged( ang );
}
void < a name = "f96" > < / a > CannonField::setForce( int newton )
{
if ( newton < 0 )
newton = 0;
if ( f == newton )
return;
f = newton;
emit forceChanged( f );
}
void < a name = "f97" > < / a > CannonField::shoot()
{
if ( isShooting() )
return;
timerCount = 0;
shoot_ang = ang;
shoot_f = f;
autoShootTimer-> < a href = "ntqtimer.html#start" > start< / a > ( 50 );
emit canShoot( FALSE );
}
void < a name = "f98" > < / a > CannonField::newTarget()
{
static bool first_time = TRUE;
if ( first_time ) {
first_time = FALSE;
< a href = "qtime.html" > TQTime< / a > midnight( 0, 0, 0 );
srand( midnight.< a href = "qtime.html#secsTo" > secsTo< / a > (TQTime::< a href = "qtime.html#currentTime" > currentTime< / a > ()) );
}
< a href = "ntqregion.html" > TQRegion< / a > r( targetRect() );
target = TQPoint( 200 + rand() % 190,
10 + rand() % 255 );
< a href = "ntqwidget.html#repaint" > repaint< / a > ( r.< a href = "ntqrect.html#unite" > unite< / a > ( targetRect() ) );
}
void < a name = "f99" > < / a > CannonField::setGameOver()
{
if ( gameEnded )
return;
if ( isShooting() )
autoShootTimer-> < a href = "ntqtimer.html#stop" > stop< / a > ();
gameEnded = TRUE;
< a href = "ntqwidget.html#repaint" > repaint< / a > ();
}
void < a name = "f100" > < / a > CannonField::restartGame()
{
if ( isShooting() )
autoShootTimer-> < a href = "ntqtimer.html#stop" > stop< / a > ();
gameEnded = FALSE;
< a href = "ntqwidget.html#repaint" > repaint< / a > ();
emit canShoot( TRUE );
}
void < a name = "f101" > < / a > CannonField::moveShot()
{
< a href = "ntqregion.html" > TQRegion< / a > r( shotRect() );
timerCount++;
< a href = "ntqrect.html" > TQRect< / a > shotR = shotRect();
if ( shotR.< a href = "ntqrect.html#intersects" > intersects< / a > ( targetRect() ) ) {
autoShootTimer-> < a href = "ntqtimer.html#stop" > stop< / a > ();
emit hit();
emit canShoot( TRUE );
} else if ( shotR.< a href = "ntqrect.html#x" > x< / a > () > width() || shotR.< a href = "ntqrect.html#y" > y< / a > () > height() ) {
autoShootTimer-> < a href = "ntqtimer.html#stop" > stop< / a > ();
emit missed();
emit canShoot( TRUE );
} else {
r = r.< a href = "ntqrect.html#unite" > unite< / a > ( TQRegion( shotR ) );
}
< a href = "ntqwidget.html#repaint" > repaint< / a > ( r );
}
void CannonField::< a href = "ntqwidget.html#paintEvent" > paintEvent< / a > ( < a href = "qpaintevent.html" > TQPaintEvent< / a > *e )
{
< a href = "ntqrect.html" > TQRect< / a > updateR = e-> < a href = "qpaintevent.html#rect" > rect< / a > ();
< a href = "ntqpainter.html" > TQPainter< / a > p( this );
if ( gameEnded ) {
p.< a href = "ntqpainter.html#setPen" > setPen< / a > ( black );
p.< a href = "ntqpainter.html#setFont" > setFont< / a > ( TQFont( "Courier", 48, TQFont::Bold ) );
p.< a href = "ntqpainter.html#drawText" > drawText< / a > ( < a href = "ntqwidget.html#rect" > rect< / a > (), AlignCenter, "Game Over" );
}
if ( updateR.< a href = "ntqrect.html#intersects" > intersects< / a > ( cannonRect() ) )
paintCannon( & p );
if ( isShooting() & & updateR.< a href = "ntqrect.html#intersects" > intersects< / a > ( shotRect() ) )
paintShot( & p );
if ( !gameEnded & & updateR.< a href = "ntqrect.html#intersects" > intersects< / a > ( targetRect() ) )
paintTarget( & p );
}
void < a name = "f102" > < / a > CannonField::paintShot( < a href = "ntqpainter.html" > TQPainter< / a > *p )
{
p-> < a href = "ntqpainter.html#setBrush" > setBrush< / a > ( black );
p-> < a href = "ntqpainter.html#setPen" > setPen< / a > ( NoPen );
p-> < a href = "ntqpainter.html#drawRect" > drawRect< / a > ( shotRect() );
}
void < a name = "f103" > < / a > CannonField::paintTarget( < a href = "ntqpainter.html" > TQPainter< / a > *p )
{
p-> < a href = "ntqpainter.html#setBrush" > setBrush< / a > ( red );
p-> < a href = "ntqpainter.html#setPen" > setPen< / a > ( black );
p-> < a href = "ntqpainter.html#drawRect" > drawRect< / a > ( targetRect() );
}
const < a href = "ntqrect.html" > TQRect< / a > barrelRect(33, -4, 15, 8);
void < a name = "f104" > < / a > CannonField::paintCannon( < a href = "ntqpainter.html" > TQPainter< / a > *p )
{
< a href = "ntqrect.html" > TQRect< / a > cr = cannonRect();
< a href = "ntqpixmap.html" > TQPixmap< / a > pix( cr.< a href = "ntqrect.html#size" > size< / a > () );
pix.< a href = "ntqpixmap.html#fill" > fill< / a > ( this, cr.< a href = "ntqrect.html#topLeft" > topLeft< / a > () );
< a href = "ntqpainter.html" > TQPainter< / a > tmp( & pix );
tmp.< a href = "ntqpainter.html#setBrush" > setBrush< / a > ( blue );
tmp.< a href = "ntqpainter.html#setPen" > setPen< / a > ( NoPen );
tmp.< a href = "ntqpainter.html#translate" > translate< / a > ( 0, pix.< a href = "ntqpixmap.html#height" > height< / a > () - 1 );
tmp.< a href = "ntqpainter.html#drawPie" > drawPie< / a > ( TQRect( -35,-35, 70, 70 ), 0, 90*16 );
tmp.< a href = "ntqpainter.html#rotate" > rotate< / a > ( -ang );
tmp.< a href = "ntqpainter.html#drawRect" > drawRect< / a > ( barrelRect );
tmp.< a href = "ntqpainter.html#end" > end< / a > ();
p-> < a href = "ntqpainter.html#drawPixmap" > drawPixmap< / a > ( cr.< a href = "ntqrect.html#topLeft" > topLeft< / a > (), pix );
}
TQRect < a name = "f105" > < / a > CannonField::cannonRect() const
{
< a href = "ntqrect.html" > TQRect< / a > r( 0, 0, 50, 50 );
r.< a href = "ntqrect.html#moveBottomLeft" > moveBottomLeft< / a > ( < a href = "ntqwidget.html#rect" > rect< / a > ().bottomLeft() );
return r;
}
TQRect < a name = "f106" > < / a > CannonField::shotRect() const
{
const double gravity = 4;
double time = timerCount / 4.0;
double velocity = shoot_f;
double radians = shoot_ang*3.14159265/180;
double velx = velocity*cos( radians );
double vely = velocity*sin( radians );
double x0 = ( barrelRect.< a href = "ntqrect.html#right" > right< / a > () + 5 )*cos(radians);
double y0 = ( barrelRect.< a href = "ntqrect.html#right" > right< / a > () + 5 )*sin(radians);
double x = x0 + velx*time;
double y = y0 + vely*time - 0.5*gravity*time*time;
< a href = "ntqrect.html" > TQRect< / a > r = TQRect( 0, 0, 6, 6 );
r.< a href = "ntqrect.html#moveCenter" > moveCenter< / a > ( TQPoint( tqRound(x), height() - 1 - tqRound(y) ) );
return r;
}
TQRect < a name = "f107" > < / a > CannonField::targetRect() const
{
< a href = "ntqrect.html" > TQRect< / a > r( 0, 0, 20, 10 );
r.< a href = "ntqrect.html#moveCenter" > moveCenter< / a > ( TQPoint(target.x(),height() - 1 - target.y()) );
return r;
}
bool < a name = "f108" > < / a > CannonField::isShooting() const
{
return autoShootTimer-> < a href = "ntqtimer.html#isActive" > isActive< / a > ();
}
TQSizePolicy CannonField::< a href = "ntqwidget.html#sizePolicy" > sizePolicy< / a > () const
{
return TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Expanding );
}
< / pre > <!-- eof -->
< p > < address > < hr > < div align = center >
< table width = 100% cellspacing = 0 border = 0 > < tr >
< td > Copyright © 2007
< a href = "troll.html" > Trolltech< / a > < td align = center > < a href = "trademarks.html" > Trademarks< / a >
< td align = right > < div align = right > TQt 3.3.8< / div >
< / table > < / div > < / address > < / body >
< / html >