資源簡介
這一節主要學習在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
評論
共有 條評論