qt的俄罗斯方块游戏移植到OK6410的修改

这几天在学习QT编程,编写过一些基本的qt对话框和简单的界面,对于一些简单的qt库的应用,如button,text,还有layout等界面布局管理。本以为已经可以对qt已经初步掌握了,可是发现离开教程,离开书本等,自己编写的时候又遇到了很多问题,让自己无从下手。它不是基本qt的库函数的应用等,而是整个qt项目的设计的生疏,因为之前都是照着例子打进去,没有仔细考虑过设计的整体思路方法,当时只是为了熟悉qt的库和基本的编程。现在再次学习,发现了其实基本设计的思想也就是c++的面向对象的思路。在此,发表下自己的感想c++在软件设计上真的很重要。qt编程首先整体上把你要显示的整个界面定义成一个class,里面包含可以包含多个构造函数,去建设整个界面,可以包含公有的函数和私有函数等,为了给在信号函数和曹函数里面调用,因为qt是一个很大的界面库,里面自然包含很多类和函数以及发生事件,当我们需要的自己重新编写合适自己的类时,自然也要用到重载函数。在开始学习qt编写的时候,不怎么注意这方面,所以没有关注,不过从自己开始想去编一个俄罗斯方块游戏时,自然会想到该怎么去设计,然后去百度,查阅资料,发现自己的构思与之相差甚远,因此,仔细研究了一下,收获还是颇大的。再次给大家推荐一个博客,里面也讲的很仔细了。但是毕竟是别人的领悟,需要自己先去研究再来看,觉得映像才深,自然也会有一些共鸣,也会增加个人的信心。再次很感谢两位博主给的帮助。

http://www.cnblogs.com/tornadomeet/archive/2012/09/22/2698337.html

http://blog.csdn.net/xj178926426/article/details/7198279


下面说一下自己怎么修改俄罗斯方块游戏来适应是ok6410的屏幕显示吧。因为ok6410的现实屏幕是430*270的,直接把qt_quickly里面的俄罗斯方块游戏移植过去显示的时候是不方便的,看起来很别扭,显示不完,需要拉滚动条,所以需要修改界面的显示,方块组的大小,显示界面大小等。但是由于修改了后会引起方块的无法消除,这个问题纠结了我很久,百度也没有具体解决方案。经过几次排除法的调试总算调好了。它需要调的问题就是出在方块消除和满行上面的方块下移部分,这部分里面的那个for循环是重点,只要参数稍微改下,不适合的话就没有消除的效果。我为了移植到开发板上完全显示出来,把整个框架界面设计为了lcd大小,方块组变为原来的1/2,然而for循环里面的参数不能简单的一位直接缩小一半,这样的话就会出现消除不了的效果了。多说都是废话,还是上图,上代码吧。

#ifndef MYBOX_H
#define MYBOX_H

#include <QGraphicsObject>
#include <QGraphicsItemGroup>

// С
class OneBox : public QGraphicsObject
{
public:
    OneBox(const QColor &color = Qt::red);
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    QPainterPath shape() const;

private:
    QColor brushColor;

};

//
class BoxGroup : public QObject, public QGraphicsItemGroup
{
    Q_OBJECT

public:
    enum BoxShape {IShape, JShape, LShape, OShape, SShape,
                       TShape, ZShape, RandomShape};

    BoxGroup();
    QRectF boundingRect() const;


    bool isColliding();
    void createBox(const QPointF &point = QPointF(0, 0), BoxShape shape = RandomShape);
    void clearBoxGroup(bool destroyBox = false);
    BoxShape getCurrentShape() {return currentShape;}

protected:
    void keyPressEvent(QKeyEvent *event);

signals:
    void needNewBox();
    void gameFinished();

public slots:
    void moveOneStep();
    void startTimer(int interval);
    void stopTimer();

private:
    BoxShape currentShape;
    QTransform oldTransform;
    QTimer *timer;
};
#endif // MYBOX_H




myview.h

#ifndef MYVIEW_H
#define MYVIEW_H

#include <QGraphicsView>
class BoxGroup;
// 2-5ӵĴ
#include<phonon>

class MyView : public QGraphicsView
{
    Q_OBJECT
public:
    explicit MyView(QWidget *parent = 0);

// 2-4ӵĴ
protected:
    void keyPressEvent(QKeyEvent *event);

public slots:
    void startGame();
    void clearFullRows();
    void moveBox();
    void gameOver();

    // 2-4ӵĴ
    void restartGame();
    void finishGame();
    void pauseGame();
    void returnGame();

    // 2-5ӵĴ
    void aboutToFinish();

private:
    BoxGroup *boxGroup;
    BoxGroup *nextBoxGroup;
    QGraphicsLineItem *topLine;
    QGraphicsLineItem *bottomLine;
    QGraphicsLineItem *leftLine;
    QGraphicsLineItem *rightLine;
    qreal gameSpeed;
    QList<int> rows;
    void initView();
    void initGame();
    void updateScore(const int fullRowNum = 0);

    // 2-3ӵĴ
    QGraphicsTextItem *gameScoreText;
    QGraphicsTextItem *gameLevelText;

    // 2-4ӵĴ

    //
    QGraphicsWidget *maskWidget;

    // ְť
    QGraphicsWidget *startButton;
    QGraphicsWidget *finishButton;
    QGraphicsWidget *restartButton;
    QGraphicsWidget *pauseButton;
    QGraphicsWidget *optionButton;
    QGraphicsWidget *returnButton;
    QGraphicsWidget *helpButton;
    QGraphicsWidget *exitButton;
    QGraphicsWidget *showMenuButton;

    // ı
    QGraphicsTextItem *gameWelcomeText;
    QGraphicsTextItem *gamePausedText;
    QGraphicsTextItem *gameOverText;

    // 2-5ӵĴ
    Phonon::MediaObject *backgroundMusic;
    Phonon::MediaObject *clearRowSound;
};

#endif // MYVIEW_H

mybox.cpp

#include "mybox.h"
#include <QPainter>
#include <QKeyEvent>
#include <QTimer>

OneBox::OneBox(const QColor &color) : brushColor(color)
{
}

QRectF OneBox::boundingRect() const
{
    qreal penWidth=0.5;
    return QRectF(-5-penWidth/2,-5-penWidth/2,10+penWidth,+10+penWidth);
}

void OneBox::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    // ΪСʹͼ
    painter->drawPixmap(-5, -5, 10, 10, QPixmap(":/images/box.gif"));
    painter->setBrush(brushColor);
    QColor penColor = brushColor;
    // ɫ͸ȼС
    penColor.setAlpha(220);
    painter->setPen(penColor);
    painter->drawRect(-5, -5, 10, 10);
}

// ״ȱ߿С0.5أеСŲᷢײ
QPainterPath OneBox::shape() const
{
    QPainterPath path;
    path.addRect(-4.75, -4.75, 9.5, 9.5);
    return path;
}

//

BoxGroup::BoxGroup()
{
    setFlags(QGraphicsItem::ItemIsFocusable);
    // 任

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值