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
25
36
45
54
57Food get_food(Difficulty difficulty);
58
61long long get_pts(Food food);
62
65struct TileCoord {
66 int row;
67 int col;
68
74 raylib::Vector2 to_vector2_center();
75
78 raylib::Vector2 to_vector2();
79};
80
82 Texture2D texture;
83 const uint fps = 13;
84 const GameComponents::Coordinate pos = {790, 185};
85 static const size_t n_frames = 17;
86 const size_t frame_apple_disappear = 7;
87 const char* explosion_sound_file = "assets/explode.mp3";
88 raylib::Sound explosion_sound;
89 const char* frames[n_frames] = {
90 "assets/explosion/0.png",
91 "assets/explosion/1.png",
92 "assets/explosion/2.png",
93 "assets/explosion/3.png",
94 "assets/explosion/4.png",
95 "assets/explosion/5.png",
96 "assets/explosion/6.png",
97 "assets/explosion/7.png",
98 "assets/explosion/8.png",
99 "assets/explosion/9.png",
100 "assets/explosion/10.png",
101 "assets/explosion/11.png",
102 "assets/explosion/12.png",
103 "assets/explosion/13.png",
104 "assets/explosion/14.png",
105 "assets/explosion/15.png",
106 "assets/explosion/16.png",
107 };
108
109 raylib::Texture2D explosion_animation[n_frames];
110
111 double time_per_frame;
112 double last_time;
113 size_t current_frame = 0;
114
115public:
117
120 void explode_sound();
123 void reset();
126 bool ended();
129 bool show_apple();
130 void draw();
131 void update();
132};
133
135private:
136 const int hearts_gaps = TILE_DIMENSION + 15;
137 const Color text_color = WHITE;
138
139 const char* heart_texture_file = "assets/heart.png";
140 raylib::Texture2D heart_texture;
141public:
142 PlayerStats();
143 raylib::Font* game_font; // harus diinisialisasi
144
147 uint8_t lives = LIVES;
148
149 // TODO: atau ini harusnya ga variabel sendiri, biar kita bisa
150 // player_segments.length() gitu? tapi kayaknya gak optimal kalau gitu karena
151 // variabel ini dibaca setiap update() scene.
153
156 long long pts = 0;
157
158 void reset();
159 void turn(Direction direction);
160 void init(raylib::Font* game_font);
161 void draw_lives(raylib::Vector2 pos);
162 void draw_pts(raylib::Vector2 pos);
163 void draw_length(raylib::Vector2 pos);
164};
165
171 string display;
172
177 long long answers[3];
178
182
185 raylib::Vector2 coords_pixel[3];
186
189 string answers_str[3];
190
194
197 void draw_question(raylib::Vector2 pos, raylib::Font* game_font, Color color);
198
201 optional<Food> check_collision(raylib::Vector2 head_location, float head_radius);
202};
203
208private:
209 // di bawah ini dalam persen semua
210 const uint probability_addsubtr_easy = 30;
211 const uint probability_addsubtr_hard = 30;
212 const uint probability_multdiv_easy = 10;
213 const uint probability_multdiv_hard = 10;
214 // lucu, kenapa ini yang 15% ? 😭
215 const uint probability_powerssqrt_easy = 15;
216 const uint probability_powerssqrt_hard = 5;
217
218 const Color food_color = WHITE;
219 raylib::Font* game_font;
220
221public:
223
228
229 void init(raylib::Font* game_font);
230 void reset();
231
235
238 void draw_answers();
239};
240
245
247private:
248 // Koordinat komponen-komponen (relatif dengan `this->pos`).
249 const raylib::Vector2 lives_pos = {0, 10};
250 const raylib::Vector2 pts_pos = {330, 3};
251 const raylib::Vector2 question_pos = {815, 3};
252 const raylib::Vector2 snake_length_pos = {1400, 3};
253 const raylib::Vector2 answer_food_tex_pos = {1000, -2};
254
255 const char* apple_texture_file = "assets/apple.png";
256 const char* bad_apple_texture_file = "assets/apple_bad.png";
257 const char* pie_texture_file = "assets/pie.png";
258 const char* golden_pie_texture_file = "assets/golden_pie.png";
259
260 raylib::Texture2D apple_texture;
261 raylib::Texture2D bad_apple_texture;
262 raylib::Texture2D pie_texture;
263 raylib::Texture2D golden_pie_texture;
264
265 const Color math_question_color = ORANGE;
266 const Color math_feedback_color_correct = GREEN;
267 const Color math_feedback_color_wrong = ORANGE;
268
271 const float min_statusbar_pos_y = -80;
272
275 const int pos_y = -5;
276
277 const int vy = 3;
278
279 const char* texture_file = "assets/statusbar.png";
280 raylib::Texture2D texture;
281
282 bool is_falling = false;
283
286 MathQuestion* math_question;
287
288 raylib::Font* game_font;
289
290public:
294
297 raylib::Vector2 pos = {0, 0};
298
299 StatusBar();
300 void reset();
301 void init(raylib::Font* game_font, MathQuestion* math_question, PlayerStats* player_stats);
302
305 void draw();
306
309 void draw_stats();
310
313 void draw_question();
314
317 void draw_feedback(Food food);
318 void update();
319
322 void fall();
323};
324
325class Player {
326private:
330 const float snake_point_radius = TILE_DIMENSION / 15.0;
331
332 const Color snake_color = Color { .r = 87, .g = 141, .b = 237, .a = 255 };
333 const Color snake_color_pattern = Color { .r = 255, .g = 237, .b = 165, .a = 255 };
334
335 const char* turn_sound_file = "assets/turn.mp3";
336 raylib::Sound turn_sound;
337 raylib::Sound* lose_sound;
338
341 vector<Vector2> points;
342
345 Direction current_direction;
346
354 optional<Direction> turn_queue;
355
356 // Tekstur untuk kepala ular.
357 const char* texture_snake_head_u = "assets/snake_head_u.png";
358 const char* texture_snake_head_d = "assets/snake_head_d.png";
359 const char* texture_snake_head_l = "assets/snake_head_l.png";
360 const char* texture_snake_head_r = "assets/snake_head_r.png";
361 raylib::Texture2D snake_head_u;
362 raylib::Texture2D snake_head_d;
363 raylib::Texture2D snake_head_l;
364 raylib::Texture2D snake_head_r;
365
369 bool check_collision_self();
370
374 bool check_collision_corners();
375
378 void check_collision_food();
379
382 TileCoord initial_pos = {3, TILE_COLUMNS + 1};
383
386 void move();
387
390 bool try_check_collision = false;
391
392 bool active = true;
393
394 bool* play_bgmusic;
395
396public:
398
400
401 bool controllable = false;
402
403 void reset();
404
407 raylib::Vector2 head_pos;
408
409 Player();
410 raylib::Vector2 get_head_pos_center();
411 void init(raylib::Sound* lose_sound, bool* play_bgmusic);
412
415 void create_snake();
416
419 void check_collision(bool* play_bgmusic);
420
421 void update();
422 void draw();
423
426 void unqueue_turn();
427
430 void add_length();
431};
432
434private:
435 AppleExplosion explosion_animation;
436 const char* dead_crash_wall_file = "assets/dead_crash_wall.png";
437 const char* dead_crash_self_file = "assets/dead_crash_self.png";
438 const char* dead_bad_food_file = "assets/dead_bad_food.png";
439 const char* ground_texture_file = "assets/ground.png";
440 const char* ground_texture_apple_file = "assets/interlude_animation/37.png";
441
442 const char* bad_apple_sound_file = "assets/wrong.mp3";
443 const char* correct_apple_sound_file = "assets/crunch.mp3";
444 const char* heavenly_choir_sound_file = "assets/heavenly-choir.mp3";
445 const char* lose_sound_file = "assets/lose.mp3";
446 raylib::Sound bad_apple_sound;
447 raylib::Sound correct_apple_sound;
448 raylib::Sound heavenly_choir_sound;
449 raylib::Sound lose_sound;
450
451 const size_t dead_popup_dimension_y = 587;
452 const size_t dead_popup_dimension_x = 970;
453
454 size_t dead_popup_y; // Diitung ketika konstruksi kelas
455 size_t dead_popup_x; // Diitung ketika konstruksi kelas
456
457 raylib::Texture2D dead_crash_wall_texture;
458 raylib::Texture2D dead_crash_self_texture;
459 raylib::Texture2D dead_bad_food_texture;
460 raylib::Texture2D ground_texture;
461 raylib::Texture2D ground_texture_apple;
462 bool is_game_started = false;
463 StatusBar status_bar;
464 PlayerStats player_stats;
466 Player player;
467 raylib::Font* game_font;
468 GameComponents::GameStateManager* game_state_manager;
469
472 MathDisplayStatus math_status;
473
476 Food last_food;
477
480 function<void()> menu_callback;
481
482 bool* play_bgmusic;
483
484public:
485 GameScene();
486 void reset(bool apple_explode);
487 void init(raylib::Font* game_font, GameComponents::GameStateManager* game_state_manager, function<void()> menu_callback, bool* play_bgmusic);
488 void draw();
489 void update();
490
494 void food_check();
495};
Definition scene_game.hpp:81
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:207
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:227
void draw_answers()
Definition scene_game.cpp:418
void generate_new_question()
Definition scene_game.cpp:178
Definition scene_game.hpp:134
void draw_pts(raylib::Vector2 pos)
Definition scene_game.cpp:149
void turn(Direction direction)
long long pts
Definition scene_game.hpp:156
void draw_lives(raylib::Vector2 pos)
Definition scene_game.cpp:137
uint8_t lives
Definition scene_game.hpp:147
void reset()
Definition scene_game.cpp:126
PlayerStats()
Definition scene_game.cpp:122
raylib::Font * game_font
Definition scene_game.hpp:143
uint length
Definition scene_game.hpp:152
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:325
void create_snake()
Definition scene_game.cpp:511
void reset()
Definition scene_game.cpp:505
const float snake_body_radius
Definition scene_game.hpp:399
void init(raylib::Sound *lose_sound, bool *play_bgmusic)
Definition scene_game.cpp:596
raylib::Vector2 head_pos
Definition scene_game.hpp:407
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:397
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:401
Player()
Definition scene_game.cpp:496
Definition scene_game.hpp:246
raylib::Vector2 pos
Definition scene_game.hpp:297
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:293
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:19
@ DOWN
Definition scene_game.hpp:21
@ UP
Definition scene_game.hpp:20
@ LEFT
Definition scene_game.hpp:22
@ RIGHT
Definition scene_game.hpp:23
Difficulty
Definition scene_game.hpp:28
@ ADD_SUB_HARD
Definition scene_game.hpp:30
@ ADD_SUB_EASY
Definition scene_game.hpp:29
@ MULT_DIV_HARD
Definition scene_game.hpp:32
@ POW_SQRT_EASY
Definition scene_game.hpp:33
@ MULT_DIV_EASY
Definition scene_game.hpp:31
@ POW_SQRT_HARD
Definition scene_game.hpp:34
#define TILE_DIMENSION
Definition scene_game.hpp:13
GameOver
Definition scene_game.hpp:48
@ CRASH_WALL
Definition scene_game.hpp:50
@ CRASH_SELF
Definition scene_game.hpp:51
@ FALSE
Definition scene_game.hpp:49
@ BAD_FOOD
Definition scene_game.hpp:52
Food get_food(Difficulty difficulty)
Definition scene_game.cpp:16
Food
Definition scene_game.hpp:39
@ APPLE_PIE
Definition scene_game.hpp:42
@ APPLE
Definition scene_game.hpp:41
@ GOLDEN_APPLE_PIE
Definition scene_game.hpp:43
@ BAD_APPLE
Definition scene_game.hpp:40
long long get_pts(Food food)
Definition scene_game.cpp:38
MathDisplayStatus
Definition scene_game.hpp:241
@ FEEDBACK
Definition scene_game.hpp:243
@ QUESTION
Definition scene_game.hpp:242
#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:166
TileCoord coords[3]
Definition scene_game.hpp:181
string answers_str[3]
Definition scene_game.hpp:189
raylib::Vector2 coords_pixel[3]
Definition scene_game.hpp:185
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:193
long long answers[3]
Definition scene_game.hpp:177
string display
Definition scene_game.hpp:171
Definition scene_game.hpp:65
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:67
raylib::Vector2 to_vector2()
Definition scene_game.cpp:71
int row
Definition scene_game.hpp:66