面向猛新的小游戏制作 - EasyX 超级马里奥

面向猛新的小游戏制作 - EasyX 超级马里奥

近些日子有同学与我聊起来学校的小学期任务是用 EasyX 做一款超级马里奥,不由得来了兴趣,毕竟在一个月左右的时间内,以大多数同学的编程水平,在只提供了图形接口功能的 EasyX 图形库基础上去实现一个包含渲染、音频、数据存档和物理模拟的一个卷轴关卡游戏,本身的难度还是有的,更何况即便是单个功能可以花费点时间探究予以实现,但当整个程序作为一个具有游戏逻辑的系统时,就考验语法之上的架构能力了,如何使用面向对象进行类的划分,系统之间如何通信进行数据的传递,如何将输入与渲染的结果动态地呈现在窗口中……如果要相对完美地实现这些功能,对编程经验还是有一定的考验的。

念及在初学编程时对 EasyX 的旧情,便想挑战一下,看看现在的自己多少时间可以完成一个功能相对完整的超级马里奥。结果便是差不多花费了总计三天左右,在工作之余的摸鱼时间中、牺牲了部分休息时间,完成了一份有效代码约 1.5K 行,稍具可玩性的游戏程序,想到可能自己在编程过程中的思路可能对使用 EasyX 的初学者具有启发意义,便写下这篇文章,希望借此抛砖引玉。

阅读更多

小说,日记,博客

应该是接触文学作品比较早的缘故,从小我便对文字创作有着比较浓厚的兴趣,从一开始不痛不痒的日记,到后来逐渐轮廓分明的小说,虽然文笔不见得随着岁月长进许多,但是笔下的内容却有了不小的变化。

记得小时候父母是鼓励我写点东西的,愿意拿出最精致的笔记本,任由我在上面写下稚嫩的文字。现在已经不记得最开始时写过什么,只记得后来更多的是天马星空的想象,一些在那时候的自己看起来充满想象力的英雄故事,或者是类似《玩具总动员》剧情中的玩具世界的故事——那时候玩具堆中最多的便是乐高,于是充满无限可能的方块世界大概是那时候的创作灵感。其实想象力应该至少是平均水平,父母说我小时候,可以躺在床上看着电风扇,联想到大飞机,然后是环游世界,故事可以不停歇地讲半个小时,虽然这些我都早已忘记。

在应试教育的大背景下,更早地开始动笔写点东西,似乎可以更轻松地应对学校生活中的语文课程,尤其是作文这个大BOSS。但是事实上我对作文的兴趣并不大,小学中学时写的记叙文,大致是要你用浅薄的人生经历讲述出起承转合的精彩故事,把一场感冒描述成鬼门关体验卡,把一次旅行描述成大总统的周游列国;到了高中,记叙文被斩落马下,应对高考的议论文成为了新宠,什么并列式、对照式、层进式,然后三段论等种种条条框框,配合唯分数论的枷锁,完美地将你塑造成阅卷老师想要的样子。这大抵是十分不自由的,于是高中时的我,竟然重拾了小时候创作小说的爱好,在枯燥的议论文缝隙中间,写点属于我自己的文字。

阅读更多

DirectX 11 Tutorials 5 - 纹理贴图

原文链接:http://www.rastertek.com/dx11s2tut05.html

本教程将介绍如何在 DirectX 11 中使用纹理,纹理使我们能够通过将照片和其他图像应用到多边形面上,为场景添加真实感。

例如,在本教程中,我们将使用如下图像:

纹理贴图

然后将其应用于上一教程中的多边形,以生成如下内容:

纹理效果

我们将使用的纹理格式是 .tga 文件,这是支持红色、绿色、蓝色和 alpha 通道的常见图形格式。你可以使用任何通用图像编辑软件创建和编辑 targa 文件,这种文件格式一般是可以直接使用的。

在我们进入代码之前,我们应该讨论纹理贴图是如何工作的。

阅读更多

DirectX 11 Tutorials 4 - 缓冲区、着色器和 HLSL

原文链接:http://www.rastertek.com/dx11s2tut04.html

本教程将介绍如何在 DirectX 11 中编写顶点和像素着色器,还将介绍如何在 DirectX 11 中使用顶点和索引缓冲区,这些是渲染 3D 图形时需要理解和利用的最基本概念。

顶点缓冲区

首先要理解的概念是顶点缓冲区,为了说明这个概念,让我们以球体的 3D 模型为例:

3D球体模型图1

3D 球体模型实际上由成百上千个三角形组成:

3D球体模型图2

球体模型中的每个三角形都有三个点,我们称每个点为顶点,因此,为了渲染球体模型,我们需要将构成球体的所有顶点放入一个特殊的数据数组中,我们称之为顶点缓冲区;一旦球体模型的所有点都被放置到了顶点缓冲区中,我们就可以将顶点缓冲区发送到 GPU,来将模型渲染出来。

阅读更多

