#ifndef GAME_H_ #define GAME_H_ #include #include "cglm/types.h" #include "scufeng/engine.h" #define XGameStateEvent(X) \ X(GSEVENT_NONE) \ X(GSEVENT_L_SCORE) \ X(GSEVENT_R_SCORE) \ X(GSEVENT_BALL_DIR_CHANGE) \ X(GSEVENT_L_WIN) \ X(GSEVENT_R_WIN) #define X(evt) evt, typedef enum { XGameStateEvent(X) } GameStateEvent; #undef X typedef struct { vec2 pos; float w; float h; vec2 dirv; float speed; } MovingObject; typedef struct { float paddles_w; float paddles_h; float paddle_l_x; float paddle_speed; float ball_w; vec2 ball_pos; float ball_speed; } GameStateParameters; typedef struct { bool ai_enabled; MovingObject paddle_l; MovingObject paddle_r; MovingObject ball; vec2 ball_start_pos; vec2 ball_start_dir; uint8_t score_l; uint8_t score_r; } GameState; const char *GameStateEvent_to_str(const GameStateEvent evt); GameState GameState_new( const GameStateParameters params, const bool ai_enabled ); void GameState_paddle_l_change_dir(GameState *const state, const SEDirection dir); void GameState_paddle_r_change_dir(GameState *const state, const SEDirection dir); GameStateEvent GameState_update(GameState *const state, const double delta); SEDirection GameState_paddle_l_dir_get(const GameState *const state); extern const GameStateParameters game_default_params; #endif // GAME_H_