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
|
#include "common.h"
#include "functions.h"
#include "text.h"
/* --- Variables --- */
Window w = {.mode = {450, 520, 32}};
Game game = {.isStarted = 0, .scoreCurrent = 0, .level = 1};
List *texts;
sfFont *fontScore;
Shape active, next;
Field fld;
uint8_t arrKeys = 0b00000000; // Arrow keys states byte container
/* --- Variables End --- */
sfClock *gameTick;
sfClock *mTick;
sfClock *repPushDown; // Clock for repeat latency when Down arrow long push
sfClock *repKeyLeft; // Clock for repeat latency when Left arrow long push
sfClock *repKeyRight; // Clock for repeat latency when Left arrow long push
void prepare() {
srand( time(NULL) );
gameTick = sfClock_create();
mTick = sfClock_create();
fontScore = sfFont_createFromFile("dat/arial.ttf");
if (!fontScore) {
printf("dat/arial.ttf font load failed");
exit(-1);
}
/*
* Dimensions of every fld's cell
* 23px - fill color 1px - for outline, 25 - at all
*/
fld.cSize = (sfVector2f){.x = 23, .y = 23}; //Fld's cell size in pixels
fld.cOutThick = 1;
fld.pos = (sfVector2i){.x = 10, .y = 10+500-24}; // Fld bot left corner
fld.size = (sfVector2i){.x = 10, .y = 25}; // Field's size in blocks
next = (Shape){.x = 250+10+20, .y = 200,
.cSize = {.x = 23, .y = 23}};
initFld();
texts = ListOfText_getFromListOfKeyMapOfString(ListOfKeyMapOfString_getFromYaml("dat/ya.yaml"));
w.window = sfRenderWindow_create(w.mode,
windowName_conf,
sfResize | sfClose,
NULL);
if (!w.window)
exit(EXIT_FAILURE);
}
void handleWindowEvents() {
while (sfRenderWindow_pollEvent(w.window, &w.event))
if (w.event.type == sfEvtClosed)
sfRenderWindow_close(w.window);
}
void drawTextsAtScene(List *texts, char *scene, sfRenderWindow *window) {
List *t = texts;
while (t) {
if (!strcmp(((Text *)t->obj)->scene, scene))
sfRenderWindow_drawText(window, ((Text *)t->obj)->sfText, NULL);
t = t->next;
}
}
void gameLoop() {
tTick();
tKeyCtrl();
valueAfterTextDisplay(game.scoreCurrent, texts, "score");
valueAfterTextDisplay(game.level, texts, "level");
colorizeFld();
colorizeActive();
drawFld(w.window);
drawNextShape(w.window);
drawTextsAtScene(texts, "game", w.window);
}
void menuTick()
{
if(sfClock_getElapsedTime(mTick).microseconds >= basicLatency/game.level) {
sfClock_restart(mTick);
colorizeRandom(&fld);
}
}
void menuLoop() {
menuTick();
drawFld(w.window);
drawTextsAtScene(texts, "menu", w.window);
if (sfKeyboard_isKeyPressed(sfKeyS) == 1) {
game.isStarted = 1;
freeFld();
initFld();
}
}
void mainLoop() {
while (sfRenderWindow_isOpen(w.window)) {
handleWindowEvents();
sfRenderWindow_clear(w.window, sfBlack);
if (game.isStarted) {
gameLoop();
} else {
menuLoop();
}
sfRenderWindow_display(w.window);
}
}
int main()
{
prepare();
colorizeRandom(&fld);
mainLoop();
/* Just senseless printf */
printf("%d\n", game.scoreCurrent);
freeFld();
sfRenderWindow_destroy(w.window);
ListOfText_free(&texts);
return EXIT_SUCCESS;
}
|