#ifndef PINGPONG_GAME_H #define PINGPONG_GAME_H #include #include #include namespace godot { class PingPongBall; // ═══════════════════════════════════════════════════════ // 视觉常量 — 以后替换素材时删除本段 // (颜色值定义在 pingpong_game.cpp 中) // ═══════════════════════════════════════════════════════ static constexpr float FIELD_INSET = 15.0f; static constexpr float CENTER_LINE_DASH = 20.0f; static constexpr float CENTER_LINE_GAP = 12.0f; // 游戏状态 enum GameState { WAITING, COUNTDOWN, PLAYING, SCORED, GAME_OVER }; // 倒计时参数 static constexpr float COUNTDOWN_INTERVAL = 0.75f; static constexpr int COUNTDOWN_START = 3; static constexpr float SCORED_PAUSE = 1.2f; class PingPongGame : public Node2D { GDCLASS(PingPongGame, Node2D) private: int left_score = 0; int right_score = 0; int max_score = 5; // 状态机 GameState state = WAITING; float state_timer = 0.0f; int countdown_number = COUNTDOWN_START; // 子节点引用 Label *left_score_label = nullptr; Label *right_score_label = nullptr; Label *message_label = nullptr; PingPongBall *ball = nullptr; void update_score_display(); void set_state(GameState p_state); void show_message(const String &p_text); protected: static void _bind_methods(); public: PingPongGame(); ~PingPongGame(); void _ready() override; void _process(double delta) override; void _draw() override; void _input(const Ref &event) override; // 得分处理 void _on_ball_scored(int which); // 重置整局游戏 void reset_game(); void start_countdown(); // 属性 getter/setter void set_left_score(int p_score); int get_left_score() const; void set_right_score(int p_score); int get_right_score() const; void set_max_score(int p_score); int get_max_score() const; // 信号: game_over(int winner) — 0=左边赢, 1=右边赢 }; } #endif // PINGPONG_GAME_H