当前位置: 老葡京网站娱乐 > 编程语言 > VC.NET > 正文

DirectX游戏开发:从一个小游戏开始

时间:2014-11-04 csdn博客 birdlove1987

老葡京网站娱乐 www.sdguanhua.com 写在前面:自己对DirectX挺感兴趣的,加上自己目前在研究3D重建方面的东西,所以利用课余时间学习一下??戳艘欢问奔涞氖?,感觉还是靠动手编写一些小例子来学习,进步的更快体会的更深。所以从我自己写的一个小游戏开始吧,把自己学习心得和自己的一些想法写下来。更是欢迎有兴趣的童鞋来和我交流。

首先:先把我的小例子分享出来,让大家玩一玩。

下载地址 :http://download.csdn.net/detail/u012269327/7374625

游戏操作说明:左右键控制方向,f 键是发射,q 键是退出游戏。

ps: 0 .B哥是我同学,住在我隔壁寝室。人很好,没有女朋友O(∩_∩)O~。

1 . 美术不好,画的丑了,请大家见谅。特别是B哥见谅。

2 . 这是一个起步用的小例子,不是展示 dx神奇之处的例子,随着我学习的深入我在写点更厉害的和大家分析哈!

3 . 我个人的最高成绩是6次,不知道有没有更高的了。

更多精彩内容:http://www.sdguanhua.com/Programming/VC_NET/

其次:游戏的逻辑挺简单的,我把游戏部分的代码贴出来,有兴趣的人可以看看。

const string APPTITLE = "向着B哥开炮";      //窗口文字题目  
const int SCREENW = 1024;                   //窗口平面宽度  
const int SCREENH = 768;                    //窗口平面高度  
      
      
LPDIRECT3DTEXTURE9 bomb_surf = NULL;                  //炸弹表面  
LPDIRECT3DTEXTURE9 b_brother_surf = NULL;       //B哥表面  
LPDIRECT3DTEXTURE9 background_sky_surf = NULL;   //背景位图  
      
struct B_BROTHER         //B哥类  
{  
    float x, y;           // B哥左上角顶点坐标  
      
    void reset()         //重置B哥位置函数  
    {  
        srand((unsigned int)time(NULL));  
        x = (float)((rand()*19) % (SCREENW - 128));  
        y = 0.0;  
    }  
};  
      
struct BOMB    //炸弹类  
{  
    float x, y;    //炸弹左上角顶点坐标  
};  
      
struct SKY   //背景天空类  
{  
    float x, y;   //背景天空左上角顶点坐标  
};  
      
      
      
int score;                    //打死B哥分数  
int speed;                    //B哥移动速度  
bool bomb_run;            //炸弹状态开关  
bool bomb_control;         //炸弹是否可控  
int b_brother_direction;      //B哥移动方向。1代表左面,-1代表右面 用于撞墙后改变方向  
B_BROTHER b_brother;              //初始化B哥  
SKY sky;                          //初始化背景天空  
BOMB bomb;                        //初始化炸弹  
      
      
/* 
** 游戏初始化 
** 作用:初始一些相关参数 
*/
      
bool Game_Init(HWND window)  
{  
    Direct3D_Init(window, SCREENW, SCREENH, false);         //d3d初始化  
      
    DirectInput_Init(window);                               //DirectInput初始化   
      
    //下面初始三个图片,用的是制定颜色透明,这是使用白色,具体技术后面再讲吧。  
    background_sky_surf =  LoadTexture("sky.bmp");   
    if (!background_sky_surf)  
    {  
        MessageBox(window, "天空没了!", "错误", 0);  
        return false;  
    }  
      
    bomb_surf =  LoadTexture("bomb.bmp",D3DCOLOR_XRGB(255,255,255)); //装载炸弹位图  
    if (!bomb_surf)  
    {  
        MessageBox(window, "子弹没有了!", "错误", 0);  
        return false;  
    }  
      
    b_brother_surf = LoadTexture("b_brother.bmp",D3DCOLOR_XRGB(255,255,255)); //装载b哥位图  
    if (!b_brother_surf)  
    {  
        MessageBox(window, "b哥走丢了!", "错误", 0);  
        return false;  
    }  
      
    srand((unsigned int)time(NULL));//初始B哥位置,因为c++中的随机数是伪随机数,所以用time种子初始。  
    b_brother.reset();  
      
    bomb.x = 500;                 //初始炸弹位置,这是炸弹位置在下面中间固定出现,因为炸弹在为发射前可控制  
    bomb.y = 630;  
      
    sky.x = 0;                   //因为这个游戏里没有用到卷动,所以暂时将背景固定  
    sky.y = 0;  
      
    score = 0;                    //打死B哥分数置零  
    speed = 1;                    //B哥移动速度初始为1  
    bomb_run = false;            //炸弹状态开关初始为关  
    bomb_control = true;         //炸弹是否可控初始可控  
    b_brother_direction = 1;      //B哥移动方向。1代表左面,-1代表右面  
    return true;  
}  
      
void Game_Run(HWND window)  
{  
    if (!d3ddev) return;     //坚持驱动接口是否到位,后面再讲这个知识啦!  
      
    DirectInput_Update();     //输入检测更新,这个是基于dx自己的输入监听,后面会讲。本游戏中主要是键盘输入  
      
    if (bomb_control)     //炸弹控制,发射后就不能控制了  
    {  
        if (Key_Down(DIK_LEFT))  bomb.x -= 6.0f;  
        if (Key_Down(DIK_RIGHT)) bomb.x += 6.0f;  
    }  
    if (Key_Down(DIK_F))      //检测是否发射  
    {  
        bomb_run = true;  
        bomb_control = false;  
    }  
      
    if (bomb_run)  //炸弹上升  
    {  
        bomb.y -= 6;  
    }  
      
    if (b_brother.x >= SCREENW - 130 ||b_brother.x >= SCREENW - 129||b_brother.x >= SCREENW - 131 )  //B哥撞墙改变方法判定  
        b_brother_direction *= -1;  
    if (b_brother.x <= 2||b_brother.x <= 1||b_brother.x <= 3)  
        b_brother_direction *= -1;  
      
    b_brother.x += (b_brother_direction * speed * 2);//B哥移动  
      
    if (bomb.x < 0) bomb.x = 0.0f;  
    if (bomb.x > SCREENW - 128) bomb.x = SCREENW - 128;  
      
    int bomb_center_x = bomb.x + 64;  //提取炸弹中心点  
    int bomb_center_y = bomb.y + 64;  
      
    //B哥与炸弹是否成功相撞判定和后续处理  
    if(bomb_center_x > b_brother.x && bomb_center_x < b_brother.x + 128 && bomb_center_y < b_brother.y + 128 && bomb_center_y > b_brother.y)  
    {  
        bomb_run = false;  
        score++;  
        char s[255];  
        sprintf_s(s, "%s [b哥被打死次数 %d]", APPTITLE.c_str(), score);  
        SetWindowText(window, s);  
        MessageBox(window, "恭喜你打中了B哥!", "太棒了!", 0);  
        b_brother.reset();//重置B哥  
        bomb.x = 500;  
        bomb.y = 630;  
        bomb_control = true;  
        if(speed < 32)  
        speed +=1;  //成功相撞后难的增加  
    }  
      
    //相撞失败后的相关处理  
    else if (bomb_center_y < 0)  
    {  
        MessageBox(window, "连B哥你都打不到!", "丢人!", 0);  
        gameover = true;  
    }  
      
    //dx绘制过程  
    if (d3ddev->BeginScene())  
    {  
        spriteobj->Begin(D3DXSPRITE_ALPHABLEND);  
      
        D3DXVECTOR3 p1( sky.x, sky.y, 0);//设置图片顶点位置,因为用的D3D所以是三维坐标,将z置0即可 详细技术后面会讲。  
        spriteobj->Draw(background_sky_surf, NULL, NULL, &p1,D3DCOLOR_XRGB(255, 255, 255));  
      
        D3DXVECTOR3 p2( bomb.x, bomb.y, 0);  
        spriteobj->Draw( bomb_surf, NULL, NULL, &p2, D3DCOLOR_XRGB(255,255,255));  
      
        D3DXVECTOR3 p3( b_brother.x, b_brother.y, 0);  
        spriteobj->Draw(b_brother_surf, NULL, NULL, &p3, D3DCOLOR_XRGB(255,255,255));  
      
        spriteobj->End();  
      
        d3ddev->EndScene();  
        d3ddev->Present(NULL, NULL, NULL, NULL);  
    }  
      
    //游戏可通过ESC键退出  
    if(Key_Down(DIK_Q))  
        gameover = true;  
    //保持动画帧数,这块我现在还没研究太透,数值都是试着来的,10ms在我的电脑上比较好  
    Sleep(10);  
      
}  
      
//游戏结束释放资源  
void Game_End()  
{  
    if (bomb_surf)  
        bomb_surf->Release();  
    if (b_brother_surf)  
        b_brother_surf->Release();  
    if(background_sky_surf)  
        background_sky_surf->Release();  
    DirectInput_Shutdown();  
    Direct3D_Shutdown();  
}

游戏截图: