资源简介
这一节主要学习在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
相关资源
- PyQt 开发的音乐播放器比较美观:D
- QT Creator快速入门.pdf
- qt在window实现调取摄像头识别二维码条
- 使用Qt实现客户端服务端聊天和传输文
- Qt5:多文档功能查看器新增视频文件播
- pyqt5PyQt5快速开发与实战
- Qt5+Halcon联合Demo
- Apollo服务器及MQTT功能实现源码
- 基于stm32俄罗斯和贪吃蛇游戏keil源代
- Qt OpenCV 播放及Socket发送视频流
- apache-apollo-1.7.1-windows
- pyqt5 2019学习手册 自编手册 可以当工
- QT5开发及.zip
- LINUX编程典型解析.part1.rar
- [Qt5开发及第2版(含CD光盘1张)][陆文
- 基于qt4.8.6forVS2010的QGIS2.4.0的VS2010开发
- 视频编辑器
- qt quick核心编程 对应的代码
- 简单实现基于Qt5的音乐播放器
- MQTT单片机编程小工具.exe
- STM32F4x7+freertos+lwip+ssl+MQTT-(MDK5)稳定
- MQTT-3.1.1-CN学习MQTT协议的完整中文资料
- Qt5.6+VLC简单实现沙师弟专栏
- QT tcp 聊天室
- Qt Linux zinnia 手写中文识别 svm
- 基于qt实现的minidraw画板程序
- qt在window实现调取摄像头识别二维码条
- qt在window调取摄像头识别二维码
- Computer Vision with Opencv3 and Qt5.pdf
- Qt图片找不同
评论
共有 条评论