Newer
Older
Grégoire Payen de La Garanderie
committed
#include "simul/table.h"
#include "simul/robot.h"
#include <iostream>
#include <QPainter>
Table::Table(QWidget* parent) : QWidget(parent), world(b2Vec2(0.f,0.f), false)
Grégoire Payen de La Garanderie
committed
{
dt=0;
setAutoFillBackground(true);
QPalette p = palette();
p.setColor(QPalette::Window,QColor(Qt::darkGray));
setPalette(p);
robots.push_back(new Robot(world));
elements.push_back(new Element(world,Position(900,900),Element::Pion));
//Geometry
b2BodyDef bodyDef;
bodyDef.position.Set(0., 0.);
tableBody = world.CreateBody(&bodyDef);
b2PolygonShape box;
b2FixtureDef fixtureDef;
fixtureDef.shape = &box;
Grégoire Payen de La Garanderie
committed
fixtureDef.friction = 0.5;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
fixtureDef.density = 0;
box.SetAsBox(30,1, b2Vec2(0,-1),0);
tableBody->CreateFixture(&fixtureDef);
box.SetAsBox(1,21, b2Vec2(-1,0),0);
tableBody->CreateFixture(&fixtureDef);
box.SetAsBox(1,21, b2Vec2(31,0),0);
tableBody->CreateFixture(&fixtureDef);
box.SetAsBox(30.,1., b2Vec2(0,22),0);
tableBody->CreateFixture(&fixtureDef);
//Starting zones borders
box.SetAsBox(4.00,.11, b2Vec2(0.,4.), 0.);
tableBody->CreateFixture(&fixtureDef);
box.SetAsBox(4.00,.11, b2Vec2(30.,4.), 0.);
tableBody->CreateFixture(&fixtureDef);
//Blocked zones
box.SetAsBox(3.50,1.20, b2Vec2(8,21), 0.);
tableBody->CreateFixture(&fixtureDef);
box.SetAsBox(3.50,1.20, b2Vec2(22,21), 0.);
tableBody->CreateFixture(&fixtureDef);
box.SetAsBox(.11,0.65, b2Vec2(4.61,19.15), 0.);
tableBody->CreateFixture(&fixtureDef);
box.SetAsBox(.11,0.65, b2Vec2(18.61,19.15), 0.);
tableBody->CreateFixture(&fixtureDef);
box.SetAsBox(.11,0.65, b2Vec2(11.39,19.15), 0.);
tableBody->CreateFixture(&fixtureDef);
box.SetAsBox(.11,0.64, b2Vec2(25.39,19.15), 0.);
tableBody->CreateFixture(&fixtureDef);
Grégoire Payen de La Garanderie
committed
}
Table::~Table()
{
}
void Table::update(int dt)
{
this->dt = dt;
for(unsigned int i=0; i < robots.size(); i++)
robots[i]->updateForces(dt);
world.Step((float)dt/1000., 10, 10);
world.ClearForces();
for(unsigned int i=0; i < elements.size(); i++)
elements[i]->updatePos();
Grégoire Payen de La Garanderie
committed
repaint();
}
QPoint getCase(unsigned int i, unsigned int j)
{
return QPoint(450 + i*350, j*350);
}
QPoint getCaseCenter(unsigned int i, unsigned int j)
{
return QPoint(625 + i*350, 175 + j*350);
}
Grégoire Payen de La Garanderie
committed
void Table::paintEvent(QPaintEvent* evt)
{
static float l = 0;
l+= dt*0.005;
QPainter p(this);
p.setRenderHints(QPainter::Antialiasing,true);
Grégoire Payen de La Garanderie
committed
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
p.setWindow(QRect(0,0,tableWidth,tableHeight));
p.setWorldMatrixEnabled(true);
for(unsigned int i=0; i<6; i++)
for(unsigned int j=0; j<6; j++)
p.fillRect(450+i*350,j*350,350,350, ((i+j) & 1) ? Qt::red : Qt::blue);
p.drawEllipse(QRectF(50.0,50.0f,100,l));
//Starting zones
p.fillRect(0,400,400,1700,QColor(0,146,54));
p.fillRect(2600,400,400,1700,QColor(0,146,54));
//Green zones
p.fillRect(0,0,400,400,Qt::red);
p.fillRect(2600,0,400,400,Qt::blue);
//Starting zones borders
p.fillRect(0,389,400,22,Qt::black);
p.fillRect(2600,389,400,22,Qt::black);
//Blocked zones
p.fillRect(450,1980,700,120,Qt::black);
p.fillRect(1850,1980,700,120,Qt::black);
p.fillRect(450,1850,22,130,Qt::black);
p.fillRect(1850,1850,22,130,Qt::black);
p.fillRect(1128,1850,22,130,Qt::black);
p.fillRect(2528,1850,22,130,Qt::black);
//Extra-points
p.setBrush(QBrush(QColor(30,30,30)));
p.setPen(QBrush(QColor(30,30,30)));
p.drawEllipse(getCaseCenter(1,1), 50,50);
p.drawEllipse(getCaseCenter(1,4), 50,50);
p.drawEllipse(getCaseCenter(4,4), 50,50);
p.drawEllipse(getCaseCenter(4,1), 50,50);
p.drawEllipse(getCaseCenter(2,5), 50,50);
p.drawEllipse(getCaseCenter(3,5), 50,50);
p.setBrush(QBrush(QColor("yellow")));
p.setPen(QBrush(QColor("yellow")));
for(unsigned int i=0; i < elements.size(); i++)
elements[i]->paint(p);
Grégoire Payen de La Garanderie
committed
for(unsigned int i=0; i < robots.size(); i++)
robots[i]->paint(p,dt);
dt = 0;
}
void Table::keyPressEvent(QKeyEvent* evt, bool press)
{
for(unsigned int i=0; i < robots.size(); i++)
robots[i]->keyPressEvent(evt, press);
}