Snapple
Memuat...
Mencari...
Tidak Ditemukan
scene_game.hpp
Ke dokumentasi file ini.
1#include "../prelude.hpp"
3#include "../cfg.hpp"
4#include <cstdint>
5#include <optional>
6
7#define LIVES 3
8#define SNAKE_INITIAL_LENGTH 50 - 1 // gak termasuk kepala
9#define SNAKE_UNIT_LENGTH 5 // banyak panjang untuk ditambah ketika makan angka
10 // haha makan angka huh ..
11#define TILE_ROWS 17
12#define TILE_COLUMNS 32
13#define TILE_DIMENSION 60 // sisi segiempat, dalam piksel
14
15using std::pair, std::optional, std::nullopt;
16
17// Arah
24
25// Jenis soal yang dikerjakan
34
41
48
49// Dapatkan makanan berdasarkan kesulitan.
50Food get_food(Difficulty difficulty);
51// Dapatkan banyak poin berdasarkan makanan yang dimakan.
52long long get_pts(Food food);
53
54// Koordinat (dalam tile, bukan piksel)
55struct TileCoord {
56 int row;
57 int col;
58
61 // Ubah lokasi ke vector 2 dimensi Raylib, tetapi buat lokasinya menjadi di
62 // tengah dari tile.
63 raylib::Vector2 to_vector2_center();
64 // Ubah lokasi ke vector 2 dimensi Raylib.
65 raylib::Vector2 to_vector2();
66};
67
69 Texture2D texture;
70 const uint fps = 13;
71 const GameComponents::Coordinate pos = {790, 185};
72 static const size_t n_frames = 17;
73 const size_t frame_apple_disappear = 7;
74 const char* explosion_sound_file = "assets/explode.mp3";
75 raylib::Sound explosion_sound;
76 const char* frames[n_frames] = {
77 "assets/explosion/0.png",
78 "assets/explosion/1.png",
79 "assets/explosion/2.png",
80 "assets/explosion/3.png",
81 "assets/explosion/4.png",
82 "assets/explosion/5.png",
83 "assets/explosion/6.png",
84 "assets/explosion/7.png",
85 "assets/explosion/8.png",
86 "assets/explosion/9.png",
87 "assets/explosion/10.png",
88 "assets/explosion/11.png",
89 "assets/explosion/12.png",
90 "assets/explosion/13.png",
91 "assets/explosion/14.png",
92 "assets/explosion/15.png",
93 "assets/explosion/16.png",
94 };
95
96 raylib::Texture2D explosion_animation[n_frames];
97
98 double time_per_frame;
99 double last_time;
100 size_t current_frame = 0;
101
102public:
104
105 // Buat suara ledakan.
106 void explode_sound();
107 // Putar ulang.
108 void reset();
109 // Apakah sudah berakhir?
110 bool ended();
111 // Apakah masih perlu menunjukkan apel?
112 bool show_apple();
113 void draw();
114 void update();
115};
116
118private:
119 const int hearts_gaps = TILE_DIMENSION + 15;
120 const Color text_color = WHITE;
121
122 const char* heart_texture_file = "assets/heart.png";
123 raylib::Texture2D heart_texture;
124public:
125 PlayerStats();
126 raylib::Font* game_font; // harus diinisialisasi
127
128 // Sisa nyawa pemain.
129 uint8_t lives = LIVES;
130
131 // TODO: atau ini harusnya ga variabel sendiri, biar kita bisa
132 // player_segments.length() gitu? tapi kayaknya gak optimal kalau gitu karena
133 // variabel ini dibaca setiap update() scene.
135
136 // Skor pemain.
137 long long pts = 0;
138
139 void reset();
140 void turn(Direction direction);
141 void init(raylib::Font* game_font);
142 void draw_lives(raylib::Vector2 pos);
143 void draw_pts(raylib::Vector2 pos);
144 void draw_length(raylib::Vector2 pos);
145};
146
148 // Pertanyaan yang ditampilkan
149 // Kita tidak menyimpan angka-angka aslinya karena tidak penting dan
150 // polymorphism itu ribet.
151 string display;
152
153 // Jawaban-jawaban pertanyaan.
154 // Untuk memudahkan, jawaban benarnya ada di answers[0]. Semua jawaban
155 // di sini berbeda (harus digaransikan ketika generasi pertanyaan).
156 long long answers[3];
157
158 // Tile tile jawaban.
160
161 // Tile tile jawaban (dalam koordinat piksel).
162 raylib::Vector2 coords_pixel[3];
163
164 // Jawaban (dalam string; untuk display);
165 string answers_str[3];
166
167 // Kesulitan (buat variasi poin)
169
170 // Tulis pertanyaannya.
171 void draw_question(raylib::Vector2 pos, raylib::Font* game_font, Color color);
172
173 // Cek tabrakan dengan makanan.
174 optional<Food> check_collision(raylib::Vector2 head_location, float head_radius);
175};
176
181private:
182 // di bawah ini dalam persen semua
183 const uint probability_addsubtr_easy = 30;
184 const uint probability_addsubtr_hard = 30;
185 const uint probability_multdiv_easy = 10;
186 const uint probability_multdiv_hard = 10;
187 // lucu, kenapa ini yang 15% ? 😭
188 const uint probability_powerssqrt_easy = 15;
189 const uint probability_powerssqrt_hard = 5;
190
191 const Color food_color = WHITE;
192 raylib::Font* game_font;
193
194public:
196
197 // Pertanyaan sekarang. Bisa digunakan sebagai pointer untuk object lain.
198 // (Tidak pernah invalid selama kelas ini masih valid).
200
201 void init(raylib::Font* game_font);
202 void reset();
203
204 // Generate sebuah pertanyaan dan simpan ke state `this->q_now`.
206
207 // Gambar jawaban-jawaban
208 void draw_answers();
209};
210
215
217private:
218 // Koordinat komponen-komponen (relatif dengan `this->pos`).
219 const raylib::Vector2 lives_pos = {0, 10};
220 const raylib::Vector2 pts_pos = {330, 3};
221 const raylib::Vector2 question_pos = {815, 3};
222 const raylib::Vector2 snake_length_pos = {1400, 3};
223 const raylib::Vector2 answer_food_tex_pos = {1000, -2};
224
225 const char* apple_texture_file = "assets/apple.png";
226 const char* bad_apple_texture_file = "assets/apple_bad.png";
227 const char* pie_texture_file = "assets/pie.png";
228 const char* golden_pie_texture_file = "assets/golden_pie.png";
229
230 raylib::Texture2D apple_texture;
231 raylib::Texture2D bad_apple_texture;
232 raylib::Texture2D pie_texture;
233 raylib::Texture2D golden_pie_texture;
234
235 const Color math_question_color = ORANGE;
236 const Color math_feedback_color_correct = GREEN;
237 const Color math_feedback_color_wrong = ORANGE;
238
239 // Posisi untuk menyembunyikan statusbar.
240 const float min_statusbar_pos_y = -80;
241
242 // Posisi seharusnya
243 const int pos_y = -5;
244
245 const int vy = 3;
246
247 const char* texture_file = "assets/statusbar.png";
248 raylib::Texture2D texture;
249
250 bool is_falling = false;
251
252 // Pertanyaan sekarang.
253 MathQuestion* math_question;
254
255 raylib::Font* game_font;
256
257public:
258 // Statistik pengguna.
260
261 // Posisi statusbar.
262 raylib::Vector2 pos = {0, 0};
263
264 StatusBar();
265 void reset();
266 void init(raylib::Font* game_font, MathQuestion* math_question, PlayerStats* player_stats);
267
268 // Gambar bar
269 void draw();
270
271 // Tulis statistik ke bar
272 void draw_stats();
273
274 // Tulis pertanyaan matematika ke bar
275 void draw_question();
276
277 // Tulis feedback jawaban ke bar
278 void draw_feedback(Food food);
279 void update();
280
281 // Buat animasi bar jatuh.
282 void fall();
283};
284
285class Player {
286private:
290 const float snake_point_radius = TILE_DIMENSION / 15.0;
291
292 const Color snake_color = Color { .r = 87, .g = 141, .b = 237, .a = 255 };
293 const Color snake_color_pattern = Color { .r = 255, .g = 237, .b = 165, .a = 255 };
294
295 const char* turn_sound_file = "assets/turn.mp3";
296 raylib::Sound turn_sound;
297 raylib::Sound* lose_sound;
298
299 // Titik-titik yang menjadi tubuh ular pengguna (tidak termasuk kepala).
300 vector<Vector2> points;
301
302 // Arah sekarang (a.k.a arah kepala).
303 Direction current_direction;
304
305 // Arah, jika kita perlu berbelok. Kita perlu queue ini karena belokan hanya
306 // dilakukan jika titik tengah dari tekstur
307 optional<Direction> turn_queue;
308
309 // Tekstur untuk kepala ular.
310 const char* texture_snake_head_u = "assets/snake_head_u.png";
311 const char* texture_snake_head_d = "assets/snake_head_d.png";
312 const char* texture_snake_head_l = "assets/snake_head_l.png";
313 const char* texture_snake_head_r = "assets/snake_head_r.png";
314 raylib::Texture2D snake_head_u;
315 raylib::Texture2D snake_head_d;
316 raylib::Texture2D snake_head_l;
317 raylib::Texture2D snake_head_r;
318
319 // Mengembalikan `true` jika kepala (SEKARANG) sedang bertabrakan dengan
320 // titik-titik tubuh lain.
321 bool check_collision_self();
322
323 // Mengembalikan `true` jika kepala (SEKARANG) sedang bertabrakan dengan
324 // dinding.
325 bool check_collision_corners();
326
327 // Cek tabrakan dengan makanan dan tambah poin, panjang ular, dsb. jika ya.
328 void check_collision_food();
329
330 // Posisi awal ular
331 TileCoord initial_pos = {3, TILE_COLUMNS + 1};
332
333 // Bisa dikendalikan atau tidak?
334 // Ini akan dirubah ketika intro ular masuk selesai.
335 void move(); // ular bergerak sebesar v
336
337 // Cek collision atau tidak
338 bool try_check_collision = false;
339
340 bool active = true;
341
342 bool* play_bgmusic;
343
344public:
346
348
349 bool controllable = false;
350
351 void reset();
352
353 // Posisi kepala.
354 raylib::Vector2 head_pos;
355
356 Player();
357 raylib::Vector2 get_head_pos_center();
358 void init(raylib::Sound* lose_sound, bool* play_bgmusic);
359 void create_snake();
360 void check_collision(bool* play_bgmusic);
361 void update();
362 void draw();
363 void unqueue_turn();
364 void add_length();
365};
366
368private:
369 AppleExplosion explosion_animation;
370 const char* dead_crash_wall_file = "assets/dead_crash_wall.png";
371 const char* dead_crash_self_file = "assets/dead_crash_self.png";
372 const char* dead_bad_food_file = "assets/dead_bad_food.png";
373 const char* ground_texture_file = "assets/ground.png";
374 const char* ground_texture_apple_file = "assets/interlude_animation/37.png";
375
376 const char* bad_apple_sound_file = "assets/wrong.mp3";
377 const char* correct_apple_sound_file = "assets/crunch.mp3";
378 const char* heavenly_choir_sound_file = "assets/heavenly-choir.mp3";
379 const char* lose_sound_file = "assets/lose.mp3";
380 raylib::Sound bad_apple_sound;
381 raylib::Sound correct_apple_sound;
382 raylib::Sound heavenly_choir_sound;
383 raylib::Sound lose_sound;
384
385 const size_t dead_popup_dimension_y = 587;
386 const size_t dead_popup_dimension_x = 970;
387
388 size_t dead_popup_y; // Diitung ketika konstruksi kelas
389 size_t dead_popup_x; // Diitung ketika konstruksi kelas
390
391 raylib::Texture2D dead_crash_wall_texture;
392 raylib::Texture2D dead_crash_self_texture;
393 raylib::Texture2D dead_bad_food_texture;
394 raylib::Texture2D ground_texture;
395 raylib::Texture2D ground_texture_apple;
396 bool is_game_started = false;
397 StatusBar status_bar;
398 PlayerStats player_stats;
400 Player player;
401 raylib::Font* game_font;
402 GameComponents::GameStateManager* game_state_manager;
403
404 // Status dari pertanyaan matematika.
405 MathDisplayStatus math_status;
406
407 // Makanan terakhir yang didapat.
408 Food last_food;
409
410 // Callback untuk balik ke main menu game.
411 function<void()> menu_callback;
412
413 bool* play_bgmusic;
414
415public:
416 GameScene();
417 void reset(bool apple_explode);
418 void init(raylib::Font* game_font, GameComponents::GameStateManager* game_state_manager, function<void()> menu_callback, bool* play_bgmusic);
419 void draw();
420 void update();
421 // Cek apakah pemain memakan makanan, lalu tambahkan skor dan panjang tubuh
422 // jika ya sesuai makanan yang dimakan.
423 void food_check();
424};
Definition scene_game.hpp:68
bool ended()
Definition scene_game.cpp:105
AppleExplosion()
Definition scene_game.cpp:83
void update()
Definition scene_game.cpp:113
void draw()
Definition scene_game.cpp:100
void explode_sound()
Definition scene_game.cpp:109
void reset()
Definition scene_game.cpp:92
bool show_apple()
Definition scene_game.cpp:96
Definition components.hpp:146
Definition components.hpp:42
void food_check()
Definition scene_game.cpp:715
void reset(bool apple_explode)
Definition scene_game.cpp:690
void update()
Definition scene_game.cpp:750
GameScene()
Definition scene_game.cpp:676
void draw()
Definition scene_game.cpp:783
void init(raylib::Font *game_font, GameComponents::GameStateManager *game_state_manager, function< void()> menu_callback, bool *play_bgmusic)
Definition scene_game.cpp:704
Definition scene_game.hpp:180
void reset()
Definition scene_game.cpp:173
void init(raylib::Font *game_font)
Definition scene_game.cpp:168
MathQuestionDisplay()
Definition scene_game.cpp:165
MathQuestion q_now
Definition scene_game.hpp:199
void draw_answers()
Definition scene_game.cpp:418
void generate_new_question()
Definition scene_game.cpp:178
Definition scene_game.hpp:117
void draw_pts(raylib::Vector2 pos)
Definition scene_game.cpp:149
void turn(Direction direction)
long long pts
Definition scene_game.hpp:137
void draw_lives(raylib::Vector2 pos)
Definition scene_game.cpp:137
uint8_t lives
Definition scene_game.hpp:129
void reset()
Definition scene_game.cpp:126
PlayerStats()
Definition scene_game.cpp:122
raylib::Font * game_font
Definition scene_game.hpp:126
uint length
Definition scene_game.hpp:134
void draw_length(raylib::Vector2 pos)
Definition scene_game.cpp:145
void init(raylib::Font *game_font)
Definition scene_game.cpp:132
Definition scene_game.hpp:285
void create_snake()
Definition scene_game.cpp:511
void reset()
Definition scene_game.cpp:505
const float snake_body_radius
Definition scene_game.hpp:347
void init(raylib::Sound *lose_sound, bool *play_bgmusic)
Definition scene_game.cpp:596
raylib::Vector2 head_pos
Definition scene_game.hpp:354
void add_length()
Definition scene_game.cpp:528
void check_collision(bool *play_bgmusic)
Definition scene_game.cpp:581
GameOver game_over
Definition scene_game.hpp:345
void update()
Definition scene_game.cpp:613
void unqueue_turn()
Definition scene_game.cpp:601
void draw()
Definition scene_game.cpp:648
raylib::Vector2 get_head_pos_center()
Definition scene_game.cpp:563
bool controllable
Definition scene_game.hpp:349
Player()
Definition scene_game.cpp:496
Definition scene_game.hpp:216
raylib::Vector2 pos
Definition scene_game.hpp:262
void draw()
Definition scene_game.cpp:448
StatusBar()
Definition scene_game.cpp:424
void draw_stats()
Definition scene_game.cpp:452
void draw_feedback(Food food)
Definition scene_game.cpp:462
void reset()
Definition scene_game.cpp:432
void draw_question()
Definition scene_game.cpp:458
PlayerStats * player_stats
Definition scene_game.hpp:259
void update()
Definition scene_game.cpp:489
void fall()
Definition scene_game.cpp:436
void init(raylib::Font *game_font, MathQuestion *math_question, PlayerStats *player_stats)
Definition scene_game.cpp:441
#define SNAKE_INITIAL_LENGTH
Definition scene_game.hpp:8
Direction
Definition scene_game.hpp:18
@ DOWN
Definition scene_game.hpp:20
@ UP
Definition scene_game.hpp:19
@ LEFT
Definition scene_game.hpp:21
@ RIGHT
Definition scene_game.hpp:22
Difficulty
Definition scene_game.hpp:26
@ ADD_SUB_HARD
Definition scene_game.hpp:28
@ ADD_SUB_EASY
Definition scene_game.hpp:27
@ MULT_DIV_HARD
Definition scene_game.hpp:30
@ POW_SQRT_EASY
Definition scene_game.hpp:31
@ MULT_DIV_EASY
Definition scene_game.hpp:29
@ POW_SQRT_HARD
Definition scene_game.hpp:32
#define TILE_DIMENSION
Definition scene_game.hpp:13
GameOver
Definition scene_game.hpp:42
@ CRASH_WALL
Definition scene_game.hpp:44
@ CRASH_SELF
Definition scene_game.hpp:45
@ FALSE
Definition scene_game.hpp:43
@ BAD_FOOD
Definition scene_game.hpp:46
Food get_food(Difficulty difficulty)
Definition scene_game.cpp:16
Food
Definition scene_game.hpp:35
@ APPLE_PIE
Definition scene_game.hpp:38
@ APPLE
Definition scene_game.hpp:37
@ GOLDEN_APPLE_PIE
Definition scene_game.hpp:39
@ BAD_APPLE
Definition scene_game.hpp:36
long long get_pts(Food food)
Definition scene_game.cpp:38
MathDisplayStatus
Definition scene_game.hpp:211
@ FEEDBACK
Definition scene_game.hpp:213
@ QUESTION
Definition scene_game.hpp:212
#define LIVES
Definition scene_game.hpp:7
#define TILE_COLUMNS
Definition scene_game.hpp:12
#define SNAKE_UNIT_LENGTH
Definition scene_game.hpp:9
Definition components.hpp:160
Definition scene_game.hpp:147
TileCoord coords[3]
Definition scene_game.hpp:159
string answers_str[3]
Definition scene_game.hpp:165
raylib::Vector2 coords_pixel[3]
Definition scene_game.hpp:162
void draw_question(raylib::Vector2 pos, raylib::Font *game_font, Color color)
Definition scene_game.cpp:153
optional< Food > check_collision(raylib::Vector2 head_location, float head_radius)
Definition scene_game.cpp:157
Difficulty difficulty
Definition scene_game.hpp:168
long long answers[3]
Definition scene_game.hpp:156
string display
Definition scene_game.hpp:151
Definition scene_game.hpp:55
GameComponents::Coordinate to_coord()
Definition scene_game.cpp:63
raylib::Vector2 to_vector2_center()
Definition scene_game.cpp:75
GameComponents::Coordinate to_coord_center()
Definition scene_game.cpp:67
int col
Definition scene_game.hpp:57
raylib::Vector2 to_vector2()
Definition scene_game.cpp:71
int row
Definition scene_game.hpp:56