Skip to content

Latest commit

 

History

History
107 lines (78 loc) · 5.02 KB

File metadata and controls

107 lines (78 loc) · 5.02 KB

Engine2D 学习指南 (LEARNING.md)

本指南带你从零开始、循序渐进地掌握 Engine2D。每一课都是一个可独立编译运行的小程序,代码里写满了中文注释。建议按顺序阅读源码、编译、运行、再改一改看效果。

所有教程都位于 Examples/Learn/,构建后可执行文件在 build/bin/ 下,名字形如 Learn01_HelloWindow.exe


🧭 核心概念速览

Engine2D 采用组件式架构,三句话理解它:

  1. Engine(引擎) 是单例,负责初始化所有子系统并驱动主循环: 处理输入 → 更新(update) → 渲染(render),每帧循环一次。
  2. Scene(场景)GameObject(游戏对象) 的容器;SceneManager 负责场景的创建与切换。
  3. GameObject 本身只是一个壳,真正的行为写在挂到它上面的 Component(组件) 里。 你最常做的事就是:写一个继承 Component 的类,重写 initialize / update / render, 然后 gameObject->addComponent<你的组件>()

一个最小程序长这样:

Engine& engine = Engine::getInstance();
engine.initialize("标题", 800, 600);          // 1. 初始化
auto* scene = engine.getSceneManager()->createScene("Main");
engine.getSceneManager()->loadScene("Main");   // 2. 创建并加载场景
scene->createGameObject("Hi")->addComponent<MyComponent>(); // 3. 挂组件
engine.run();                                  // 4. 跑主循环

关于坐标系(重要!)

  • 世界坐标drawRect / drawCircle / drawLine 使用世界坐标,Y 轴向上, 渲染时会自动翻转到屏幕。游戏内的实体(角色、子弹)通常用它。
  • 屏幕坐标drawText / drawTextCentered 使用屏幕坐标,左上角为原点、Y 向下, 适合画分数、菜单等 HUD。需要在屏幕坐标里画矩形(比如做 UI 背景)时, 可参考教程 06 里的 fillScreenRect() 辅助函数做一次换算。

📚 课程列表

目录 你将学到
01 01_HelloWindow 程序骨架、主循环、第一个组件、画文字
02 02_DrawingShapes 矩形/线段/圆的绘制,用 sin/cos 做动态画面
03 03_Input 键盘三态(按下/按住/松开)、鼠标位置与点击
04 04_Physics 刚体 Rigidbody、重力、读写速度、边界反弹
05 05_Animation 用 deltaTime 做平滑动画、lerp 与缓动曲线
06 06_TextAndUI 位图字体、坐标换算、手写一个可点击按钮
07 07_AudioAndScenes 程序化音效(波形/滑音)、多场景切换

01 · 你好窗口

最小可运行程序。理解 initialize → createScene/loadScene → addComponent → run 的固定套路, 以及 Component::update(dt)Component::render() 的分工。

02 · 绘制图形

渲染器的基础画笔。注意所有图形用世界坐标(Y 向上),文字用屏幕坐标(Y 向下)。

03 · 处理输入

区分 isKeyPressed(仅按下那一帧)、isKeyHeld(按住期间每帧)、isKeyReleased(松开那一帧)。 移动用 Held,开关/切换用 Pressed。

04 · 物理与运动

给对象加 Rigidbody 后,物理世界会按设定的重力为它积分速度与位置。 本课把重力设为向下,并在组件里手动处理「撞墙反弹」(读速度→反向→乘弹性系数)。

05 · 动画与缓动

动画的本质是「随时间改变属性」。用 deltaTime 累积时间保证不同帧率下表现一致; lerp 做线性过渡,配合 easeInOut / easeOutBack / easeOutBounce 让运动更有生命力。

06 · 文字与 UI

引擎自带 5×7 位图字体(无需任何字体文件):drawText / drawTextCentered / measureTextWidth。 本课用「矩形 + 文字 + 鼠标命中检测」从零做一个会悬停、可点击的按钮。

07 · 音频与场景

引擎用 SDL 核心音频实时合成音效,无需音频文件:playTone(频率,时长,音量,波形)playSweep(起,止,...)。同时演示用 loadScene 在「菜单」与「音板」两个场景间切换。


🎮 进阶:完整游戏

学完教程后,去读 Examples/ 下两个「麻雀虽小五脏俱全」的完整游戏, 它们演示了真实项目里的状态机、HUD、音效与重开流程:

  • SnakeGame(贪吃蛇) —— 推荐首读。网格玩法 + 完整状态机(菜单/游戏/暂停/结束/重开)
    • 计分与最高分 + 渐进加速 + 音效。结构清晰,是最好的「抄作业」模板。
  • TankBattle(坦克大战) —— 更复杂:多波敌人、AI、可破坏砖墙、暂停与胜负流程。

其它示例:BounceArena(打砖块,演示引擎物理碰撞)、FallingBlocks(下落方块 + 重力)、 InputTest(输入测试)、SimpleGame(最简范例)。


🔨 如何构建运行

mkdir -p build && cd build
cmake ..
cmake --build .          # 或 Windows + mingw: mingw32-make
# 运行(可执行文件在 build/bin/)
./bin/Learn01_HelloWindow
./bin/SnakeGame

祝学习愉快,开始动手改代码吧!🚀