自学程序加工作好几年了,是时候来练个手了(不算用引擎开发游戏)。之前Google学习资料的时候,找到一个弹幕射击游戏的教程,稍微瞄了眼,还挺不错的,但用的是封装的DxLib库,这就不开心了,后面就没看了。学习DirectX也有年头了,觉得是时候可以练习下,但不打算用DirectX来开发,打算用最近刚学习的SDL或者SFML来开发。

为了加大难度,就打算采用C++加Lua的方式来开发,不用第3方库,全部自己手写导出到Lua这边,加深一下自己对C++和Lua的通信原理。

PS:之前有人联系我说,说看不懂,还说只有写的人能看懂,还有让我帮你来做功能的。我就奇了怪了,你自己基础不到位,怪作者,为啥不怨一下你自己不努力呢?

准备工作
        IDE用的是Visual Stuido 2019,这个下载就不介绍了,版本很新,一直在推荐更新╮(╯▽╰)╭。接下来准备lua源码和SDL库。

Lua准备工作

去lua官网(https://www.lua.org/download.html)下载源代码。

新建一个Visual Stuido空工程,空工程名为Lua,将刚才下的lua源码解压,解压得到lua-5.3.5文件夹,将lua-5.3.5文件夹中的子文件夹src文件夹整个拷贝到刚建Lua空工程目录下。在Solution Explorer(解决方案管理器)窗口选择Lua工程,然后在Solution Explorer窗口的工具栏上点击Show All Files按钮。

然后就会看到刚才拷贝过来的src文件夹。然后选择src文件夹,右键点击Include In Project(包含到工程中),然后在src文件中找到lua.c和luac.c文件,右键点击Exclude In Project(从工程中排除)。

右键Lua工程,点击属性按钮,先将EXE工程改成静态库工程。

接着修改Output Directory(输出目录)和Intermediate Directory(中间目录),也可以不改,用默认的也可以,主要是这样链接Lua库比较方便。
Output Directory(输出目录):$(SolutionDir)bin\$(Platform)\$(Configuration)\$(ProjectName)\
Intermediate Directory(中间目录):$(SolutionDir)bin-int\$(Platform)\$(Configuration)\$(ProjectName)\


        然后右键Lua工程编译得到Lua.lib。Lua这边的准备工作就已经完成了,接下来就是测试。
        接着在同一个Solution下新建一个Visual Stuido空工程,空工程名为Ryuujinn(日语名为龍(りゅう)(
ryuu)神(じん)(jinn))。右键Ryuujinn工程添加新文件夹,命名为Source,再在Source目录下添加新文件Main.cpp(这个就不需要列出具体步骤吧)。

现在需要做的事,是链接Lua库来测试。首先右键Ryuujinn工程,点击属性按钮,修改Output Directory和Intermediate Directory,改成跟Lua工程一样的,这个步骤上面有,就不再介绍了。
        点击属性面板中左侧的C/C++按钮,选择General(一般),然后在右侧的Additional Include Directories(附加的包含目录)中添加Include;$(SolutionDir)Lua\Src;Include指的是我等下会再建一个Include文件夹目录,$(SolutionDir)Lua\Src指的是之前创建Lua工程下的拷贝过来的lua源码目录。


        接着点击属性面板中左侧的Linker(链接器)按钮,选择General(一般),然后在右侧的Additional Library Directories(附加的库目录)中添加$(SolutionDir)bin\$(Platform)\$(Configuration)\Lua\;这个$(SolutionDir)bin\$(Platform)\$(Configuration)\Lua\就是前面Lua工程中Output Directory的目录。之前说修改Output Directory和Intermediate Directory的方便就在这个地方。如果没有修改的话,就需要自己去定位到静态库的生成目录。


        好了,链接Lua库的大部分工作做完了,开始测试是否可以调用Lua。在之前添加的Main.cpp中添加如下代码:

// 引入lua需要的头文件
extern "C"
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}// 链接Lua工程生成的静态库
#pragma comment(lib, "Lua.lib")#include <iostream>int main()
{// 创建虚拟栈lua_State* L = luaL_newstate();// 引入lua的标准库,不然调用print会报错,可以注释掉代码,查看报错luaL_openlibs(L);// 很简单的lua代码,输出Hello, luaconst char* strLuaScript = R"(print("Hello, lua"))";// 执行lua代码int result = luaL_dostring(L, strLuaScript);if (LUA_OK != result)std::cout << lua_tostring(L, -1) << std::endl;else{}// 关闭虚拟栈lua_close(L);system("pause");return 0;
}

代码中注释很多,就不一一解释了,如果想要仔细了解C++调用Lua,可以通过百度和Google搜索文章看,也可以通过搜视频看,国内有一个还可以,但是需要付费,也不贵(60多),但我就不列出具体网址了,国外的我在看,讲的很不错,英文不错的可以看下,网址在这里,需要科学上网,最近有个测试的酷鸟浏览器是可以科学上网看的(用过,比较差,经常打不开,或者看到一半就挂了,勉强能用)
        如果输出了Hello, lua就说明lua配置没有问题。lua配置就到此结束了,接下来就是SDL的配置了。

