From bd0f3345a938b35ce6a12f6150373b0955b8dd12 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sun, 10 Jul 2011 15:24:15 -0500 Subject: Add Qt3 development HEAD version --- doc/html/t14-cannon-cpp.html | 334 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 334 insertions(+) create mode 100644 doc/html/t14-cannon-cpp.html (limited to 'doc/html/t14-cannon-cpp.html') diff --git a/doc/html/t14-cannon-cpp.html b/doc/html/t14-cannon-cpp.html new file mode 100644 index 0000000..bb8166d --- /dev/null +++ b/doc/html/t14-cannon-cpp.html @@ -0,0 +1,334 @@ + + + + + +t14/cannon.cpp Example File + + + + + + + +
+ +Home + | +All Classes + | +Main Classes + | +Annotated + | +Grouped Classes + | +Functions +

t14/cannon.cpp Example File

+ + +
/****************************************************************
+**
+** Implementation CannonField class, Qt tutorial 14
+**
+****************************************************************/
+
+#include "cannon.h"
+#include <qtimer.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qdatetime.h>
+
+#include <math.h>
+#include <stdlib.h>
+
+
+CannonField::CannonField( QWidget *parent, const char *name )
+        : QWidget( parent, name )
+{
+    ang = 45;
+    f = 0;
+    timerCount = 0;
+    autoShootTimer = new QTimer( this, "movement handler" );
+    connect( autoShootTimer, SIGNAL(timeout()),
+             this, SLOT(moveShot()) );
+    shoot_ang = 0;
+    shoot_f = 0;
+    target = QPoint( 0, 0 );
+    gameEnded = FALSE;
+    barrelPressed = FALSE;
+    setPalette( QPalette( QColor( 250, 250, 200) ) );
+    newTarget();
+}
+
+
+void CannonField::setAngle( int degrees )
+{
+    if ( degrees < 5 )
+        degrees = 5;
+    if ( degrees > 70 )
+        degrees = 70;
+    if ( ang == degrees )
+        return;
+    ang = degrees;
+    repaint( cannonRect(), FALSE );
+    emit angleChanged( ang );
+}
+
+
+void CannonField::setForce( int newton )
+{
+    if ( newton < 0 )
+        newton = 0;
+    if ( f == newton )
+        return;
+    f = newton;
+    emit forceChanged( f );
+}
+
+
+void CannonField::shoot()
+{
+    if ( isShooting() )
+        return;
+    timerCount = 0;
+    shoot_ang = ang;
+    shoot_f = f;
+    autoShootTimer->start( 50 );
+    emit canShoot( FALSE );
+}
+
+
+void  CannonField::newTarget()
+{
+    static bool first_time = TRUE;
+    if ( first_time ) {
+        first_time = FALSE;
+        QTime midnight( 0, 0, 0 );
+        srand( midnight.secsTo(QTime::currentTime()) );
+    }
+    QRegion r( targetRect() );
+    target = QPoint( 200 + rand() % 190,
+                     10  + rand() % 255 );
+    repaint( r.unite( targetRect() ) );
+}
+
+void CannonField::setGameOver()
+{
+    if ( gameEnded )
+        return;
+    if ( isShooting() )
+        autoShootTimer->stop();
+    gameEnded = TRUE;
+    repaint();
+}
+
+void CannonField::restartGame()
+{
+    if ( isShooting() )
+        autoShootTimer->stop();
+    gameEnded = FALSE;
+    repaint();
+    emit canShoot( TRUE );
+}
+
+void CannonField::moveShot()
+{
+    QRegion r( shotRect() );
+    timerCount++;
+
+    QRect shotR = shotRect();
+
+    if ( shotR.intersects( targetRect() ) ) {
+        autoShootTimer->stop();
+        emit hit();
+        emit canShoot( TRUE );
+    } else if ( shotR.x() > width() || shotR.y() > height() ||
+                shotR.intersects(barrierRect()) ) {
+        autoShootTimer->stop();
+        emit missed();
+        emit canShoot( TRUE );
+    } else {
+        r = r.unite( QRegion( shotR ) );
+    }
+
+    repaint( r );
+}
+
+
+void CannonField::mousePressEvent( QMouseEvent *e )
+{
+    if ( e->button() != LeftButton )
+        return;
+    if ( barrelHit( e->pos() ) )
+        barrelPressed = TRUE;
+}
+
+
+void CannonField::mouseMoveEvent( QMouseEvent *e )
+{
+    if ( !barrelPressed )
+        return;
+    QPoint pnt = e->pos();
+    if ( pnt.x() <= 0 )
+        pnt.setX( 1 );
+    if ( pnt.y() >= height() )
+        pnt.setY( height() - 1 );
+    double rad = atan(((double)rect().bottom()-pnt.y())/pnt.x());
+    setAngle( qRound ( rad*180/3.14159265 ) );
+}
+
+
+void CannonField::mouseReleaseEvent( QMouseEvent *e )
+{
+    if ( e->button() == LeftButton )
+        barrelPressed = FALSE;
+}
+
+
+void CannonField::paintEvent( QPaintEvent *e )
+{
+    QRect updateR = e->rect();
+    QPainter p( this );
+
+    if ( gameEnded ) {
+        p.setPen( black );
+        p.setFont( QFont( "Courier", 48, QFont::Bold ) );
+        p.drawText( rect(), AlignCenter, "Game Over" );
+    }
+    if ( updateR.intersects( cannonRect() ) )
+        paintCannon( &p );
+    if ( updateR.intersects( barrierRect() ) )
+        paintBarrier( &p );
+    if ( isShooting() && updateR.intersects( shotRect() ) )
+        paintShot( &p );
+    if ( !gameEnded && updateR.intersects( targetRect() ) )
+        paintTarget( &p );
+}
+
+void CannonField::paintShot( QPainter *p )
+{
+    p->setBrush( black );
+    p->setPen( NoPen );
+    p->drawRect( shotRect() );
+}
+
+
+void CannonField::paintTarget( QPainter *p )
+{
+    p->setBrush( red );
+    p->setPen( black );
+    p->drawRect( targetRect() );
+}
+
+void CannonField::paintBarrier( QPainter *p )
+{
+    p->setBrush( yellow );
+    p->setPen( black );
+    p->drawRect( barrierRect() );
+}
+
+const QRect barrelRect(33, -4, 15, 8);
+
+void CannonField::paintCannon( QPainter *p )
+{
+    QRect cr = cannonRect();
+    QPixmap pix( cr.size() );
+    pix.fill( this, cr.topLeft() );
+
+    QPainter tmp( &pix );
+    tmp.setBrush( blue );
+    tmp.setPen( NoPen );
+
+    tmp.translate( 0, pix.height() - 1 );
+    tmp.drawPie( QRect( -35,-35, 70, 70 ), 0, 90*16 );
+    tmp.rotate( -ang );
+    tmp.drawRect( barrelRect );
+    tmp.end();
+
+    p->drawPixmap( cr.topLeft(), pix );
+}
+
+
+QRect CannonField::cannonRect() const
+{
+    QRect r( 0, 0, 50, 50 );
+    r.moveBottomLeft( rect().bottomLeft() );
+    return r;
+}
+
+
+QRect 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.right()  + 5 )*cos(radians);
+    double y0        = ( barrelRect.right()  + 5 )*sin(radians);
+    double x         = x0 + velx*time;
+    double y         = y0 + vely*time - 0.5*gravity*time*time;
+
+    QRect r = QRect( 0, 0, 6, 6 );
+    r.moveCenter( QPoint( qRound(x), height() - 1 - qRound(y) ) );
+    return r;
+}
+
+
+QRect CannonField::targetRect() const
+{
+    QRect r( 0, 0, 20, 10 );
+    r.moveCenter( QPoint(target.x(),height() - 1 - target.y()) );
+    return r;
+}
+
+
+QRect CannonField::barrierRect() const
+{
+    return QRect( 145, height() - 100, 15, 100 );
+}
+
+
+bool CannonField::barrelHit( const QPoint &p ) const
+{
+    QWMatrix mtx;
+    mtx.translate( 0, height() - 1 );
+    mtx.rotate( -ang );
+    mtx = mtx.invert();
+    return barrelRect.contains( mtx.map(p) );
+}
+
+
+bool CannonField::isShooting() const
+{
+    return autoShootTimer->isActive();
+}
+
+
+QSize CannonField::sizeHint() const
+{
+    return QSize( 400, 300 );
+}
+
+
+QSizePolicy CannonField::sizePolicy() const
+{
+    return QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
+}
+
+


+ +
Copyright © 2007 +TrolltechTrademarks +
Qt 3.3.8
+
+ -- cgit v1.2.3