Subversion Repositories QTron

Rev

Rev 7 | Rev 9 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 muzer 1
#include "bike.h"
2
 
3
Bike::Bike(QTcpSocket *sock, int i)
4
{
5
        socket = sock;
6
        id = i;
7
 
8
        connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
9
        connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
10
 
11
        isDisconnected = false;
12
 
13
        x = rand() % 800;
14
        y = rand() % 600;
15
        linePoints.append(QPoint(x, y));
16
 
17
        velocity = 1;
18
        angle = 0;
19
        name = "";
20
        show = false;
21
        isReady = false;
22
        hadGo = false;
23
        dead = false;
8 tom 24
        collided = false;
1 muzer 25
 
26
        colour.setBlue(0);
27
        colour.setRed(0);
28
        colour.setGreen(0);
29
 
30
        if (!socket->waitForReadyRead(2000))
31
        {
32
                socket->disconnectFromHost();
33
                show = false;
34
                isReady = true;
35
                hadGo = false;
36
        }
37
}
38
 
39
void Bike::draw(QPainter *painter)
40
{
41
        if (show)
42
        {
43
                painter->setPen(colour);
44
                painter->setFont(QFont("sans", 12));
45
 
46
                for (int i = 0; i < linePoints.count(); i++)
47
                {
48
                        QPoint point1;
49
                        QPoint point2;
50
                        if (i == 0)
51
                        {
52
                                point1 = linePoints[0];
53
                        }
54
                        else
55
                        {
56
                                point1 = linePoints[i - 1];
57
                        }
58
 
59
                        point2 = linePoints[i];
60
 
61
                        painter->drawLine(point1, point2);
62
                }
63
 
8 tom 64
                if (!collided)
1 muzer 65
                {
8 tom 66
                        collided = hasCollided();
67
 
68
                        if (angle == 0)
69
                        {
70
                                y -= velocity;
71
                        }
72
                        else if (angle == 90)
73
                        {
74
                                x += velocity;
75
                        }
76
                        else if (angle == 180)
77
                        {
78
                                y += velocity;
79
                        }
80
                        else if (angle == 270)
81
                        {
82
                                x -= velocity;
83
                        }
1 muzer 84
                }
8 tom 85
                else
1 muzer 86
                {
8 tom 87
                        linePoints.clear();
1 muzer 88
                }
89
 
90
                if (angle == 0 || angle == 180)
91
                {
92
                        painter->fillRect(x - 5, y - 15, 10, 30, colour);
93
                }
94
                else
95
                {
96
                        painter->fillRect(x - 15, y - 5, 30, 10, colour);
97
                }
98
 
99
                painter->drawText(x, y - 20, name);
100
        }
101
}
102
 
103
void Bike::run(QList<Bike *> bikes)
104
{
105
        for (int i = 0; i < bikes.count(); i++)
106
        {
107
                Bike *bike = bikes[i];
108
                if (bike->isReady && bike->show)
109
                {
110
                        if (bike->dead)
111
                        {
112
                                socket->write("DEAD ");
113
                                socket->write(bike->name.toAscii());
114
                                socket->write("\n");
115
                        }
116
                        else
117
                        {
118
                                socket->write("BIKE ");
119
                                socket->write(bike->name.toAscii());
120
                                socket->write(" ");
121
                                socket->write(QString::number(bike->x).toAscii());
122
                                socket->write(" ");
123
                                socket->write(QString::number(bike->y).toAscii());
7 tom 124
                                socket->write(" ");
125
                                socket->write(QString::number(bike->colour.red()).toAscii());
126
                                socket->write(" ");
127
                                socket->write(QString::number(bike->colour.green()).toAscii());
128
                                socket->write(" ");
129
                                socket->write(QString::number(bike->colour.blue()).toAscii());
1 muzer 130
                                socket->write("\n");
131
                        }
132
                }
133
        }
134
 
4 tom 135
        linePoints.append(QPoint(x, y));
136
 
1 muzer 137
        if (dead)
138
        {
139
                show = false;
140
                isReady = true;
141
                hadGo = false;
142
                dead = false;
143
        }
144
 
145
        if (!dead)
146
        {
147
                socket->write("G\n");
148
                socket->flush();
149
 
150
                hadGo = false;
7 tom 151
                if (!socket->waitForReadyRead(2000))
1 muzer 152
                {
153
                        socket->disconnectFromHost();
154
                        dead = true;
155
                }
156
                if (!hadGo)
157
                {
158
                        socket->disconnectFromHost();
159
                        dead = true;
160
                }
161
        }
4 tom 162
        hasHadGo = true;
1 muzer 163
}
164
 
8 tom 165
bool Bike::hasCollided()
166
{
167
        // Do collision detection here
168
        // use linePoints
169
 
170
        return false;
171
}
172
 
1 muzer 173
void Bike::reset()
174
{
175
        x = rand() % 800;
176
        y = rand() % 600;
177
        linePoints.clear();
178
 
179
        linePoints.append(QPoint(x, y));
180
 
181
        velocity = 1;
182
        angle = 0;
183
        show = true;
184
        isReady = true;
185
        hadGo = false;
186
        dead = false;
8 tom 187
        collided = false;
1 muzer 188
 
189
        socket->write("RESET\n");
190
}
191
 
192
void Bike::readyRead()
193
{
194
        while (socket->canReadLine())
195
        {
196
                QByteArray data = socket->readLine();
197
                QString line = data.trimmed();
198
 
199
                if (line == "L")
200
                {
201
                        angle -= 90;
202
 
203
                        if (angle >= 360)
204
                        {
205
                                angle -= 360;
206
                        }
207
                        if (angle < 0)
208
                        {
209
                                angle += 360;
210
                        }
211
                        hadGo = true;
212
                }
213
                else if (line == "R")
214
                {
215
                        angle += 90;
216
 
217
                        if (angle >= 360)
218
                        {
219
                                angle -= 360;
220
                        }
221
                        if (angle < 0)
222
                        {
223
                                angle += 360;
224
                        }
225
                        hadGo = true;
226
                }
227
                else if (line == "A")
228
                {
229
                        velocity += 0.1;
230
                        hadGo = true;
231
                }
232
                else if (line == "D")
233
                {
234
                        velocity -= 0.2;
235
                        hadGo = true;
236
                }
237
                else if (line == "N")
238
                {
239
                        hadGo = true;
240
                }
241
                else if (line.startsWith("NAME "))
242
                {
243
                        name = line.remove(0, 5);
244
                        isReady = true;
245
                        show = true;
246
                }
247
                else if (line.startsWith("COLOUR "))
248
                {
249
                        QStringList list = line.split(" ");
250
                        if (list.count() >= 2)
251
                        {
252
                                colour.setRed(list[1].toInt());
253
                        }
7 tom 254
                        if (list.count() >= 3)
1 muzer 255
                        {
256
                                colour.setGreen(list[2].toInt());
257
                        }
7 tom 258
                        if (list.count() >= 4)
1 muzer 259
                        {
260
                                colour.setBlue(list[3].toInt());
261
                        }
262
                }
263
        }
264
}
265
 
266
void Bike::disconnected()
267
{
268
        dead = true;
269
        isDisconnected = true;
270
        cout << ":: Disconnected: " << socket->peerAddress().toString().toStdString() << endl;
271
}