SDL准备工作

去SDL官网(https://www.libsdl.org/download-2.0.php)下载Development Libraries。还需SDL的扩展库SDL_Image,去该网址下载(https://www.libsdl.org/projects/SDL_image/)Development Libraries。

将下载的2个文件都解压,放到自己喜欢的硬盘下,接下来配置环境变量,因为我存放到D盘下,文件名为_SDL2-2.0.10和_SDL2_image-2.0.5,因此我的环境变量是
SDL_IncludePath: "D:_SDL2-2.0.10\include"
SDL_LibraryPath: "D:_SDL2-2.0.10\lib"
SDL_Image_IncludePath: "D:_SDL2_image-2.0.5\include"
SDL_Image_LibraryPath: "D:_SDL2_image-2.0.5\lib"


        win7只能截成这样了,win10的话就会好一点。环境变量生效的话需要重启Visual Studio 2019,如果不生效,就关闭explorer.exe,再不行就重启电脑就OK。
        跟之前配置Lua一样,在Ryuujinn工程的属性面板上添加刚配置好的环境变量就OK:Additional Include Directories(附加的包含目录)再添加$(SDL_IncludePath);$(SDL_Image_IncludePath)。


Additional Library Directories(附加的库目录)就需要特殊处理下,要根据平台来处理:
32位(Win32)添加$(SDL_LibraryPath)\x86;$(SDL_Image_LibraryPath)\x86;


64位(x64)添加$(SDL_LibraryPath)\x64;$(SDL_Image_LibraryPath)\x64;


        还需要一步处理,也是需要根据平台来,在Ryuujinn工程的属性面板点击左侧的Build Events(编译事件),接着点击Build Events下方的Pre-Build Evnet(预编译事件),在属性面板右侧的Command Line(命令行)中点击,会弹出Edit(编辑)按钮,点击后会弹出一个窗口,接下来填入需要处理的命令。


32位(Win32)添加
XCOPY "$(SDL_LibraryPath)\x86\*.dll" "$(TargetDir)" /D /K /Y
XCOPY "$(SDL_Image_LibraryPath)\x86\*.dll" "$(TargetDir)" /D /K /Y


64位(x64)添加
XCOPY "$(SDL_LibraryPath)\x64\*.dll" "$(TargetDir)" /D /K /Y
XCOPY "$(SDL_Image_LibraryPath)\x64\*.dll" "$(TargetDir)" /D /K /Y


        这2句命令的主要功能就是将之前下载下来的SDL和SDL_Image目录中的DLL拷贝到Ryuujinn工程的生成目录中而已。
SDL配置也已经结束了,接下来在之前Lua测试代码中添加SDL测试代码来测试:
新的Main.cpp:

// 引入lua需要的头文件
extern "C"
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}// 链接Lua工程生成的静态库
#pragma comment(lib, "Lua.lib")#define SDL_MAIN_HANDLED// 引入SDL需要的头文件
#include <SDL.h>
#include <SDL_image.h>// 链接SDL静态库
#pragma comment(lib, "SDL2.lib")
#pragma comment(lib, "SDL2main.lib")
#pragma comment(lib, "SDL2_image.lib")#include <iostream>int main()
{// 创建虚拟栈lua_State* L = luaL_newstate();// 引入lua的标准库,不然调用print会报错,可以注释掉代码,查看报错luaL_openlibs(L);// 很简单的lua代码,输出Hello, luaconst char* strLuaScript = R"(print("Hello, lua"))";// 执行lua代码int result = luaL_dostring(L, strLuaScript);if (LUA_OK != result)std::cout << lua_tostring(L, -1) << std::endl;else{}// 关闭虚拟栈lua_close(L);if (0 != SDL_Init(SDL_INIT_EVERYTHING))return -1;int flags = 0;SDL_Window* pWindow = SDL_CreateWindow("Test", 100, 100, 500, 500, flags);if (!pWindow)return -1;SDL_Renderer* pRenderer = SDL_CreateRenderer(pWindow, -1, 0);SDL_SetRenderDrawColor(pRenderer, 255, 255, 255, 255);if (!pRenderer)return -1;while (1);SDL_DestroyWindow(pWindow);SDL_DestroyRenderer(pRenderer);SDL_Quit();system("pause");return 0;
}

