使用WINDOWS的GDI开发游戏(6)完结篇

来源:互联网 发布:爱上理财网络贷款 编辑:程序博客网 时间:2024/06/06 08:49

 第六篇


不知不觉我们的游戏已经实现了SPLASH,菜单显示,游戏画面显示,基本的碰撞检测,基本逻辑控制。已经初具游戏的样子了,但它仍然不是游戏。
因为它缺乏游戏的基本元素--竞技性。没有竞技性的游戏是不能称为游戏的。那么我们本篇就需要加入这些因素,并让游戏运行起来比较合理,因为
大家也发现了,所做的游戏敌方坦克移动很不合理,快的有点离谱,这里也要进行参数调整。

首先为了玩家能有成就感,我们必须要计算成绩,并显示成绩。成绩是反映游戏者的竞技水平的,在本游戏中,可以用击中敌方坦克数来衡量。

敌方坦克可以分级别,所以为了给不同的坦克一个统一的衡量,我们引入分数。不同坦克获取的分数高低不同。分数越高证明竞技水平越高。

分数的显示可以在GUI显示里输出,同时GUI需要输出总共的敌人和剩余敌方坦克,当前的关卡。我们这里为了方便直接用文本显示.大家可以参考

我们在策划里已经说明了,游戏中可以获取到各种道具,道具是随机出现的,那么我们也需要实现道具的处理。

道具的显示可以使用前面介绍的方法,只要在随机地方显示就可以了.

玩家吃到奖品可以采用坦克与奖品的碰撞检测,一旦检测到和奖品碰撞就调用吃奖品的代码
// 吃奖品
void CGame::EatPrize( CPrize &prize )
{
    switch( prize.GetType() )
    {
        case ENUM_PRIZEHEART:
            m_oGameState.nPlayerLive++;
            break;
    }
}

这里以吃到心来说明,其他的用户可以参考代码去加.
可以看到其实很简单,只要把玩家生命条数+1

其他的奖品根据功能执行相应逻辑就可以了.

当击中敌方坦克时,我们需要增加分数
m_oEnemies[nIndex].SetState( ENUM_DEAD );
m_oGameState.nKillCount[ m_oEnemies[nIndex].GetType() ]++;
m_oGameState.nScore += m_oEnemies[nIndex].GetType() * 10 + 10;
m_oGameState.nShowEnemyCount--;
if( m_oGameState.nShowEnemyCount<=0 )
{
    int nLeftEnemy = 0;
    for( i=0; i<C_ENEMYTYPE_COUNT; i++ )
    {
        nLeftEnemy += m_oGameState.nTotalTank[ i ];
    }
    if( nLeftEnemy<=0 )
        WinGame();
}
从代码里我们看到,当敌方坦克被击中时,首先设置坦克为死亡状态,然后增加坦克击毁数,然后是增加相应分数,接着使敌方画面的坦克数减1,
当敌方坦克为0时,就可以知道敌人被全部消灭了。
我们接下来看WinGame()的处理。
// 游戏胜利
void CGame::WinGame()
{
    m_oGameState.nLevel++;
    InitGame();
}

我们的游戏胜利处理很简单,本来可以显示当前击中坦克数的,因为这里是教学篇,就不需要那么复杂了,只需要增加关卡数,也就是过关就可以了,
如果通关就直接播放胜利画面。

而当我们的坦克被击中时,同样要对相应变量进行设置。

m_oPlayer.SetState( (ENUM_TANKSTATE)(m_oPlayer.GetState() - 1 ) );
                
if( m_oPlayer.GetState() == ENUM_DEAD )
{
    if( m_oGameState.nPlayerLive < 0 )
        InitGame();
    else
    {
        m_oGameState.nPlayerLive--;
        m_oPlayer.SetPos( 8*C_TILE_W, 17*C_TILE_H );
        m_oPlayer.SetState( ENUM_GRADE1 );
        m_oPlayer.SetDirection( ENUM_STOP );
    }
}

我们看到,当我们的坦克被击中时,是设置等级降低一级,如果降低到死亡,就做死亡处理。
先看是否还有生命,如果有就减少一条生命,继续游戏,否则重新开始游戏。

之后就是调整敌方坦克的移动速度,原来我们只是简单的让速度是坦克类型的2倍,这样出来的速度最后那个类型就显得太快了,不合理,
这些设计者可以通过测试及计算设计出合理的范围。

我对敌方坦克的设置是,首先分8种类型
第1种: 移动速度8,装甲强度1 
第2种: 移动速度8,装甲强度2
第3种: 移动速度6,装甲强度1
第4种: 移动速度6,装甲强度2
第5种: 移动速度4,装甲强度2
第6种: 移动速度4,装甲强度3
第7种: 移动速度2,装甲强度2
第8种: 移动速度2,装甲强度3

不过移动速度8好像还是有点块了,大家可以自己测试到合理的速度.

游戏代码里的速度是我测试的速度公式。这个大家可以根据实际情况来决定。因为每个游戏都不同,
要根据实际情况来决定。

当这些都处理妥当后,我们的游戏就有了计分功能,所以就有了竞技性,可以真正给人玩了。

我们为了满足玩家的满足感,主要是利用过关的满足。所以关卡的设计就要一点智慧了,这些都靠大家的技巧。就留给各位自己来吧,可以直接使用地图编辑器来设计你的关卡。

我们还没有给游戏添加音乐,其实很简单,可以直接调用API就可以了。
使用
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);
例如开火时:
PlaySound( _T("wav/fire.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_NOWAIT );

大家可以参考最终的代码来查看程序的逻辑。

很多细节难以说明,大家可以对着代码去理解。

好了,我们终于完成了目标,完成了一个可玩的游戏了。发挥你的想象,你一定能做出更棒的游戏的,只要你肯动手。

最后感谢所有看完所有教程的人。谢谢~~

最终程序

欢迎访问我的博客:
http://blog.csdn.net/b2b160
下载配套代码
http://d.download.csdn.net/down/1803463/b2b160
原创粉丝点击