?? cannon.cpp
字號:
#include "cannon.h"#include <qpainter.h>#include <qpixmap.h>#include <qtimer.h>#include <qdatetime.h>#include <math.h>#include <stdlib.h>CannonField::CannonField(QWidget *parent,const char *name) : QWidget(parent,name){ ang = 45; f = 0; timeCount = 0; autoShootTimer = new QTimer(this,"movement handler"); connect(autoShootTimer,SIGNAL(timeout()), this,SLOT(moveShot())); shoot_ang = 0; shoot_f = 0; 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; timeCount = 0; shoot_ang = ang; shoot_f = f; autoShootTimer->start(50); emit canShoot(FALSE);}bool CannonField::isShooting() const{ return autoShootTimer->isActive();}void CannonField::restartGame(){ if(isShooting()) autoShootTimer->stop(); gameEnded = FALSE; emit canShoot(TRUE);}void CannonField::setGameOver(){ if(gameEnded) return; if(isShooting()) autoShootTimer->stop(); gameEnded = TRUE; repaint();}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::moveShot(){ QRegion r(LastShotRect); LastShotRect = shotRect(); timeCount++; QRect shotR = shotRect(); // abtain the updated shotRect if(shotR.intersects(targetRect())){ autoShootTimer->stop(); emit canShoot(TRUE); emit hit(); }else if( shotR.x() > width() || shotR.y() > height() ){ autoShootTimer->stop(); emit missed(); emit canShoot(TRUE); } r = r.unite(QRegion(shotR)); repaint(r);// repaint(shotR);}const QRect barrelRect(33,-4,15,8);void CannonField::paintCannon(QPainter* p){ //if(!e->rect().intersects(cannonRect())) // return; QRect cr = cannonRect(); QPixmap pix(cr.size());// QPixmap pix;// (cr.width(),cr.height(),-1); 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.begin(this); p->drawPixmap(cr.topLeft(),pix);/*// QString s = "Angle = " + QString::number(ang); QPainter p(this);// p.drawText(200,200,s); p.setBrush(blue); p.setPen(NoPen); p.translate(0,rect().bottom()); p.drawPie(QRect(-35,-35,70,70),0,90*16); p.rotate(-ang); p.drawRect(QRect(33,-4,15,8));*/}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::paintEvent(QPaintEvent* e){ QRect updataR = e->rect(); QPainter p(this); if(gameEnded){ p.setPen(black); p.setFont(QFont("Courier",48,QFont::Bold)); p.drawText(rect(),AlignCenter,"Game Over"); } if(updataR.intersects(cannonRect())) paintCannon(&p); if(autoShootTimer->isActive()&&updataR.intersects(shotRect())) paintShot(&p); if(updataR.intersects(targetRect())) paintTarget(&p);}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 = timeCount/4.0; double velocity = shoot_f; double radians = shoot_ang*3.1415926/180; double velx = velocity*cos(radians); double vely = velocity*sin(radians); double x0 = barrelRect.right() * cos(radians); double y0 = barrelRect.right() * 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;}QSizePolicy CannonField::sizePolicy() const{ return QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -