在上一节中介绍了定时器的概念,本节基于上节只是制作一个扔箱子的抛物线小游戏。
游戏说明:
1、单击鼠标左键生成一个矩形箱子;
2、箱子以随机的方式生成水平初始速度,可左可右;
3、箱子的垂直方向初速度为500,方向向上;
4、箱子受到重力大小是750
5、箱子在屏幕上显示时间为5秒,会落到底部或飞出窗口;
定义结构体
struct square {
float x, y, w, h, xvelocity, yvelocity;
Uint32 born, lastUpdate;
};
x,y, w, h表示矩形的位置和宽高;
xvelocity, yvelocity 表示x,y方向的速度;
born 表示矩形的产生时间;
lastUpdate 表示上次矩形的刷新时间;
代码讲解:
实现鼠标event处理:
vector<square> squares; //定义矩形vector
while ( SDL_PollEvent( &e ) != 0 ) {
switch (e.type) {
case SDL_QUIT:
running = false;
break;
case SDL_MOUSEBUTTONDOWN:
square s;
s.x = e.button.x; //光标坐标x即为矩形x值
s.y = e.button.y; //光标坐标y即为矩形y值
s.w = rand() % 50 + 25; //矩形的宽是随机数除50取余+25
s.h = rand() % 50 + 25; //矩形的高是随机数除50取余+25
s.yvelocity = -500; //box(矩形)的y方向初始速度500,向上
s.xvelocity = rand() % 500 - 250; //box(矩形)的x方向初始速度是随机数除500取余-250,方向随机
s.lastUpdate = SDL_GetTicks(); //
s.born = SDL_GetTicks();
squares.push_back(s);
break;
}
}
实际的刷新循环:用积分的概念计算位置;
const float GRAVITY = 750.0f; //向下的加速度常量
for (int index = 0; index < squares.size(); index++) {
square& s = squares[index];
Uint32 time = SDL_GetTicks();
float dT = (time - s.lastUpdate) / 1000.0f; //时间差
s.yvelocity += dT * GRAVITY; // dT * GRAVITY=时间*加速度=速度变化量,+=实现计算当前速度
s.y += s.yvelocity * dT; //计算出当前位置的y坐标
s.x += s.xvelocity * dT; //计算出当前位置的y坐标
if (s.y > 480 - s.h) { //箱子落到了窗口底部,或者刚点击鼠标时放不下箱子,箱子不再移动
s.y = 480 - s.h;
s.xvelocity = 0;
s.yvelocity = 0;
}
s.lastUpdate = time;
if (s.lastUpdate > s.born + 5000) { //如果大于5秒。从向量中移除箱子
squares.erase(squares.begin() + index);
index--;
}
}
copy到渲染器,显示
for (const square& s : squares) {
SDL_Rect dest = { (int)round(s.x), (int)round(s.y), (int)round(s.w), (int)round(s.h) };
SDL_RenderCopy(renderer, box, NULL, &dest);
}
SDL_RenderPresent(renderer);
游戏测试:
连续点击鼠标
自作小游戏代码: