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);
    // 任

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章