利用Lua做游戏脚本

您所在的位置:网站首页 andlua辅助制作教程 利用Lua做游戏脚本

利用Lua做游戏脚本

2023-10-12 18:19| 来源: 网络整理| 查看: 265

关于脚本

对于游戏脚本有两种解释,一般的解释是“外挂”,也就是自动刷怪等等的那种挂。一种是让脚本和游戏主体沟通,将逻辑单独拎出来的编程技术。我们这里说的不是外挂,说的是如何使用Lua语言做脚本,并且辅助我们自己的游戏主体的编程手段。

预备知识

这个例子使用C++和SDL2制作游戏的主体,Lua作为游戏的脚本。另外需要知道Lua和C/C++互相通信的方法,见这篇博客

注意事项

这个例子是在MacOS系统下编写的。由于用到了动态链接库的创建,如果你是Windows系统的话,需要修改动态链接库部分的代码和编译过程。

例子的目标

我们的例子很简单,场上有两个方块,红色的是敌人,绿色的是玩家,玩家要保持移动不让敌人追上即可。如果追上了就会弹出游戏结束的对话框,并且关闭游戏:

截图1 游戏结束 让我们开始吧!

首先让我们把主体的代码框架搭出来,下面的main.cpp可以创建一个800x800大小的窗体: 1234567891011121314151617181920212223242526272829303132333435//main.cpp#include #include #include using namespace std;SDL_Window* window = nullptr;SDL_Renderer* render = nullptr;int main(int argc, char** argv){ SDL_Init(SDL_INIT_EVERYTHING); window = SDL_CreateWindow("lua script", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 800, SDL_WINDOW_SHOWN); render = SDL_CreateRenderer(window, -1, 0); SDL_Event event; bool isquit = false; //flag1 while(!isquit){ SDL_SetRenderDrawColor(render, 100, 100, 100, 255); SDL_RenderClear(render); while(SDL_PollEvent(&event)){ switch(event.type){ case SDL_QUIT: isquit = true; break; } //flag2 } //flag3 SDL_RenderPresent(render); SDL_Delay(30); } SDL_Quit(); return 0;}

这里的几个flag是我们后面要添加代码的地方。

接下来我们要编写关于人物的类:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647//role.hpp#ifndef __ROLE_HPP__#define __ROLE_HPP__#include #include //导入lua文件#include #include #define WIDTH 50 //方块的宽度#define HEIGHT 50 //方块的高度using namespace std;//敌人和玩家的基类class Role{public: Role(int nx, int ny); //初始化和Lua交互的lua_State栈 virtual void initLua(string luafile, SDL_Renderer* render); //绘制 virtual void draw(SDL_Renderer* render); //获得X和Y坐标 int getX(); int getY(); //析构函数,我们要在这里关闭lua栈 ~Role();protected: int x; int y; SDL_Color color; int speed; lua_State* S;};class Player:public Role{public: Player(int nx, int ny); //玩家需要接受按键控制,这个是处理按键的函数 void dealEvent(SDL_Event& event);};class Enemy:public Role{public: Enemy(int nx, int ny); //这个函数让敌人跟踪玩家 void follow(Role& role);};#endif

接下来是实现这些类: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124#include "role.hpp"Role::Role(int nx, int ny):x(nx), y(ny){ speed = 5; S = nullptr;}int Role::getX(){ return x;}int Role::getY(){ return y;}Role::~Role(){ lua_close(S);}void Role::initLua(string luafile, SDL_Renderer* render){ //首先创建栈并且打开Lua标准库 S = luaL_newstate(); luaL_openlibs(S); //加载Lua脚本文件 int error = luaL_loadfile(S, luafile.c_str()); //判断脚本是否有效 if(error != LUA_OK){ cerr



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3