QGraphic学习笔记 - 图文 联系客服

发布时间 : 星期二 文章QGraphic学习笔记 - 图文更新完毕开始阅读7b993e72561252d380eb6e8c

一个小的简单的游戏引出的心得体会

分解实例1 实例描述:

实现一个按钮,按钮继承自QGraphicObject,

头文件:

class myButton : public QGraphicsObject {

Q_OBJECT public:

myButton(int ,int,QString ,QString ,class MainWindow *); QRectF boundingRect() const; void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *); protected:

void hoverEnterEvent ( QGraphicsSceneHoverEvent *) ; void hoverLeaveEvent ( QGraphicsSceneHoverEvent *) ; void mousePressEvent ( QGraphicsSceneMouseEvent *); private:

QPixmap pix; QString img;

QString hoverImg; class MainWindow * m;

Phonon::MediaObject *clickMic; signals:

void clickSig(); };

源文件:

myButton::myButton(int x,int y,QString img,QString hoverImg,class MainWindow * m){ this->img=img;

this->hoverImg=hoverImg; pix.load(img);

setPos(x-pix.width()/2,y-pix.height()/2); this->m=m;

setFlags(QGraphicsItem::ItemIsFocusable); setFlags(QGraphicsItem::ItemIsMovable); setAcceptHoverEvents(true);

clickMic=Phonon::createPlayer(Phonon::MusicCategory,

Phonon::MediaSource(\));

}

QRectF myButton::boundingRect() const{

return QRectF(0, 0, pix.width(), pix.height()); }

void myButton::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){

painter->drawPixmap(0,0,pix.width(), pix.height(),pix); }

void myButton::hoverEnterEvent ( QGraphicsSceneHoverEvent *) { setFocus(Qt::MouseFocusReason);

pix.load(hoverImg); clickMic->play(); update(); }

void myButton::hoverLeaveEvent ( QGraphicsSceneHoverEvent *) { setFocus(Qt::MouseFocusReason); pix.load(img); update(); }

void myButton::mousePressEvent ( QGraphicsSceneMouseEvent *){ emit clickSig(); }

引用文件:

cjScene = new QGraphicsScene;//新建场景指针 cjScene->clear(); myButton *sbtn=new

myButton(width/2,height/2-200,\,\tn2.png\,this);

connect(sbtn,SIGNAL(clickSig()),this,SLOT(guanKaScene())); cjScene->addItem(sbtn); myButton *soundBtn=new

myButton(width/2,height/2,\,\png\,this);

cjScene->addItem(soundBtn); myButton *quitBtn=new

myButton(width/2,height/2+200,\,\2.png\,this);

connect(quitBtn,SIGNAL(clickSig()),this,SLOT(close())); cjScene->addItem(quitBtn);

cjScene->setSceneRect(0,0,width,height);

cjScene->setBackgroundBrush( QPixmap(\).scaled(width,height));

this->setScene(cjScene);

绘制动画精灵1:

void ninjia::play(){

QTimeLine* timeline=new QTimeLine(200); timeline->setFrameRange(1, 4);

connect(timeline,SIGNAL(frameChanged(int)),this,SLOT(move_play(int)));

timeline->start(); }

void ninjia::move_play(int i){ qDebug()<

QString path=\; pix.load(path); return; }

QString path=\+QString::number(i)+\; pix.load(path); }

绘制动画精灵2:

timeline=new QTimeLine(1000);

timeline->setFrameRange(1, maxFrame); timeline->setLoopCount(0);

connect(timeline,SIGNAL(frameChanged(int)),this, SLOT(move_play(int))); timeline->start();

void target::move_play(int i){ qDebug()<

QString path=imgPath+QString::number(i)+\; pix.load(path); }

精灵的碰撞检测:

bool target::isColliding() {

QList item_list = collidingItems(); QGraphicsItem *item;

foreach(item, item_list) {

if(item->data(1)==\){ item->stackBefore(this); }

if((item->data(1)==\||item->data(1)==\)&&(this->boundingRect().y()+this->pos().y()+this->boundingRect().height())<(item->boundingRect().y()+item->pos().y()+item->boundingRect().height())){ this->stackBefore(item); }

if(item->data(1)==\&&item->data(2)!=false){ life=life-((projectile*)item)->gePower(); m->deleteItem((projectile*)item); item->setData(2,false); if(life>0){return true;} m->updateScore(10); this->setData(2,false); return true; } }

return false; }

子弹的发射

void myScene::mousePressEvent( QGraphicsSceneMouseEvent * e ){ projectile *p=new

projectile(x,y,m,angleValue,6,\,m->getAttack()); this->addItem(p); pewMic->pause(); pewMic->play();

QGraphicsScene::mousePressEvent(e); }

子弹的自动移动与移除:

void projectile::advance(int i){

moveBy(cos(angleValue)*speed,sin(angleValue)*speed);

if(this->data(2)==false||pos().x()>this->m->scene()->width()||pos().y()>this->m->scene()->height()||pos().y()<0||pos().x()<0){ drop();//移除本身removeItem(this);