Neko C Engine一个基于 C 语言的游戏基础代码库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Neko C Engine一个基于 C 语言的游戏基础代码库相关的知识,希望对你有一定的参考价值。

原本已经用 C++ 在写着一个游戏代码库了,个人作品,规模很小,只能满足基本的游戏开发需求,后来突发奇想,试着用 C 语言重写了一次自己的游戏代码库,姑且叫做 Neko C Engine 吧,缩写 nkCEngine,基于 Windows 系统,底层封装了 Win32 窗口、D3D、DirectSound 等等,使用的时候不需要操心 Win32 窗口,不需要操心绘图与音效播放的细节,直接一个 C 函数创建对象,然后用对应的 C 函数操作对象;

这个库的最终目标,是希望公开出来给所有对游戏开发感兴趣的入门级游戏开发爱好者用的,写成 C 的形式以降低入门门槛,同时也高度封装了底层细节,基本上一两个函数调用,就可以得到期望的效果,下面来看一个简单的例子,这个例子演示了如何创建基于 nkCEngine 的空白工程,这个工程会显示一个空白窗口,作为后续例子的基础使用,下面是代码:  

 1 #include "../nkCEngine/nkCEngine.h"
 2 
 3 void OnGameInit(void)
 4 {
 5     // 在这里初始化游戏资源
 6 }
 7 
 8 void OnGameUninit(void)
 9 {
10     // 在这里销毁游戏资源
11 }
12 
13 void OnGameFrame(void)
14 {
15     // 在这里处理游戏逻辑与图形绘制
16 }
17 
18 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, LPSTR lpszCmdLine, INT nCmdShow)
19 {
20     // 启动引擎
21 
22     nkAppStartup();
23 
24     // 初始化游戏资源
25 
26     OnGameInit();
27 
28     // 开始游戏主循环
29 
30     while(nkTrue == nkAppHandleMessage())
31     {
32         nkRenderDevClearColorBuffer();
33 
34         // 进行游戏帧处理
35 
36         OnGameFrame();
37 
38         nkRenderDevPresent();
39     }
40 
41     // 销毁游戏资源
42 
43     OnGameUninit();
44 
45     // 关闭引擎
46 
47     nkAppShutdown();
48 
49     return 0;
50 }

上述代码编译运行后,可以看到如下的一个空白窗口,这个窗口在游戏的每一帧,都会用灰色填充整个窗口客户区,并且预留出三个接口函数,如果没有特别需求的话,日后只需要在这三个函数里面添加代码即可:

技术分享

接下来我们看看如何使用精灵对象绘制图像,在 nkCEngine 引擎中,一个精灵对象(Sprite)封装了图形绘制的基本操作,比如缩放、设置绘制位置、设置绘制大小、设置透明度等等,这个例子我们仅仅加载一张图片,并将其显示出来:

 1 #include "../nkCEngine/nkCEngine.h"
 2 
 3 nkTexture * g_pTexture; // 精灵所依赖的纹理对象
 4 nkSprite2D * g_pSprite; // 精灵对象
 5 
 6 void OnGameInit(void)
 7 {
 8     // 创建精灵对象
 9 
10     g_pTexture = nkTextureCreateFromFile(L"エロゲームキャプチャー.bmp", 0);
11     g_pSprite = nkSprite2DCreate(g_pTexture);
12 }
13 
14 void OnGameUninit(void)
15 {
16     // 销毁精灵对象
17 
18     nkSprite2DFree(g_pSprite);
19     nkTextureFree(g_pTexture);
20 }
21 
22 void OnGameFrame(void)
23 {
24     // 绘制精灵
25 
26     nkSprite2DDraw(g_pSprite);
27 }
28 
29 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, LPSTR lpszCmdLine, INT nCmdShow)
30 {
31     // 启动引擎
32 
33     nkAppStartup();
34 
35     // 初始化游戏资源
36 
37     OnGameInit();
38 
39     // 开始游戏主循环
40 
41     while(nkTrue == nkAppHandleMessage())
42     {
43         nkRenderDevClearColorBuffer();
44 
45         // 进行游戏帧处理
46 
47         OnGameFrame();
48 
49         nkRenderDevPresent();
50     }
51 
52     // 销毁游戏资源
53 
54     OnGameUninit();
55 
56     // 关闭引擎
57 
58     nkAppShutdown();
59 
60     return 0;
61 }

