-
Notifications
You must be signed in to change notification settings - Fork 1
/
Ball.cpp
108 lines (79 loc) · 2.84 KB
/
Ball.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <QDebug>
#include <Box2D/Box2D.h>
#include "main.h"
#include "Ball.h"
Ball::Ball(QGraphicsItem *parent)
{
QGraphicsItem::setParentItem(parent);
radius=0.0;
}
void Ball::setRadius(const qreal iRadius)
{
radius=iRadius;
}
void Ball::putToPhysicsWorld()
{
// Общие параметры тела
b2BodyDef bodyDef;
bodyDef.type=b2_dynamicBody;
bodyDef.position.Set(this->x(), this->y());
// Создается тело в физическом движке
b2Body *body=physicsWorld->CreateBody(&bodyDef);
// Создается форма тела
b2CircleShape circleShape;
circleShape.m_radius=radius;
// Настройка физических параметров тела
b2FixtureDef fixture;
fixture.shape = &circleShape; // Форма
fixture.density = 1.0; // Плотность (через нее и форму движек узнает массу тела)
fixture.friction = 0.0; // Коэффициент трения ( 0.0 - нет трения, 1.0 - максимальное трение. Трение расчитывается "среднее" для двух контачащих тел)
fixture.restitution = 1.0; // Коэффициент упругости (0.0 - нет отскока, 1.0 - максимальный отскок)
body->CreateFixture(&fixture);
b2Vec2 velocityVector(MOVE_NOID_START_BALL_VELOCITY_X, MOVE_NOID_START_BALL_VELOCITY_Y);
body->SetLinearVelocity(velocityVector);
qDebug() << "Ball mass: " << body->GetMass();
// Запоминается настроенное тело
physicsBody=body;
}
void Ball::updatePosByPhysicsWorld()
{
this->setX( physicsBody->GetPosition().x );
this->setY( physicsBody->GetPosition().y );
// qDebug() << "Ball coordinats: " << this->x() << this->y();
}
void Ball::moveToDefaultPos()
{
// Если мячик уже есть, его надо удалить перед перемещением
if(physicsBody!=nullptr) {
physicsWorld->DestroyBody(physicsBody);
}
this->setX(MOVE_NOID_START_BALL_POS_X);
this->setY(MOVE_NOID_START_BALL_POS_Y);
putToPhysicsWorld();
}
b2ContactEdge *Ball::getContactList() const
{
return physicsBody->GetContactList();
}
QRectF Ball::boundingRect() const
{
return QRectF(-radius, -radius, radius*2.0, radius*2.0);
}
QPainterPath Ball::shape() const
{
QPainterPath path;
path.addEllipse(-radius, -radius, radius*2.0, radius*2.0);
return path;
}
void Ball::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
// Filling
painter->setBrush(QColor(199, 104, 2));
// Edges
QPen pen;
pen.setWidth(0.1);
pen.setBrush(Qt::white);
painter->setPen(pen);
QRectF rectangle(-radius, -radius, radius*2.0, radius*2.0);
painter->drawEllipse(rectangle);
}