Qt Graphics View & Box2D

项目文件:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = actor
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

win32{
    Box2D = D:/Dev/Box2D
}
macx{
    Box2D = /Users/spoon/Dev/Box2D
}
INCLUDEPATH += $$Box2D/include
LIBS += -L$$Box2D/lib \
        -lBox2D
widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <Box2D/Box2D.h>
#include <QVector>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    void timerEvent(QTimerEvent *event);


private:
    void createWall();
    void createBall();

private:
    Ui::Widget *ui;
    QGraphicsScene* scene;
    QGraphicsView* view;
    b2World* world;
    QVector<b2Body*> balls;
};

#endif // WIDGET_H
widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include <QTransform>
#include <QHBoxLayout>
#include <QGraphicsEllipseItem>
#include <QTimer>
Widget::Widget ( QWidget* parent ) :
    QWidget ( parent ),
    ui ( new Ui::Widget )
{
    ui->setupUi ( this );
    balls.resize(5);
    QTransform transform;
    scene = new QGraphicsScene;
    scene->setSceneRect ( 0, 0, 800 , 600 );
    scene->addRect(QRect(0,0,800,600),QPen(Qt::black));
    view = new QGraphicsView ( scene );
    view->setFixedSize ( 900, 700 );
    transform.reset();
    transform.scale ( 1  , -1 );
    view->setTransform ( transform );

    QHBoxLayout* layout = new QHBoxLayout;
    layout->addWidget ( view );
    this->setLayout ( layout );

    b2Vec2 gravity ( 0.0f, -10.0f );
    world = new b2World ( gravity );

    createWall();
    createBall();
    this->startTimer ( 1000 / 60 );
}

Widget::~Widget()
{
    delete world;
    delete ui;
}


void Widget::timerEvent ( QTimerEvent* event )
{
    world->Step ( 1.0f / 60.0f, 8, 3 );
    for(int i = 0; i <= 4;i++){
        QGraphicsEllipseItem* item =(QGraphicsEllipseItem* ) balls[i]->GetUserData();
        item->setPos(balls[i]->GetPosition().x*30,balls[i]->GetPosition().y*30);
    }
    QWidget::timerEvent ( event );
}


void Widget::createWall()
{
    b2BodyDef groundBodyDef;
    groundBodyDef.position.Set ( scene->sceneRect().width()/2/30.0  , -5/30.0 );
    b2Body* groundBody = world->CreateBody ( &groundBodyDef );
    b2PolygonShape groundBox;
    groundBox.SetAsBox ( scene->sceneRect().width()/2/30.0  , 5/30.0 );
    groundBody->CreateFixture ( &groundBox, 0.0f );
    QGraphicsRectItem* groundItem = new QGraphicsRectItem ( 0, 0, scene->sceneRect().width(), 10 );
    groundItem->setBrush ( QBrush ( Qt::red ) );
    groundBody->SetUserData ( groundItem );
    scene->addItem ( groundItem );


}


void Widget::createBall()
{

    QGraphicsEllipseItem * ballItem;
    b2BodyDef ball;
    for(int i = 0; i <= 4;i++){

        ball.type = b2_dynamicBody;
        ball.linearDamping = 0.1*i;
        ball.position.Set ( (50+100*i)/30.0 , 600/30.0  );
        balls [i] =  world->CreateBody ( &ball );
        ballItem = new QGraphicsEllipseItem(0,0,1*30,1*30);
        ballItem->setBrush(Qt::red);
        ballItem->setPos(50+100*i,600);
        scene->addItem(ballItem);
        balls[i]->SetUserData(ballItem);

        b2CircleShape ballShape;
        ballShape.m_p.Set(0,0);
        ballShape.m_radius = 1;
        b2FixtureDef ballFixtureDef;
        ballFixtureDef.restitution = 0.2*i;
        ballFixtureDef.shape = &ballShape;
        ballFixtureDef.density = 13.0f;
        balls[i]->CreateFixture ( &ballFixtureDef );
    }
}

效果图:


猜你喜欢

转载自blog.csdn.net/sinat_23185975/article/details/53493455