Subversion Repositories QTron

Rev

Rev 1 | Rev 5 | 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;
24
 
25
        colour.setBlue(0);
26
        colour.setRed(0);
27
        colour.setGreen(0);
28
 
29
        if (!socket->waitForReadyRead(2000))
30
        {
31
                socket->disconnectFromHost();
32
                show = false;
33
                isReady = true;
34
                hadGo = false;
35
        }
36
}
37
 
38
void Bike::draw(QPainter *painter)
39
{
40
        if (show)
41
        {
42
                painter->setPen(colour);
43
                painter->setFont(QFont("sans", 12));
44
 
45
                for (int i = 0; i < linePoints.count(); i++)
46
                {
47
                        QPoint point1;
48
                        QPoint point2;
49
                        if (i == 0)
50
                        {
51
                                point1 = linePoints[0];
52
                        }
53
                        else
54
                        {
55
                                point1 = linePoints[i - 1];
56
                        }
57
 
58
                        point2 = linePoints[i];
59
 
60
                        painter->drawLine(point1, point2);
61
                }
62
 
63
                if (angle == 0)
64
                {
65
                        y -= velocity;
66
                }
67
                else if (angle == 90)
68
                {
69
                        x += velocity;
70
                }
71
                else if (angle == 180)
72
                {
73
                        y += velocity;
74
                }
75
                else if (angle == 270)
76
                {
77
                        x -= velocity;
78
                }
79
 
80
                if (angle == 0 || angle == 180)
81
                {
82
                        painter->fillRect(x - 5, y - 15, 10, 30, colour);
83
                }
84
                else
85
                {
86
                        painter->fillRect(x - 15, y - 5, 30, 10, colour);
87
                }
88
 
89
                painter->drawText(x, y - 20, name);
90
        }
91
}
92
 
93
void Bike::run(QList<Bike *> bikes)
94
{
95
        for (int i = 0; i < bikes.count(); i++)
96
        {
97
                Bike *bike = bikes[i];
98
                if (bike->isReady && bike->show)
99
                {
100
                        if (bike->dead)
101
                        {
102
                                socket->write("DEAD ");
103
                                socket->write(bike->name.toAscii());
104
                                socket->write("\n");
105
                        }
106
                        else
107
                        {
108
                                socket->write("BIKE ");
109
                                socket->write(bike->name.toAscii());
110
                                socket->write(" ");
111
                                socket->write(QString::number(bike->x).toAscii());
112
                                socket->write(" ");
113
                                socket->write(QString::number(bike->y).toAscii());
114
                                socket->write("\n");
115
                        }
116
                }
117
        }
118
 
4 tom 119
        linePoints.append(QPoint(x, y));
120
 
1 muzer 121
        if (dead)
122
        {
123
                show = false;
124
                isReady = true;
125
                hadGo = false;
126
                dead = false;
127
        }
128
 
129
        if (!dead)
130
        {
131
                socket->write("G\n");
132
                socket->flush();
133
 
134
                hadGo = false;
135
                if (!socket->waitForReadyRead(2000))
136
                {
137
                        socket->disconnectFromHost();
138
                        dead = true;
139
                }
140
                if (!hadGo)
141
                {
142
                        socket->disconnectFromHost();
143
                        dead = true;
144
                }
145
        }
4 tom 146
        hasHadGo = true;
1 muzer 147
}
148
 
149
void Bike::reset()
150
{
151
        x = rand() % 800;
152
        y = rand() % 600;
153
        linePoints.clear();
154
 
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
                        angle -= 90;
177
 
178
                        if (angle >= 360)
179
                        {
180
                                angle -= 360;
181
                        }
182
                        if (angle < 0)
183
                        {
184
                                angle += 360;
185
                        }
186
                        hadGo = true;
187
                }
188
                else if (line == "R")
189
                {
190
                        angle += 90;
191
 
192
                        if (angle >= 360)
193
                        {
194
                                angle -= 360;
195
                        }
196
                        if (angle < 0)
197
                        {
198
                                angle += 360;
199
                        }
200
                        hadGo = true;
201
                }
202
                else if (line == "A")
203
                {
204
                        velocity += 0.1;
205
                        hadGo = true;
206
                }
207
                else if (line == "D")
208
                {
209
                        velocity -= 0.2;
210
                        hadGo = true;
211
                }
212
                else if (line == "N")
213
                {
214
                        hadGo = true;
215
                }
216
                else if (line.startsWith("NAME "))
217
                {
218
                        name = line.remove(0, 5);
219
                        isReady = true;
220
                        show = true;
221
                }
222
                else if (line.startsWith("COLOUR "))
223
                {
224
                        QStringList list = line.split(" ");
225
                        if (list.count() >= 2)
226
                        {
227
                                colour.setRed(list[1].toInt());
228
                        }
229
                        else if (list.count() >= 3)
230
                        {
231
                                colour.setGreen(list[2].toInt());
232
                        }
233
                        else if (list.count() >= 4)
234
                        {
235
                                colour.setBlue(list[3].toInt());
236
                        }
237
                }
238
        }
239
}
240
 
241
void Bike::disconnected()
242
{
243
        dead = true;
244
        isDisconnected = true;
245
        cout << ":: Disconnected: " << socket->peerAddress().toString().toStdString() << endl;
246
}