使用WINDOWS的GDI开发游戏(4)

 第四篇

 

前面做的框架看起来是有那么点意思了。但游戏没有游戏过程算哪门子事呢。所以这篇我们将开始进入真正的游戏逻辑编写了。
我们只要在上次编写的代码里加入主逻辑处理就可以了。
下面我们来分析下坦克游戏的逻辑。首先坦克当然是要在沙场驰骋啦,所以我们接下来就构建这个沙场。
我们已经有了地图编辑器编辑的地图文件,所以只要根据那个地形文件把地图显示出来就可以了,相对来说应该比地图编辑器还简单。
不过针对不同地形我们需要做些针对性处理。
我们通过观察,可发现这个战场可分为如下几层,
从下往上是最底层的地面,然后是障碍物,然后可以绘制坦克,之后绘制树丛。
为了便于管理,我们用一个地图类来进行地面绘制管理,地图类同时加载地图数据。
我们先来绘制地面,
void CGameMap::DrawGround( HDC hDC )
{
CMemDC bmpDC( hDC );
    bmpDC.SelectObject( m_hTileBmp );
    for( int nY=0; nY<C_MAP_H; nY++ )
        for( int nX=0; nX<C_MAP_W; nX++ )
        {
            bmpDC.BitBlt( hDC, nX*C_TILE_W, nY*C_TILE_H, C_TILE_W, C_TILE_H, 0, 0 );
        }
}
因为我们的是砖块地图,所以只需要把第一块砖块(地面)直接重复贴到画面就可以了。
我们是通过横向、纵向两个循环,一块块贴上去,一共贴了C_MAP_H * C_MAP_W,在这里是25*18 = 450块。
贴完地面,就可以在地面上再贴上地面覆盖的,例如砖墙、钢墙、雪地、水等。
然后再绘制所有的坦克。之后就贴树林。这样就可以产生坦克是在水,雪地上运行。穿梭于树林的效果。而墙面是坦克不允许进入的区域。
最后可以再最上面绘制GUI元素,如分数之类的。
我们的游戏绘制函数便如下所示:
// 绘制地面
m_oGameMap.DrawMap( memDC.GetDC() );
// 绘制各个实体单位
DrawEntities( memDC.GetDC() );
m_oGameMap.DrawForest( memDC.GetDC() );
// 绘制界面
DrawGui( memDC.GetDC() );
记得,树林的绘制需要透明显示,这样才能使得坦克有种隐藏其中的感觉。
其中在DrawEntities里我们绘制各个作战单位和爆炸场面,以及穿梭的子弹。
我们把游戏的逻辑也在每次进入游戏的循环里进行判断。
游戏逻辑主要有各个实体的移动,以及中弹判断,还有碰撞判断。我们将这些判断放入GameLogic函数中。游戏逻辑判断是程序的大脑,我们放到下一篇。
对于障碍物的显示,我们可以通过读取Map文件决定各个位置需要显示的障碍物,我们把所有障碍物放到一幅图片,根据坐标来选择不同的图片。
这里再详细说下各个实体的绘制。实体有敌方坦克,我方坦克,子弹,爆炸场面,这些都是可移动单位,我们用一个基类来描述它们。
class CSpirit。
但每个单位的移动速度并不一样,我们可以用一个移动步长来区分。然后加上位置参数及大小参数,还有一个是当前面向的方向。
针对不同的实体使用不同的子类来加以设计。
这就是面向对象的继承的好处。我们只需要写一次移动逻辑,其他单位只需要继承这个基类就可以了。
绘制函数很简单,就是直接根据Spirit当前位置信息和大小状态,绘制到目标DC,但这里注意要使用底色透明显示,这样才有融入画面的感觉,不然就会
看到有黑色块移动,很不自然。
Spirit根据方向选择不同的图片,我们把各个方向的坦克图片放到一张位图里,显示时根据方向选择不同的源坐标从而把对应的图片显示到画面中。
同时我们可以设置两幅图片,来交替显示产生坦克轮子滚动的效果。通过一个变量m_nCurPic来决定当前显示的画面。
显示函数如下所示:
int nPic = (m_nDir == ENUM_STOP)?0:m_nDir;
memDC.TransparentBlt( hDC, m_nX, m_nY, m_nWidth, m_nHeight, m_nCurPic*m_nWidth, nPic *m_nHeight, RGB(0xFF,0xFF,0xFF) );
我们只需要在游戏逻辑中不断变化坦克的位置m_nX,m_nY就可以产生坦克移动的效果了。同时根据障碍物的判断可以使坦克的移动有道理,不会跨墙而走。
怎么样,通过这样几层的绘画,就有点游戏画面的感觉了吧?不过这里并没加入复杂的游戏逻辑的判断,还有子弹和爆炸效果也还未加入,
敌方坦克都是随机在画面上乱动,你可以使用方向键移动下你的坦克看看,开始有点游戏的味道了吧。

下一篇将介绍游戏逻辑部分。
当前篇游戏代码 下载
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

b2b160

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值