• 大小: 13.93MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-06-26
  • 语言: 其他
  • 标签: Qt  

资源简介

这一节主要学习在Qt中怎样使用图形视图框架,实验完成的是一个简易的俄罗斯方块游戏,有了图形视图框架的支持,该游戏的设计变得非常简单,不需要考虑很多复杂的算法,比如说方块的碰撞检测,旋转,视图的设计等。从本实验中可以学到2D图形的绘制,游戏的逻辑设计,图形视图的应用,动画设置,背景音乐的添加,Phonon框架的应用等知识

资源截图

代码片段和文件信息

#include “box.h“
#include 
#include 
#include 


//OneBox是从QGraphicsobject继承而来的
OneBox::OneBox(const QColor &color) : brushColor(color) {

}


//该函数为指定后面的绘图区域的外边框
QRectF OneBox::boundingRect() const {

    qreal pen_width = 1;
    //小方块的边长为20.5像素
    return QRectF(-10-pen_width/2 -10-pen_width/2 20+pen_width 20+pen_width);

}

void OneBox::paint(QPainter *painter const QstyleOptionGraphicsItem *option QWidget *widget){

    //贴图,看起来有质感否则单独用颜色去看,会感觉那些方块颜色很单一
    painter->drawPixmap(-10 -10 20 20 QPixmap(“:/images/box.gif“));
    painter->setBrush(brushColor);//设置画刷颜色
    QColor penColor = brushColor;
    penColor.setAlpha(20);//将颜色的透明度减小,使方框边界和填充色直接能区分开
    painter->setPen(penColor);//色绘制画笔
    //这里画矩形框,框内填充部分用画刷画,框外线条用画笔画
    painter->drawRect(-10 -10 20 20);//画矩形框
}


//在局部坐标点上返回item的shape但是好像没有其它地方调用了该函数
QPainterPath OneBox::shape() const{

    //QPainterPath是一个绘图操作的容器
    QPainterPath path;
    path.addRect(-9.5 -9.5 19 19);
    return path;
}


//BoxGroup是从QGraphicsItemGroup,Qobject继承而来的
BoxGroup::BoxGroup() {

    setFlags(QGraphicsItem::ItemIsFocusable);//允许设置输入焦点
    old_transform = transform();//返回当前item的变换矩阵当BoxGroup进行旋转后,可以使用它来进行恢复
    timer = new QTimer(this);
    connect(timer SIGNAL(timeout()) this SLOT(move_one_step()));
    current_shape = RandomShape;
}


QRectF BoxGroup::boundingRect() const {

    qreal pen_width = 1;
    return QRectF(-40-pen_width/2 -40-pen_width/2 80+pen_width 80+pen_width);//2*2个小方块组成一个小方块组
}


void BoxGroup::keyPressEvent(QKeyEvent *event) {

    switch(event->key())
    {
        //向下键位坠落键
        case Qt::Key_Down:
            moveBy(0 20);//moveBy是系统自带的函数,不需要我们自己去实现
            while(!isColliding()) {
                moveBy(0 20);
            }
            moveBy(0 -20);//往回跳
            clear_box_group();//到达底部后就将当前方块组的4个item移除不销毁方块组
            emit need_new_box();//发射信号,在MyView中接收
            break;
        case Qt::Key_Left:
            moveBy(-20 0);
            if(isColliding()) {
                moveBy(20 0);
            }
            break;
        case Qt::Key_Right:
            moveBy(20 0);
            if(isColliding()) {
                moveBy(-20 0);
            }
            break;
         //实现小方块组变形
         case Qt::Key_Space:
            rotate(90);//方块组的旋转也不需要自己实现,Qt库中自带该方法
            if(isColliding())
                rotate(-90);//变形后碰撞了,就逆向变形回去
            break;
    }
}


//检测是否有碰撞
bool BoxGroup::isColliding() {

    QList item_list = childItems();//返回子item列表
    QGraphicsItem *item;
    foreach(item item_list) {
        if(item->collidingItems().count()>1)//collidingItems返回与当前item碰撞的子item列表
            return true;//代表至少有一个item发生了碰撞
    }
    return false;
}


//将方块组从视图中移除掉,如果有需要(即参数为true的情况下)则销毁掉
//其本质是将所有的小方块从方块组中移除掉,达到从视图中将方块组移除的目的
void BoxGroup::clear_box_group(bool destroy_box) {

    

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     692345  2012-09-22 19:47  Qt学习之路_13(简易俄罗斯方块).pdf

     文件       7382  2012-09-21 17:23  tetris\box.cpp

     文件       1329  2012-09-21 11:42  tetris\box.h

     文件     912897  2011-07-17 16:29  tetris\images\background.png

     文件     709509  2011-07-17 13:39  tetris\images\background01.png

     文件     645354  2011-07-17 13:51  tetris\images\background02.png

     文件       1213  2011-07-17 11:41  tetris\images\box.gif

     文件       1116  2011-07-17 11:13  tetris\images\icon.png

     文件       7521  2011-03-17 17:09  tetris\images\logo.png

     文件        300  2012-09-21 01:13  tetris\images.qrc

     文件        743  2012-09-22 18:54  tetris\main.cpp

     文件       7073  2012-09-22 17:00  tetris\Makefile

     文件       7328  2012-09-22 17:00  tetris\Makefile.Debug

     文件       7415  2012-09-22 17:00  tetris\Makefile.Release

     文件      17037  2012-09-22 18:58  tetris\myview.cpp

     文件       1741  2012-09-22 17:00  tetris\myview.h

     文件     860812  2011-07-17 15:21  tetris\sounds\background.mp3

     文件    2217638  2011-07-17 15:22  tetris\sounds\background01.mp3

     文件    8664934  2011-07-17 16:02  tetris\sounds\background02.mp3

     文件      29217  2011-07-17 16:02  tetris\sounds\clearrow.mp3

     文件        154  2012-09-22 17:00  tetris\tetris.pro

     文件      17534  2012-09-22 19:47  tetris\tetris.pro.user

     文件    1019904  2012-09-22 18:58  tetris\vc100.pdb

     目录          0  2012-09-22 19:47  tetris\images

     目录          0  2012-09-22 19:47  tetris\sounds

     目录          0  2012-09-22 19:47  tetris

----------- ---------  ---------- -----  ----

             15830496                    26


评论

共有 条评论