SDL2系列教程10-扔箱子的抛物线小游戏

在上一节中介绍了定时器的概念,本节基于上节只是制作一个扔箱子的抛物线小游戏。

游戏说明:

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);

游戏测试:

连续点击鼠标

自作小游戏代码:

https://download.csdn.net/download/cyf15238622067/10698284

猜你喜欢

转载自blog.csdn.net/cyf15238622067/article/details/82911395