-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSicily.cpp
346 lines (277 loc) · 8.9 KB
/
Sicily.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
#include "Sicily.h"
#include "ui_Sicily.h"
//暂时只能这样咯,置底~
#define WINDOW_FLAG_TOPHINT Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint|Qt::SubWindow
#define WINDOW_FLAG_NORMAL Qt::FramelessWindowHint|Qt::WindowStaysOnBottomHint|Qt::SubWindow
Sicily::Sicily(QWidget *parent):QMainWindow(parent,WINDOW_FLAG_TOPHINT),ui(new Ui::Sicily){//,sharedMem("ThisisSicily"){
this->setAttribute(Qt::WA_TranslucentBackground);
InitData();
ui->setupUi(this);
ReadResource();
chatbox = new ChatBox(this);
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timerUpDate()));
timer->start(25);//FPS 40
ReadModules();
SwitchHint(true);
this->update();
}
Sicily::~Sicily(){
//chatbox和timer在关闭父窗体时会被析构
delete ui;
}
//初始化
void Sicily::ReadResource(){
QPixmap pix = QPixmap(GetFileDir("Pic\\sicily.png"));
sbody = pix.copy(0,0,300,450);
for (int i = 0; i < 3; i++)
sface[i] = pix.copy(300 * (i + 1), 0, 300, 450);
wings[0] = QPixmap(GetFileDir("Pic\\leftWing.png"));
wings[1] = QPixmap(GetFileDir("Pic\\rightWing.png"));
ui->sicily->setPixmap(sbody);
ui->sicily->move(sicilyPosX,sicilyPosY);
ui->eye->setPixmap(sface[0]);
ui->eye->move(sicilyPosX,sicilyPosY);
this->setMinimumSize(217,435);
this->setMaximumSize(217,435);
}
void Sicily::ReadModules(){
haveError = false;
receiver = new QUdpSocket(this);
receiver->bind(QHostAddress::LocalHost,SICILY_PORT);
connect(receiver,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));
}
void Sicily::InitData(){
QDesktopWidget *desktopWidgt = QApplication::desktop();
QRect deskRect = desktopWidgt->availableGeometry();
deskWidth = deskRect.width();
deskHeight = deskRect.height();
//这样分配窗口吧,先分配Sicily酱的位置 450*300
this->move(deskWidth - 300 - sicilyPosX,deskHeight - 450 - sicilyPosY);
lastTime = time(0);
playTime = 0;
LoadData();
ox = (this->pos()).x();
oy = (this->pos()).y();
dragTime = GetClock();
wingID = 0;
//提前计算
for (int i = 0;i < 360 * 6;++i){
wingCos[i] = cos(i / 6.0) * 12 + 8;
}
sleeped = false;
}
void Sicily::readPendingDatagrams(){
//格式:文本 + Life(1 byte) + '\0'
//好像不会接收到\0
while (receiver->hasPendingDatagrams()){
QByteArray datagram;
datagram.resize(receiver->pendingDatagramSize());
receiver->readDatagram(datagram.data(),datagram.size());
int life = int(datagram.data()[datagram.size() - 1]);
datagram[datagram.size() - 1] = '\0';
SicilySay(datagram.data(),life);
}
}
void Sicily::UpdateAnimation(){
//FPS:40
static int frame = 0;
static int osid = 0;
frame++;
int sid = 0;
const int eyeBasicTime = 40 * (60.0 / 16);
static int eyeTime = eyeBasicTime;
if(sleeped)sid = 2;
else{
if(frame > eyeTime + 6){
frame = 0;
eyeTime = eyeBasicTime + rand()%60;
}else{
if(frame > eyeTime + 3)sid=2;
else if(frame > eyeTime)sid=1;
}
}
if (osid != sid){
ui->eye->setPixmap(sface[sid]);
osid = sid;
}
wingID += 1;
if(wingID >= 360 * 6)
wingID = 0;
this->update();
}
void Sicily::UpdateButton(){
static int lastSleepTime = 0,lastWakeTime = 0;
if(!sleeped && actionList.match("122")){
//左右右
sleeped = true;
//cancover = true;
sleepTime = time(0);
//发现未满15分钟的处理方法,两分钟之内才可挽救
if(sleepTime - lastWakeTime <= 2 * 60){
sleepTime = lastSleepTime;
}
actionList.clear();
}
//top or bottom
if (actionList.match("22")){
static bool topHint = true;
topHint = !topHint;
SwitchHint(topHint);
actionList.clear();
}
if(sleeped && actionList.size() > 0){
//醒来了
//警示:startTime = lastWakeTime - playTime;//伪造时间[=]很好看嘛 (一个错误的做法)
//违背真理只能适得其反
lastWakeTime = time(0);
lastSleepTime = sleepTime;
lastTime = sleepTime;
int es = (15 * 60 - (lastWakeTime - lastTime))/60;
if (es < 0){
SicilySay("什么都没有嘛( ◕ω ◕ )",3);
}else{
char temp[128];
sprintf(temp,"还有%d分钟哦 ● ﹏ ●",es);
SicilySay(temp,3);
}
sleeped = false;
actionList.clear();
}
//触摸板三次切换延时在300以内,鼠标200
//notice: clock() is different between Ubuntu and Windows!
//clock()/ CLOCKS_PER_SEC
actionList.update(GetClock());
int escapeTime = time(0) - lastTime;
const int step = 30;
if(escapeTime >= step){
/* 注明各个变量的意思
* LastTime指上次更新的时间
* escapeTime指与上次更新的间隔时间
* 这意味着睡眠状态是LastTime会很大
*/
lastTime = time(0);
if(!sleeped)
playTime += step;//1
static int nextSaveTime = 10 * 60;
if(escapeTime > 15 * 60){
//超过15分钟没有刷新,说明关机了!
playTime = 0;
nextSaveTime = 10 * 60;
SaveData();
this->update();
}
if(!sleeped){
if(playTime > nextSaveTime){
SaveData();
nextSaveTime += 10 * 60;
}
if(playTime >= 40*60){
SwitchHint(true);
SicilySay("你已经玩很久了呢!\n休息一下吧");
}
}else{
SicilySay("呼呼 ●ω●");
}
//互动
//取消出错显示
/*
if(haveError){
SicilySay(errorMsg,5);
}
*/
}
}
void Sicily::timerUpDate(){
//UpdateChatBox();
UpdateAnimation();
UpdateButton();
chatbox->Update();
}
void Sicily::SicilySay(string text, int time){
chatbox->Say(text,time);
}
void Sicily::SaveData(){
ofstream fout(GetStdFileDir("Data\\data.tmp").c_str());
fout<<playTime<<" "<<lastTime;
fout.close();
}
void Sicily::LoadData(){
ifstream fin(GetStdFileDir("Data\\data.tmp").c_str());
if(fin){
fin>>playTime>>lastTime;
}
fin.close();
}
void Sicily::Restart(){
SaveData();
this->hide();
QProcess::startDetached(qApp->applicationFilePath(), QStringList());
exit('r'+'e'+'s'+'t'+'a'+'r'+'t');
}
void Sicily::SwitchHint(bool top){
static bool last = true;
if(last == top)return;
last = top;
this->hide();
//chatbox->hide();
if(top){
this->setWindowFlags(WINDOW_FLAG_TOPHINT);
//chatbox->setWindowFlags(WINDOW_FLAG_TOPHINT);
//chatbox->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
}else{
this->setWindowFlags(WINDOW_FLAG_NORMAL);
//chatbox->setWindowFlags(WINDOW_FLAG_NORMAL);
//chatbox->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnBottomHint);
}
//chatbox->show();
this->show();
}
void Sicily::mousePressEvent(QMouseEvent *event){
dragPosition=event->globalPos() -frameGeometry().topLeft();
ox = (this->pos()).x();
oy = (this->pos()).y();
int nowTime = GetClock();
dragTime = nowTime;
if(event->button()==Qt::LeftButton){
actionList.push('1',nowTime);
event->accept();
}
else if(event->button()==Qt::RightButton || event->button()==Qt::MiddleButton){
actionList.push('2',nowTime);
char str[256];
sprintf(str,"已经玩%d分钟了哦 >.<",playTime / 60);
SicilySay(str,1);
event->accept();
}
}
void Sicily::mouseReleaseEvent(QMouseEvent * /*event*/){
/*
if(event->button() == Qt::LeftButton){
event->accept();
}
*/
}
void Sicily::mouseMoveEvent(QMouseEvent *event){
move(event->globalPos()-dragPosition);
event->accept();
}
void Sicily::paintEvent(QPaintEvent *){
QPainter painter;
painter.begin(this);
float leftAngle,rightAngle;
//原来是ID/2
leftAngle = wingCos[wingID];//cos(wingID / 6.0) * 12 + 8;
rightAngle = -leftAngle;
//left
painter.translate(167+sicilyPosX,186+sicilyPosY);
painter.rotate(leftAngle);
painter.translate(-167-sicilyPosX,-186-sicilyPosY);
painter.drawPixmap(-3+sicilyPosX,sicilyPosY,wings[0]);
painter.resetMatrix();
painter.translate(113+sicilyPosX,183+sicilyPosY);
painter.rotate(rightAngle);
painter.translate(-113-sicilyPosX,-183-sicilyPosY);
painter.drawPixmap(3+sicilyPosX,sicilyPosY,wings[1]);
painter.end();
}