C和C++游戏趣味编程(童晶)

书: https://pan.baidu.com/s/15VfTw9eJ2MoiHktwswP0gw?pwd=tq5x
笔记如下:

一、游戏循环设计

  1. “游戏主循环的黄金结构:事件处理→逻辑更新→画面渲染,帧率控制用SDL_Delaychrono计时。”
  2. “固定时间步长(Fixed Timestep)避免物理模拟因帧率波动失真,如while(accumulator >= dt)。”

二、图形渲染

  1. “SDL2的硬件加速渲染:SDL_RenderCopy比直接操作像素快100倍,适合2D精灵动画。”
  2. “OpenGL立即模式(旧版)适合初学者:glBegin(GL_QUADS)glVertex2f,但现代核心模式需VAO/VBO。”

三、输入处理

  1. “键盘连续输入检测:SDL_GetKeyboardState返回状态数组,避免按键消息的延迟感。”
  2. “鼠标相对坐标转换:SDL_GetMouseState需结合视口矩阵映射到游戏世界坐标。”

四、物理与碰撞

  1. “AABB(轴对齐包围盒)碰撞检测:if (rect1.x < rect2.x + w2 && ...),性能与精度平衡。”
  2. “简易物理模拟:速度 += 加速度 * dt位置 += 速度 * dt,欧拉积分足够用于小游戏。”

五、资源管理

  1. “纹理加载优化:SDL_Texture复用比反复创建SDL_Surface更高效,内存占用更低。”
  2. “音效池技术:预加载多个Mix_Chunk实例,避免播放时动态加载卡顿。”

六、状态管理

  1. “有限状态机(FSM)实现游戏状态:enum GameState { MENU, PLAY, PAUSE } + switch控制逻辑分支。”
  2. “对象池(Object Pool)管理子弹/敌人:预分配对象数组,避免运行时new/delete开销。”

七、C++特性应用

  1. “RAII管理SDL资源:封装SDL_Texture*到类,析构函数自动调用SDL_DestroyTexture。”
  2. std::vector存储游戏实体:for(auto& entity : entities)更新,注意迭代器失效问题。”

八、调试技巧

  1. “帧率显示:1000.0f / (SDL_GetTicks() - last_time),调试性能瓶颈的第一步。”
  2. “碰撞检测可视化:临时绘制碰撞盒边框,SDL_SetRenderDrawColor(255,0,0,255)。”

九、跨平台注意

  1. “路径分隔符:Windows用\\,Linux/Mac用/,建议统一用/SDL_GetPrefPath获取用户目录。”

十、项目进阶

  1. “ECS架构雏形:Component(数据) + System(逻辑)分离,适合复杂游戏扩展。”
  2. “存档系统设计:二进制格式(fwrite)快速,JSON(nlohmann/json)可读性强。”
  3. “从‘玩具代码’到工程化:将游戏拆分为GameRendererResourceManager等模块。”

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注