zoukankan      html  css  js  c++  java
  • DirectX游戏开发——从一个小游戏開始

    本系列文章由birdlove1987编写,转载请注明出处。

      

    文章链接: http://blog.csdn.net/zhurui_idea/article/details/26364129


    写在前面自己对DirectX挺感兴趣的,加上自己眼下在研究3D重建方面的东西,所以利用课余时间学习一下。

    看了一段时间的书,感觉还是靠动手编写一些小样例来学习,进步的更快体会的更深。

    所以从我自己写的一个小游戏開始吧,把自己学习心得和自己的一些想法写下来。更是欢迎有兴趣的童鞋来和我交流。


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


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


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


    ps:    0 .B哥是我同学,住在我隔壁寝室。

    人非常好,没有女朋友O(∩_∩)O~。

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

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

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


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


    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(); }


    游戏截图:




    最后:我自己建了一个游戏交流群,欢迎动手能力强的童鞋们增加:284815918


                                                        -END-

  • 相关阅读:
    中国用户mac上快速安装nodejs
    移动前端的开发痛点
    前端模块化思考
    tcpdump学习
    curl 同时发送多个请求
    apache 做http代理
    文件 FIFO队列
    mysql多表字段名重复的情况
    时间戳实现增量数据同步
    python 学习
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6733933.html
Copyright © 2011-2022 走看看