弹出如下窗口,就说明SDL配置成功,但新加的代码是没有测试SDL_Image的配置是否成功的,因为基本差不多,但是要加测试代码,就不是这么一点了,还得找资源就有点麻烦了,可以自行上网搜索添加代码测试。


        如果有下图编译失败的,看是不是这个错误,这个错误的原因是SDL修改了main函数(#define main    SDL_main),这个可以在SDL_main.h头文件中可以查看,解决这个错误有多个方法,这边就采取最简单的,看是不是没有添加#define SDL_MAIN_HANDLED,或者这个是否在#include <SDL.h>之前。

好了,Lua和SDL的配置大体完成了,可以舒一口气了。

源码下载地址

[实战]C++加Lua加SDL来重写龙神录弹幕游戏(1):准备相关推荐

  1. [实战]C++加Lua加SDL来重写龙神录弹幕游戏(6):只读表

    这次就不急着往下讲解游戏功能了,先来说下lua的功能,因为Unity热更新的问题,导致很多手游都会使用c#加lua来开发,因此有很多新手,或者用lua开发了一两年的程序员,还不是很了解lua,在使用中 ...

  2. [实战]C++加Lua加SDL来重写龙神录弹幕游戏(5):添加背景

    敲代码很快,写博客很慢,如果写详细一点,就有点太长了,跟写策划文档没区别了,╮(╯_╰)╭.之前虽然在SDL窗口中显示出了一张人物图片,但也只是为了测试SDL_Image而已.现在就正式来完成这次的工 ...

  3. [实战]C++加Lua加SDL来重写龙神录弹幕游戏(2):Lua创建SDL窗口

    完成了准备工作之后,就可以开始撸代码了.因为项目也不是很大,就打算大部分都用lua来开发.上一篇已经写了一部分测试代码,但都是塞到一个Main.cpp之中,主要是为了测试配置是否成功.这次的工作就要把 ...

  4. [实战]C++加Lua加SDL来重写龙神录弹幕游戏(3):添加Logger类

    上一篇已经完成了Lua调用SDL创建窗口的功能了,めでたしめでたし.但在开始敲游戏代码之前,继续做一个准备工作,添加C++类logger.        在之前的测试中,控制台上全是白色的输出字,一眼 ...

  5. [实战]C++加Lua加SDL来重写龙神录弹幕游戏(4):完善Game类

    大部分前期工作都已经完成了,可以正式开始敲游戏代码了.之前显示的都是死循环的窗口,这次终于可以来解决这个问题了,先看看今天的结果.        这次C++中有部分修改的代码,但有了之前的基础,就不花 ...

  6. 【Python_PySide2学习笔记(一)】PySide2动态加载UI方式,重写关闭窗体事件

    ** PySide2设置关闭提示窗口:动态加载UI方式,重写关闭窗体事件 ** ** 前言 ** 转载:https://blog.csdn.net/qq_44703282/article/detail ...

  7. R语言时间序列(time series)分析实战:时序数据加载、绘制时间序列图

    R语言时间序列(time series)分析实战:时序数据加载.绘制时间序列图 目录

  8. matlab dwt 多层分解,利用matlab对图片进行多层小波分解 会的加QQ511607771 加过作图之后积分加倍送...

    利用matlab对图片进行多层小波分解 会的加QQ511607771 加过作图之后积分加倍送 mip版  关注:96  答案:2  悬赏:0 解决时间 2021-01-23 13:02 已解决 202 ...

  9. openlayers学习——3、openlayers加点加圆加图标图片

    openlayers加点加圆加图标图片 前言:基于Vue,学习openlayers,根据官网demo,记录常用功能写法.本人不是专业GIS开发,只是记录,方便后续查找. 参考资料: openlayer ...

最新文章

  1. 触手可得的云原生 | 阿里云中间件发布多项新功能
  2. 阮一峰的学习Javascript闭包(Closure)
  3. o在linux是什么权限,Linux权限管理基本知识大全
  4. 程序员思维看爱情是什么?
  5. python怎么保存为py文件_将python保存到运行的py文件目录中创建的文件夹中
  6. springMVC学习(1)
  7. 武汉大学计算机学院冯晶,武汉大学国际软件学院导师简介-冯晶
  8. 马云:我是信念坚定的人
  9. html2pdf使用总结
  10. 一个智能家居“适老化”的准样本
  11. 飞机机器人特摄片_机器人大战怪兽-好莱坞的特摄片「环太平洋」
  12. mysql(数据库)初级操作
  13. Windows操作系统查看电脑开关机记录
  14. 编程模式之观察者模式
  15. 三点求圆心坐标(三角形外心)
  16. gdb+openocd+stlink调试MCU
  17. 筛法求素数 (20分)
  18. Unity 支持 3ds max 2021 物理材质吗?(FBX 出口)是否应该使用BPR材质?
  19. 蓝桥杯javaB决赛历届真题6-10届
  20. Win32_17集音频和视频播放功能于一身的简易播放器

热门文章

  1. 1159 字母出现频率(详解study)
  2. BCrypt算法的基础使用
  3. 【BZOJ2393】Cirno的完美算数教室
  4. EFCore 从入门到精通-8(再谈映射关系)
  5. 终于,百度“地震”了!
  6. Python爬虫整理资料素材下载动漫壁纸实战案例8
  7. 推荐阅读:《我在赶集网的两个月》
  8. shell 日期类与字符串转数字的基本操作
  9. 计算机信息安保ppt,安保系统ppt精选.ppt
  10. Github高速下载文件,方法简单,亲测有效