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

📄 cannon.cpp

📁 qt开发的一个简单的例程
💻 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 + -