Subversion Repositories QTron

Rev

Rev 4 | Go to most recent revision | Details | 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
        linePoints.append(QPoint(x, y));
17
 
18
        velocity = 1;
19
        angle = 0;
20
        name = "";
21
        show = false;
22
        isReady = false;
23
        hadGo = false;
24
        dead = false;
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
 
64
                if (angle == 0)
65
                {
66
                        y -= velocity;
67
                }
68
                else if (angle == 90)
69
                {
70
                        x += velocity;
71
                }
72
                else if (angle == 180)
73
                {
74
                        y += velocity;
75
                }
76
                else if (angle == 270)
77
                {
78
                        x -= velocity;
79
                }
80
 
81
                if (angle == 0 || angle == 180)
82
                {
83
                        painter->fillRect(x - 5, y - 15, 10, 30, colour);
84
                }
85
                else
86
                {
87
                        painter->fillRect(x - 15, y - 5, 30, 10, colour);
88
                }
89
 
90
                painter->drawText(x, y - 20, name);
91
        }
92
}
93
 
94
void Bike::run(QList<Bike *> bikes)
95
{
96
        for (int i = 0; i < bikes.count(); i++)
97
        {
98
                Bike *bike = bikes[i];
99
                if (bike->isReady && bike->show)
100
                {
101
                        if (bike->dead)
102
                        {
103
                                socket->write("DEAD ");
104
                                socket->write(bike->name.toAscii());
105
                                socket->write("\n");
106
                        }
107
                        else
108
                        {
109
                                socket->write("BIKE ");
110
                                socket->write(bike->name.toAscii());
111
                                socket->write(" ");
112
                                socket->write(QString::number(bike->x).toAscii());
113
                                socket->write(" ");
114
                                socket->write(QString::number(bike->y).toAscii());
115
                                socket->write("\n");
116
                        }
117
                }
118
        }
119
 
120
        if (dead)
121
        {
122
                show = false;
123
                isReady = true;
124
                hadGo = false;
125
                dead = false;
126
        }
127
 
128
        if (!dead)
129
        {
130
                socket->write("G\n");
131
                socket->flush();
132
 
133
                hadGo = false;
134
                if (!socket->waitForReadyRead(2000))
135
                {
136
                        socket->disconnectFromHost();
137
                        dead = true;
138
                }
139
                if (!hadGo)
140
                {
141
                        socket->disconnectFromHost();
142
                        dead = true;
143
                }
144
        }
145
        hasHadGo = true;
146
}
147
 
148
void Bike::reset()
149
{
150
        x = rand() % 800;
151
        y = rand() % 600;
152
        linePoints.clear();
153
 
154
        linePoints.append(QPoint(x, y));
155
        linePoints.append(QPoint(x, y));
156
 
157
        velocity = 1;
158
        angle = 0;
159
        show = true;
160
        isReady = true;
161
        hadGo = false;
162
        dead = false;
163
 
164
        socket->write("RESET\n");
165
}
166
 
167
void Bike::readyRead()
168
{
169
        while (socket->canReadLine())
170
        {
171
                QByteArray data = socket->readLine();
172
                QString line = data.trimmed();
173
 
174
                if (line == "L")
175
                {
176
                        linePoints.append(QPoint(x, y));
177
                        angle -= 90;
178
 
179
                        if (angle >= 360)
180
                        {
181
                                angle -= 360;
182
                        }
183
                        if (angle < 0)
184
                        {
185
                                angle += 360;
186
                        }
187
                        hadGo = true;
188
                }
189
                else if (line == "R")
190
                {
191
                        linePoints.append(QPoint(x, y));
192
                        angle += 90;
193
 
194
                        if (angle >= 360)
195
                        {
196
                                angle -= 360;
197
                        }
198
                        if (angle < 0)
199
                        {
200
                                angle += 360;
201
                        }
202
                        hadGo = true;
203
                }
204
                else if (line == "A")
205
                {
206
                        linePoints[linePoints.size() - 1] = QPoint(x, y);
207
                        velocity += 0.1;
208
                        hadGo = true;
209
                }
210
                else if (line == "D")
211
                {
212
                        linePoints[linePoints.size() - 1] = QPoint(x, y);
213
                        velocity -= 0.2;
214
                        hadGo = true;
215
                }
216
                else if (line == "N")
217
                {
218
                        linePoints[linePoints.size() - 1] = QPoint(x, y);
219
                        hadGo = true;
220
                }
221
                else if (line.startsWith("NAME "))
222
                {
223
                        name = line.remove(0, 5);
224
                        isReady = true;
225
                        show = true;
226
                }
227
                else if (line.startsWith("COLOUR "))
228
                {
229
                        QStringList list = line.split(" ");
230
                        if (list.count() >= 2)
231
                        {
232
                                colour.setRed(list[1].toInt());
233
                        }
234
                        else if (list.count() >= 3)
235
                        {
236
                                colour.setGreen(list[2].toInt());
237
                        }
238
                        else if (list.count() >= 4)
239
                        {
240
                                colour.setBlue(list[3].toInt());
241
                        }
242
                }
243
        }
244
}
245
 
246
void Bike::disconnected()
247
{
248
        dead = true;
249
        isDisconnected = true;
250
        cout << ":: Disconnected: " << socket->peerAddress().toString().toStdString() << endl;
251
}