上述代码中,首先通过纹理对象加载硬盘上的 bmp 图像文件,随后使用纹理对象来创建精灵对象,之所以将两者分开创建,是考虑到游戏开发中很多时候,都是多个精灵共用一张纹理,为了节省资源,没有必要为每一个使用相同纹理的精灵独立创建自己的纹理对象,考虑一下射击游戏中敌人的子弹,如果每个子弹都各自加载一张图像文件,对于机器的硬件消耗,是非常高的,上述代码中,在 OnGameInit() 函数中使用 nkTextureCreateFromFile() 函数从硬盘上加载图像并创建纹理对象,随后调用 nkSprite2DCreate() 函数创建精灵,然后在 OnGameFrame() 函数中,调用 nkSprite2DDraw() 函数绘制精灵,最终效果如下图所示:

技术分享

接下来,我们看看如何绘制文本,在 nkCEngine 中,使用 nkFont 对象进行文本的绘制操作,我们看看具体代码:

 1 #include "../nkCEngine/nkCEngine.h"
 2 
 3 nkTexture * g_pTexture; // 精灵所依赖的纹理对象
 4 nkSprite2D * g_pSprite; // 精灵对象
 5 nkFont * g_pFont; // 文本对象
 6 
 7 void OnGameInit(void)
 8 {
 9     // 创建精灵对象
10 
11     g_pTexture = nkTextureCreateFromFile(L"エロゲームキャプチャー.bmp", 0);
12     g_pSprite = nkSprite2DCreate(g_pTexture);
13 
14     // 创建文本对象
15 
16     g_pFont = nkFontCreate(L"宋体", 24);
17 }
18 
19 void OnGameUninit(void)
20 {
21     // 销毁精灵对象
22 
23     nkSprite2DFree(g_pSprite);
24     nkTextureFree(g_pTexture);
25 
26     // 销毁文本对象
27 
28     nkFontFree(g_pFont);
29 }
30 
31 void OnGameFrame(void)
32 {
33     u32 i;
34     u32 uWidth;
35     u32 uHeight;
36 
37     // 绘制精灵
38 
39     nkSprite2DDraw(g_pSprite);
40 
41     // 计算文本绘制时所需的图形大小
42 
43     nkFontCalcUTextSize(
44         g_pFont,
45         L"我爱黄油!",
46         6,
47         &uWidth,
48         &uHeight);
49 
50     // 绘制一系列的文本
51 
52     for(i = 0; i < 10; ++ i)
53     {
54         nkFontDrawUText(
55             g_pFont,
56             L"我爱黄油!",
57             5,
58             (u32)(g_pTexture->fTextureWidth) + ((i + 1) * 16),
59             ((i + 1) * uHeight),
60             168,
61             32,
62             0xFFFFFFFF,
63             0);
64     }
65 }
66 
67 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, LPSTR lpszCmdLine, INT nCmdShow)
68 {
69     // 启动引擎
70 
71     nkAppStartup();
72 
73     // 初始化游戏资源
74 
75     OnGameInit();
76 
77     // 开始游戏主循环
78 
79     while(nkTrue == nkAppHandleMessage())
80     {
81         nkRenderDevClearColorBuffer();
82 
83         // 进行游戏帧处理
84 
85         OnGameFrame();
86 
87         nkRenderDevPresent();
88     }
89 
90     // 销毁游戏资源
91 
92     OnGameUninit();
93 
94     // 关闭引擎
95 
96     nkAppShutdown();
97 
98     return 0;
99 }

 上述代码中,使用 nkFontCreate() 函数创建文本对象,然后使用 nkFontDrawUText() 函数绘制 Unicode 字符串,最后使用 nkFontFree() 函数释放文本对象,最终运行效果图如下所示:

技术分享

原本应该还有一个播放音频的例子,但是通过博文,无法直观地感受到播放音频的效果,所以播放音频的例子就不写了。目前 nkCEngine 还处于初步开发阶段,距离真正发布还有很长的路要走,nkCEngine 的灵感来自国外的 DxLib 游戏库,DxLib 是一个非常庞大、非常强大的游戏代码库,并且开源,如果大家有兴趣,可以到雅虎或者谷歌上搜索 DxLib。博主深知目前市面上有太多成熟的,强大的游戏代码库,再去造这个轮子,实在是没有必要,但是,来自心灵的呐喊,让我的双手不自觉打开了 IDE,并编写了这个游戏代码库,真希望日后有一天能够看到别人使用自己编写的库来编写游戏程序;

-- 2016-10-09 22:41 PM By NekoDev cnblogs

 

以上是关于Neko C Engine一个基于 C 语言的游戏基础代码库的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #614 (Div. 2) C - NEKO's Maze Game

基于SAT的数独游戏求解程序,求C语言代码

小项目特供 贪吃蛇游戏(基于C语言)

Codeforces . C.Neko does Maths

CodeForces-1152C-Neko does Maths

Codeforces Round #614 (Div. 2)C - NEKO's Maze Game