C++ 开发的第一款游戏

从iOS转入游戏行业,转眼间一个月了,十几天完成了自己的第一款小游戏。感觉还是有点不适应的,从编程语言到编译工具等,用惯了苹果电脑,突然转到Windows下,好多都不习惯了。


首先,从编程工具说起,vs2010说起来不陌生,大学学习那会儿用过。毕业后就没怎么用过,好多东西都不会,对于新手了来说,那就是两眼一抹黑,不懂咋办呢?问度娘呗,问同事。记一些常用的快捷键,对于编程还是很有好处的。


谈谈游戏吧,做的这款游戏是一个多人玩的游戏,摇骰子押大小。这里写图片描述
上面这个UI整体效果图,一开始接手这个项目完全懵逼的,不知道从哪里下手。想了半天,分析各种问题。一开始就觉得中奖区域好难算,根据3个骰子的随机值,算出来。开始写的算法,逻辑用了200多行代码来完成。这个游戏个人感觉最难的就是根据骰子随机值算出中奖区域,以及那些中奖了,什么赔率。在此处附上我写的根据骰子随机值计算中奖区域代码:

void CServerGameDesk::GetDiceLottery(BYTE dice[3]){

    BYTE arrayHe[14];
    BYTE arrayDouble[6];
    BYTE arrayThree[6];
    //int arrayLottry[7] = {0};
    int i;

    //单骰
    for (i = 0;i < 3;i++)
    {
        m_LottryArea[i] = dice[i];
    }


    //骰子和
    BYTE sumDice = dice[0]+ dice[1] + dice[2];
    for ( i = 0;i < 14;i++)
    {
        arrayHe[i] = 7+i;
    }
    if (((sumDice-4) >= 0) && ((sumDice-4)<=13)){
        m_LottryArea[3]  = arrayHe[sumDice - 4];

    }else{
        m_LottryArea[3] = 0;
    }

    //双骰
    for (i = 0;i < 6;i++)
    {
        arrayDouble[i] = 21 + i;
    }
    if ((dice[0] == dice[1]) || (dice[0] == dice[2])|| (dice[1] == dice[2]))
    { 
        if ((dice[0] == dice[1]))
        {

            m_LottryArea[4] = arrayDouble[dice[0]-1];

        }

        if ((dice[1] == dice[2]))
        {
            m_LottryArea[4] = arrayDouble[dice[1]-1];

        }

        if ((dice[0] == dice[2]))
        {
            m_LottryArea[4] = arrayDouble[dice[0]-1];

        }
    }else{
        m_LottryArea[4] = 0;
    }


    //骰子大小
    if ((sumDice >= 4) && (sumDice <= 10))
    {
        m_LottryArea[6] = 34;
    }
    else
    {
        m_LottryArea[6] = BET_AREA;
    }


    //三骰(围骰)
    for (i = 0;i < 6;i++)
    {
        arrayThree[i] = 27 + i;
    }
    if ((dice[0] == dice[1]) && (dice[0] == dice[2]))
    {  
        m_LottryArea[5] = arrayThree[dice[0]-1];
        m_LottryArea[7] = 33;
        m_LottryArea[6] = 0;

    }else{
        m_LottryArea[5] = 0;
    }

}

这是说说当时的想法,把中奖区域分为8块。单骰(用3个区域表示)、骰和、大小、双骰、全骰、围骰。在根据每个区域定义的枚举类型的值来算出随机骰子出现的中奖区域。
定义的枚举类型如下:

//下注区域类型
enum BetType
{             

    // 单点
    BET_TYPE_SINGLE_1 = 1,                      
    BET_TYPE_SINGLE_2 = 2,
    BET_TYPE_SINGLE_3 = 3,
    BET_TYPE_SINGLE_4 = 4,
    BET_TYPE_SINGLE_5 = 5,
    BET_TYPE_SINGLE_6 = 6,

    // 骰子的和数
    BET_TYPE_SUM_4 = 7,                  
    BET_TYPE_SUM_5,
    BET_TYPE_SUM_6,
    BET_TYPE_SUM_7,
    BET_TYPE_SUM_8,
    BET_TYPE_SUM_9,
    BET_TYPE_SUM_10,
    BET_TYPE_SUM_11,
    BET_TYPE_SUM_12,
    BET_TYPE_SUM_13,
    BET_TYPE_SUM_14,
    BET_TYPE_SUM_15,
    BET_TYPE_SUM_16,
    BET_TYPE_SUM_17,

