31.飞机大战:游戏场景

  • 学习人数 15K+
  • 适合有C语言基础人群学习
avatar
林耿亮

你好编程主讲老师

首先,我们先介绍一下游戏场景的概念。

场景

例如,在飞机大战游戏里面,就分为两个场景。

  1. 开始菜单
  2. 主游戏

开始菜单场景中,有一张背景图片,和两个可以选择的按钮。主游戏场景就是正常的游戏运行场景,玩家控制英雄飞机发射子弹射击敌人飞机。

从上面的描述中,可以看出:每个场景当中包含多个精灵,并且这些精灵可能互相影响。比如:子弹击中敌机,英雄撞击敌机。

目前我们仅实现了让一个精灵在游戏循环中显示与更新。比如刚刚的单独渲染英雄和背景。

源文件gameloop.cpp

#include "gameloop.h"
#include "sprite.h"
#include <easyx.h>

void gameLoop(sprite *s, int fps)
{
    timeBeginPeriod(1);
    LARGE_INTEGER startCount, endCount, F;
    QueryPerformanceFrequency(&F);

    BeginBatchDraw();
    while (1)
    {
        QueryPerformanceCounter(&startCount);
        cleardevice(); 

        //  执行sprite的draw方法
        s->draw(s);
        //  执行sprite的update方法
        s->update(s);

        QueryPerformanceCounter(&endCount);
        long long elapse = (endCount.QuadPart - startCount.QuadPart)
            / F.QuadPart * 1000000;

        //  利用fps计算游戏每一帧之间的时差,注意这里的单位是微秒
        while (elapse < 1000000 / fps)
        {
            Sleep(1);
            QueryPerformanceCounter(&endCount);
            elapse = (endCount.QuadPart - startCount.QuadPart)
                * 1000000 / F.QuadPart;
        }
        FlushBatchDraw();
    }
    EndBatchDraw();
    timeEndPeriod(1);
}

现在,我们要创建一个场景对象,把需要渲染和更新的精灵集中在这个场景当中。接着,渲染和更新该场景。我们考虑一下,游戏中场景的共性,让我们把它的共性抽取出来。建立成一个新的场景基础对象,这个对象是所有场景对象的父对象。