为了便于开发游戏,本书设计了一个简单的程序框架,如2-4-1.cpp所示。
2-4-1.cpp
1 #include <graphics.h> 2 #include <conio.h> 3 #include <stdio.h> 4 5 // 定义全局变量 6 7 void startup() // 初始化函数 8 { 9 } 10 11 void show() // 绘制函数 12 { 13 } 14 15 void updateWithoutInput() // 和输入无关的更新 16 { 17 } 18 19 void updateWithInput() // 和输入有关的更新 20 { 21 } 22 23 int main() // 主函数 24 { 25 startup(); // 初始化函数,仅执行一次 26 while (1) // 一直循环 27 { 28 show(); // 进行绘制 29 updateWithoutInput(); // 和输入无关的更新 30 updateWithInput(); // 和输入有关的更新 31 } 32 return 0; 33 }
首先在程序开头定义一些全局变量作为游戏数据变量,它们在整个程序中均可以访问。具体的游戏功能在startup()、show()、updateWithoutInput()、updateWithInput()四个函数中实现。
程序从主函数开始,首先运行一次startup(),进行游戏的初始化。然后开始循环执行三个函数:show()进行绘制,updateWithoutInput()执行和输入无关的更新,updateWithInput()执行和输入有关的更新。
利用游戏开发框架,2-3-2.cpp可以修改为2-4-2.cpp。
2-4-2.cpp
1 #include <graphics.h> 2 #include <conio.h> 3 #include <stdio.h> 4 #define WIDTH 800 // 游戏画面宽度 5 #define HEIGHT 600 // 游戏画面高度 6 #define G 0.3 // 重力加速度 7 8 struct Bird // 小鸟结构体 9 { 10 float x, y, vy, radius; // 小球的圆心坐标、y方向速度、半径大小 11 }; 12 13 // 定义全局变量 14 Bird bird; // 定义小鸟变量 15 16 void startup() // 初始化函数 17 { 18 bird.radius = 20; // 小球半径 19 bird.x = WIDTH / 6; // 小球圆心的x坐标 20 bird.y = HEIGHT / 3; // 小球圆心的y坐标 21 bird.vy = 0; // 小球的y方向初始速度为0 22 23 initgraph(WIDTH, HEIGHT); // 新建一个画布 24 BeginBatchDraw(); // 开始批量绘制 25 } 26 27 void show() // 绘制函数 28 { 29 cleardevice(); // 清空画面 30 fillcircle(bird.x, bird.y, bird.radius); // 绘制小球 31 FlushBatchDraw(); // 批量绘制 32 Sleep(10); // 暂停10毫秒 33 } 34 35 void updateWithoutInput() // 和输入无关的更新 36 { 37 bird.vy = bird.vy + G; // 根据重力加速度更新小球的y方向速度 38 bird.y = bird.y + bird.vy; // 根据小球的y方向速度更新其y坐标 39 40 // 如果小球碰到上下边界 41 if (bird.y >= HEIGHT - bird.radius || bird.y <= bird.radius) 42 { 43 bird.y = HEIGHT / 3; // 小球圆心的y坐标 44 bird.vy = 0; // 小球的y方向初始速度为0 45 } 46 } 47 48 void updateWithInput() // 和输入有关的更新 49 { 50 if (_kbhit()) // 当按键时 51 { 52 char input = _getch(); // 获得输入字符 53 if (input == ' ') // 当按下空格键时 54 bird.vy = -10; // 给小球一个向上的速度 55 } 56 } 57 58 int main() // 主函数 59 { 60 startup(); // 初始化函数,仅执行一次 61 while (1) // 一直循环 62 { 63 show(); // 进行绘制 64 updateWithoutInput(); // 和输入无关的更新 65 updateWithInput(); // 和输入有关的更新 66 } 67 return 0; 68 }
当绘制元素较多时,画面中会出现明显的闪烁,这时可以使用批量绘图函数。
在2-4-2.cpp中,第24行的BeginBatchDraw()用于开始批量绘图,执行后任何绘图操作都将暂时不输出到屏幕上;第31行的FlushBatchDraw()用于对未完成的绘制任务执行批量绘制,并将之前的绘图输出。