DirectX 11 Tutorials 3 - 初始化 DirectX 11

原文链接:http://www.rastertek.com/dx11s2tut03.html

本教程将首次介绍如何使用DirectX 11,我们将讨论如何初始化和关闭 Direct3D,以及如何将内容渲染到窗口。

更新后的框架

我们将向框架中添加另一个类,该类将处理所有 Direct3D 系统的功能。我们称之为 D3DClass,更新后的框架图如下:

框架示意图

正如你所见,D3DClass 位于 GraphicsClass 内部;在之前的教程提到过,所有与图形有关的类都将封装在 GraphicsClass 中,所以我们新增的 D3DClass 类放到这里最为合适。

现在,让我们看看对 GraphicsClass 所做的更改。

阅读更多

DirectX 11 Tutorials 1 - 使用 Visual Studio 设置 DirectX 11

原文链接:http://www.rastertek.com/dx11s2tut01.html

在编写任何图形代码之前,我们都需要有相关的工具,这些工具中的最关键的是编译器,并且它最好是内置在一个好的 IDE 中。

我使用 Visual Studio 2015 来编写项目。还有其他几种,有些是免费的,想用哪个由你自己来决定。我个人推荐 Visual Studio 2015 社区版,因为它是一个优秀的免费 IDE 。你可以从 Visual Studio 官网下载 Visual Studio 2015 社区版。在安装 VisualStudio 2015 时,请确保选择“自定义”并选择“安装全部”,以便所有 Visual C++ 组件都安装好,否则它将主要设置为 C# 语言开发。

你需要的第二个工具是 Windows 10 SDK 。

阅读更多

DirectX 11 Tutorials 2 - 创建框架和窗口

原文链接:http://www.rastertek.com/dx11s2tut02.html

在开始使用 DirectX 11 编码之前,我建议构建一个简单的代码框架。该框架将处理基本的窗口功能,并为学习 DirectX 11 提供一种以有组织和可读的方式扩展代码的简单方法。由于这些教程的目的只是尝试 DirectX 11 的不同功能,而不是构建完整的渲染引擎,所以我们将有目的地尽可能保持框架精简。一旦你掌握了DirectX 11,你就可以研究如何构建一个现代化的图形渲染引擎。

框架简介

框架从以下四部分着手搭建:

  1. WinMain 函数来处理应用程序的入口点。
  2. 定义 SystemClass,封装从 WinMain 函数中调用的整个应用程序
  3. 在系统类中,我们定义 GraphicsClass 来处理 DirectX 图形代码;
  4. 除此之外,定义 InputClass 来处理用户的输入。
阅读更多

《Windows游戏编程大师技巧》学习笔记(八)

图形设备描述表

作者在书中对其阐释:

图形设备描述表

画笔和画刷

  • 画笔:用于画线条和轮廓,具有颜色、粗细和线型;
  • 画刷:用于填充任何封闭对象,具有颜色、样式,甚至本身可以是位图;

画笔和画刷

GDI一般只使用一个画笔和一个画刷,即当前的图形设备描述表中每次只有一个画笔或画刷被激活;
所以在绘图前,要先选定一个画笔/画刷,需要注意的是,一旦选定后,直到被修改或程序结束,该画笔/画刷会一直被使用;
GDI关于画笔和画刷句柄的存取位置有限,且创建的画笔和画刷占用系统资源,完成绘图之后务必删除该画笔/画刷;

阅读更多

《Windows游戏编程大师技巧》学习笔记(七)

窗口事件

与窗口有关的消息简介:

窗口事件消息

WM_ACTIVATE消息

1
2
3
bActive = LOWORD(wParam);           // 激活标志
bMinimized = (BOOL)HIWORD(wParam); // 最小化标志
hwndPrevious = (HWND)lParam; // 窗口句柄

上述代码中bActive可能的取值如下:

激活标志

bMinimized表示窗口是否已最小化;
hwndPrevious指将被激活或被取消激活的句柄,具体含义由bActive的值决定:如果bActive的值为WA_ACTIVEWA_CLICKACTIVEhwndPrevious是被取消激活的窗口的句柄,该句柄可能为NULL

1
2
3
4
5
6
7
8
9
10
case WM_ACTIVATE:
if (LOWORD(wparam) != WA_INACTIVE)
{
// 窗口被激活时的逻辑
}
else
{
// 窗口取消激活时的逻辑
}
return 0;
阅读更多

《Windows游戏编程大师技巧》学习笔记(六)

WM_PAINT 消息

在之前的代码中,我们对于WM_PAINT消息的处理方式如下:

1
2
3
4
5
6
7
8
PAINTSTRUCT	ps;
HDC hdc;

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
// 在此处执行绘图操作
EndPaint(hwnd, &ps);
return 0;

如下图所示,当一个窗口被移动、改变大小或被其他窗口遮盖时,WN_PAINT消息便被发送了:

WM_PAINT消息

阅读更多