控制台类谷歌恐龙游戏不同对象速度调整:恐龙速度恒定、障碍物增速
问题分析
你当前的实现用同一个speed变量控制全局帧的休眠时长,恐龙跳跃动画、障碍物移动、输入检测都绑定在同一个帧刷新频率上,所以修改speed值时二者速度会同步变化。
实现方案
要实现障碍物提速、恐龙速度恒定的效果,只需要把二者的刷新逻辑拆开即可,具体步骤如下:
- 新增两个独立的控制变量:
- 固定值的
const int BASE_FRAME_DELAY = 20;作为全局基础帧间隔,控制恐龙跳跃动画、输入检测的刷新频率,全程不变,保证恐龙移动速度恒定 - 可变的
int obstacle_move_delay = 100;作为障碍物移动的时间阈值,随游戏进程逐步调小,实现障碍物加速
- 固定值的
- 新增障碍物移动计时器,单独统计障碍物的移动触发时机
- 把原代码末尾的休眠参数替换为固定的
BASE_FRAME_DELAY
修改后的核心代码参考:
// 新增全局变量 const int BASE_FRAME_DELAY = 20; // 全局基础帧间隔,固定不变 int obstacle_move_delay = 100; // 障碍物移动间隔,随游戏进度减小 int obstacle_timer = 0; // 障碍物移动计时器 while (1) { // 原有恐龙跳跃逻辑完全保留,不需要修改 if (GetAsyncKeyState(VK_SPACE) < 0 || action) // 检测用户是否按空格 { if (!action) button = _getch(); if (button == VK_SPACE) // 处理恐龙上下移动逻辑 { action = 1; if (loop < 6) { std::queue<Position> tempQue = dinoPos; for (size_t i = 0; i < DINOSIZE; i++) { setCursor(dinoPos.front().x, dinoPos.front().y); dinoPos.pop(); std::cout << " "; } for (size_t i = 0; i < DINOSIZE; i++) { setCursor(tempQue.front().x, tempQue.front().y - 1); tempQue.front().y -= 1; dinoPos.push(tempQue.front()); tempQue.pop(); std::cout << "D"; } } loop++; if (loop == 12) { loop = 0; action = 0; } } } // 新增障碍物移动逻辑 obstacle_timer += BASE_FRAME_DELAY; if (obstacle_timer >= obstacle_move_delay) { // 此处放置你原有障碍物左移的代码 obstacle_timer = 0; } // 玩家通过障碍物时,仅修改obstacle_move_delay实现障碍物加速,示例如下: // if (玩家通过障碍物判定成立) { // obstacle_move_delay = max(20, obstacle_move_delay - 5); // } std::this_thread::sleep_for(std::chrono::milliseconds(BASE_FRAME_DELAY)); // 休眠改为固定值 }
内容的提问来源于stack exchange,提问作者covenant
相关产品推荐
相关产品推荐

