本系列文章由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-

DirectX游戏开发——从一个小游戏開始的更多相关文章

  1. python开发_自己开发的一个小游戏

    先看看游戏的运行效果: 看完游戏的运行情况,你可能对游戏有了一定了了解: #运行游戏后,玩家首先要进行语音的选择,1选择英语,2选择汉语,其他则默认选择英语 #根据玩家选择的语音,进入不同的语音环境 ...

  2. Egret白鹭开发微信小游戏程序跳转功能(由一个小游戏跳转到另一个小游戏)

    假设我们要实现的功能是从小游戏A跳转到小游戏B 对于小游戏A: (1)在platform.ts中添加代码如下: /** * 平台数据接口. * 由于每款游戏通常需要发布到多个平台上,所以提取出一个统一 ...

  3. 带你使用h5开发移动端小游戏

    带你使用h5开发移动端小游戏 在JY1.x版本中,你要做一个pc端的小游戏,会非常的简单,包括说,你要在低版本的浏览器IE8中,也不会出现明显的卡顿现象,你只需要关心游戏的逻辑就行了,比较适合逻辑较为 ...

  4. 使用PixiJS做一个小游戏

    PixiJS PixiJS使用WebGL,是一个超快的HTML5 2D渲染引擎.作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的.轻量级而且是兼任所有设备的2D库. 官方 ...

  5. Pygame:编写一个小游戏 标签: pythonpygame游戏 2017-06-20 15:06 103人阅读 评论(0)

    大学最后的考试终于结束了,迎来了暑假和大四的漫长的"自由"假期.当然要自己好好"玩玩"了. 我最近在学习Python,本意是在机器学习深度学习上使用Python ...

  6. js实现一个小游戏(飞翔的jj)

    js实现一个小游戏(飞翔的jj) 源代码+素材图片在我的仓库 <!DOCTYPE html> <html lang="en"> <head> & ...

  7. 【读书笔记《Android游戏编程之从零开始》】10.游戏开发基础(View 游戏框架)

    对于玩家来说,游戏是动态的:对于游戏开发人员来说,游戏是静态的,只是不停地播放不通的画面,让玩家看到了动态的效果. 进入Android之前,首先要熟悉三个重要的类:View(视图).Canvas(画布 ...

  8. Unity 2D游戏开发教程之为游戏场景添加多个地面

    Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面. ...

  9. Libgdx游戏开发(2)——接水滴游戏实现

    原文:Libgdx游戏开发(2)--接水滴游戏实现 - Stars-One的杂货小窝 本文使用Kotlin语言开发 通过本文的学习可以初步了解以下基础知识的使用: Basic file access ...

随机推荐

  1. yii2-admin扩展自定义目录

    yii2-admin文件如下.仓库地址:  https://github.com/mdmsoft/yii2-admin/tree/master 复制yii2-admin文件至自定义目录 比如我就复制到 ...

  2. [水煮 ASP.NET Web API2 方法论](12-2)管理 OData 路由

    问题 如何控制 OData 路由 解决方案 为了注册路由,可以使用  HttpConfigurationExtension 类中 MapODataServiceRoute 的扩展方法.对于单一路由这样 ...

  3. javascript大神修炼记(3)——条件分支

    读者朋友们好,我们今天接着前面的讲,前面已经大概了讲了一下运算符,今天的任务主要就是讲解逻辑条件分支,循环. 我们先就来模拟一个逻辑块,就用我们经常接触到的买车票来说吧,车票的价格对不同的人价格是有差 ...

  4. npoi的用法,动态的判断单元格的大小,设置列的宽度

    public MemoryStream GridToExcelByNPOI(DataTable dt, string strExcelFileName) { HSSFWorkbook wk = new ...

  5. 配置文件报错:元素类型 "XXX" 必须后跟属性规范 ">" 或 "/>"

    这是一个比较常见的配置错误,一般分两步. 有的情况的确是xml文件出现了语法问题,可以让IDE来帮我们检查xml文件是否真的出现了语法错误.把xml内容复制进IDE中,让IDE帮我们检查错误. 如上图 ...

  6. Trie树【P3879】 [TJOI2010]阅读理解

    Description 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. Input 第一行为整数N,表示短文 ...

  7. 【BZOJ 4513】【SDOI 2016】储能表

    http://www.lydsy.com/JudgeOnline/problem.php?id=4513 设\(f(i,0/1,0/1,0/1)\)和\(g(i,0/1,0/1,0/1)\)分别表示d ...

  8. java 的环境搭建

    java.JDK 的搭建__本人是在360里下载的.也可以去其它的网站. java.jdk官网地址下载: https://download.oracle.com 二.也可以下载地址:http://do ...

  9. [DesignPattern]Builder设计模式

    模式的定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 模式的使用场景 相同的方法,不同的执行顺序,产生不同的事件结果时: 多个部件或零件,都可以装配到一个对象中,但是 ...

  10. 随机数选择器 Exercise07_13

    import java.util.Scanner; /** * @author 冰樱梦 *时间:2018年下半年 *题目:随机数选择器 */ public class Exercise07_13 { ...