    // 双骰
    BET_TYPE_DOUBLE_1 = 21,                     
    BET_TYPE_DOUBLE_2 = 22,
    BET_TYPE_DOUBLE_3 = 23,
    BET_TYPE_DOUBLE_4 = 24,
    BET_TYPE_DOUBLE_5 = 25,
    BET_TYPE_DOUBLE_6 = 26,


    //  围骰
    BET_TYPE_THREE_1 = 27,                      
    BET_TYPE_THREE_2 = 28,
    BET_TYPE_THREE_3 = 29,
    BET_TYPE_THREE_4 = 30,
    BET_TYPE_THREE_5 = 31,
    BET_TYPE_THREE_6 = 32,

    // 全围
    BET_TYPE_ALL = 33,

    // 大
    BET_TYPE_MAX = 35, 

    //小
    BET_TYPE_MIN = 34,      

};

一个游戏做下来,感觉基础东西很重要,在这个游戏开发中,主要用到很多基础的数据类型,外加一些STL基本库的几种基本类型(vector,deque);
O(∩_∩)O就扯这么多了,赶紧搬砖去/(ㄒoㄒ)/~~

用DDraw实现射击游戏说明文档 要点一:画图自动切割 IDirectDrawSurface7::BltFast()方法中没有自动切割功能,即当画图元素超出窗口以外时不会自动切割,DDraw选择自动忽略不画,造成一旦超出窗口,画图元素会突然消失。 解决这一问题的方法是手动切割,代码如下: //自动切割 RECT scRect; //存放当前窗口大小区域 ZeroMemory( &scRect, sizeof( scRect ) ); GetWindowRect( GetActiveWindow(), &scRect ); //防止图片左上角超过窗口左上角 if ( x < 0 ) { m_rect.left -= x; x = 0; } if ( y scRect.right ? scRect.right : x; y = y > scRect.bottom ? scRect.bottom : y; m_rect.right = x + m_rect.right - m_rect.left > scRect.right ? scRect.right - x + m_rect.left : m_rect.right; m_rect.bottom = y + m_rect.bottom - m_rect.top > scRect.bottom ? scRect.bottom - y + m_rect.top : m_rect.bottom; 只需将上述代码加在CGraphic::BltBBuffer() 中的m_bRect = m_rect; 前即可。 要点二:背景的滚轴实现 画背景可以分为以下三种情况: 情况一:背景图片与窗口等高 情况二:背景图片高度小于窗口高度 情况三:背景图片高度大于窗口高度 上述讲解图与代码相对应地看,有助于容易理解。 另外,要点一实现之后,由于已经可以自动切割,画背景可以用其它方法。 要点三:精灵图的实现 在游戏中,如RPG游戏中的人物图、射击类游戏的飞机、爆炸等,叫做精灵图。 精灵图实际上是将所有帧的图片放在一个文件中,游戏时靠一个RECT来控制画图像文件中的哪一部分,进而控制游戏显示哪一帧图,只需控制好RECT的位置即可。如下图: 控制RECT的四个角的坐标的移动,有以下代码: if (m_timeEnd – m_timeStart > 100) //只有到了100ms之后才绘图 { m_ImageID++; if(m_ImageID - m_beginID >= num) { m_ImageID = m_beginID; //最后一帧的下一帧是第一帧 } m_timeStart = timeGetTime(); } int id = m_ImageID++; SetRect(&m_rect, 41 * id, 0, 41 * (id + 1), 41); //飞机精灵图大小是41×41 m_pGraph->BltBBuffer(m_pImageBuffer, true, m_Pos.x, m_Pos.y, m_rect); 这样就实现了精灵动画的效果。 要点四:拿STL进行子弹的实现 子弹的实现可以使用STL中的vector,当按下开火键时发出一颗子弹,就往vector中添加一个结点;当子弹飞出窗口或击中敌机时,再将结点从vector中删除。每帧游戏画面中子弹飞行时只需将vector中的所有子弹进行处理、绘画即可。 参考代码如下: 1.添加子弹 if (g_ctrlDown) //当ctrl键按下时开炮! { m_BulletEnd = m_Gtime->GetTime(); if ((m_BulletEnd - m_BulletStart) * 1000 > 120) //如果连续按着开火键不放,这里控制不会发出太多子弹 { m_BulletStart = m_BulletEnd; MBULLET tmpBullet; tmpBullet.pos.x = m_SPos.x - 1; //记录开火时的子弹位置 tmpBullet.pos.y = m_SPos.y - 26; tmpBullet.speed = 5; //该子弹的飞行速度 m_BulletList.push_back(tmpBullet); //将子弹添加到vector中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值