#同人游戏脚本语言探索以及wxLua+LuaGL简单测试程序 因为基于对二次元的热爱,一直以来想参与同人游戏的制作。又因为自己在程序设计方面的专长,对于编写游戏的脚本有过深入的调查。 市面上的同人游戏主要是基于ONS和KRKR2(吉里吉里2)的,以AVG游戏为主,再有就是用RPG Maker做的RPG游戏…… 后来国内的66RPG发明了橙光制作工具,这个制作工具还是挺简单便捷的,只不过……这个工具弱化了脚本的功能,不是今天讨论的主要内容…… 由于RPG Maker是商业软件,这个不是太适合做同人游戏的……不得不说尽管是个图形界面工具,但是其提供的脚本功能还是很强大的……RGSS3脚本引擎使用Ruby作为脚本语言,其中的所有基础脚本框架都是可见的并且是可以继承或者做改动的……研究起脚本框架对于游戏的设计还是很有帮助的…… 就ONS和KRKR来说,ONS简单,但是缺乏灵活性,而krkr自由度要大得多,很灵活,但是却不太好掌握。 我探索适合同人游戏的脚本已经很多年了,krkr2不得不说是一个很不错的选择,可以实现绝大部分情况,这个毋庸置疑。而且其使用的TJS脚本基本完全采用js语法,对于懂js的人来说也不难掌握。 但这并没有阻止我继续探索的道路,krkr2的代码好像不是开源的,其实这并不是什么美中不足,因为同人游戏根本不会计较这么多。再有krkr2的可移植性比较令人堪忧。 后来我还调查过一些脚本,包括wxBASIC、sdlBASIC等……我个人还是挺喜欢BASIC的,再加上wxBASIC满足一个小型游戏引擎的基本需求,还有什么不满足的呢? 但是自从Lua从我眼前飘过的时候,我觉得,就是它了……Lua的方便扩展性和移植性是一个很大的Buff,看到它的时候两眼是放光的…… wxLua跟wxBASIC一样,能满足基本的需求,但是wxBASIC内置OpenGL接口,这个很逆天啊,不行,我也要我的wxLua支持OpenGL…… 于是几年之后的一天,也就是几个月前,在我研究WebGL颇有收获的时候,我决定试一下wxLua对OpenGL的支持…… 可惜,默认的wxLua的windows版本是不编译GLCanvas的……本来我想自己编译一份的,无奈要编译wxWidgets需要搭建的环境还是蛮复杂的……在经历了一晚上编译无果后,我决定直接用Lua for Windows中的wxLua和LuaGL……(验证可行性不需要这么较真) 于是经过一晚上的各种折磨,一个简单的HelloWorld级别的wxLua+LuaGL的测试代码就这么诞生了。 下载地址: [wxLua+LuaGL简单测试程序运行效果](http://pan.baidu.com/s/1slNSTy9 "wxLua+LuaGL简单测试程序运行效果") 运行效果: ![wxLua+LuaGL简单测试程序运行效果](demo.png "wxLua+LuaGL简单测试程序运行效果") 源码: ```lua --[[ examples: http://luagl.sourceforge.net/examples/glcanvas.wx.lua solve the windows exit problem: https://sourceforge.net/p/wxlua/mailman/message/31295985/ ]]-- --[[ examples: http://luagl.sourceforge.net/examples/glcanvas.wx.lua solve the windows exit problem: https://sourceforge.net/p/wxlua/mailman/message/31295985/ ]]-- local wx = require("wx") local gl = require("luagl") local glu = require("luaglu") local bit = require("bit") function render() local dc = wx.wxPaintDC(canvas) gl.Rotate(1,1.0,1.0,1.0) gl.ClearColor(0, 0, 0, 0) gl.Clear(bit.bor(gl.COLOR_BUFFER_BIT,gl.DEPTH_BUFFER_BIT)) gl.Begin(gl.QUADS); gl.Normal( 0.0, 0.0, 1.0); gl.Color( 0.0, 0.0, 1.0); gl.Vertex( 0.5, 0.5, 0.5); gl.Vertex(-0.5, 0.5, 0.5); gl.Vertex(-0.5,-0.5, 0.5); gl.Vertex( 0.5,-0.5, 0.5); gl.Normal( 0.0, 0.0,-1.0); gl.Color( 0.0, 1.0, 0.0); gl.Vertex(-0.5,-0.5,-0.5); gl.Vertex(-0.5, 0.5,-0.5); gl.Vertex( 0.5, 0.5,-0.5); gl.Vertex( 0.5,-0.5,-0.5); gl.Normal( 0.0, 1.0, 0.0); gl.Color( 1.0, 0.0, 0.0); gl.Vertex( 0.5, 0.5, 0.5); gl.Vertex( 0.5, 0.5,-0.5); gl.Vertex(-0.5, 0.5,-0.5); gl.Vertex(-0.5, 0.5, 0.5); gl.Normal( 0.0,-1.0, 0.0); gl.Color( 1.0, 1.0, 0.0); gl.Vertex(-0.5,-0.5,-0.5); gl.Vertex( 0.5,-0.5,-0.5); gl.Vertex( 0.5,-0.5, 0.5); gl.Vertex(-0.5,-0.5, 0.5); gl.Normal( 1.0, 0.0, 0.0); gl.Color( 1.0, 0.0, 1.0); gl.Vertex( 0.5, 0.5, 0.5); gl.Vertex( 0.5,-0.5, 0.5); gl.Vertex( 0.5,-0.5,-0.5); gl.Vertex( 0.5, 0.5,-0.5); gl.Normal(-1.0, 0.0, 0.0); gl.Color( 0.0, 1.0, 1.0); gl.Vertex(-0.5,-0.5,-0.5); gl.Vertex(-0.5,-0.5, 0.5); gl.Vertex(-0.5, 0.5, 0.5); gl.Vertex(-0.5, 0.5,-0.5); gl.End() canvas:SwapBuffers() dc:delete() end function TimerTick(event) if not canvas then return nil end canvas:Refresh(false) end frame = nil frame = wx.wxFrame( wx.NULL, wx.wxID_ANY, "wxLua + LuaGL 测试", wx.wxDefaultPosition, wx.wxSize(450, 450), wx.wxDEFAULT_FRAME_STYLE + wx.wxFULL_REPAINT_ON_RESIZE) frame:Centre() frame:SetIcon(wx.wxIcon("favicon.ico",wx.wxBITMAP_TYPE_ICO)) local fileMenu = wx.wxMenu() fileMenu:Append(wx.wxID_EXIT, "退出(&X)", "退出程序!") local helpMenu = wx.wxMenu() helpMenu:Append(wx.wxID_ABOUT, "关于(&A)", "关于程序的一些说明") local menuBar = wx.wxMenuBar() menuBar:Append(fileMenu, "游戏(&F)") menuBar:Append(helpMenu, "帮助(&H)") frame:SetMenuBar(menuBar) frame:CreateStatusBar(1) frame:SetStatusText("欢迎查看 wxLua + LuaGL 测试程序。") frame:Connect(wx.wxID_EXIT, wx.wxEVT_COMMAND_MENU_SELECTED,function (event) frame:Close(true) end ) frame:Connect(wx.wxID_ABOUT, wx.wxEVT_COMMAND_MENU_SELECTED,function (event) wx.wxMessageBox('wxLua + LuaGL 测试', "关于应用", wx.wxOK + wx.wxICON_INFORMATION, frame) end ) -- This is where the GLCanvas is created canvas = wx.wxGLCanvas(frame, wx.wxID_ANY, wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxEXPAND) -- A GLContext is created context = wx.wxGLContext(canvas) -- Connect the PAINT event to the render function canvas:Connect(wx.wxEVT_PAINT, render) frame:Show(true) --only showed canvas has perfix width and height context:SetCurrent(canvas) gl.Enable(gl.DEPTH_TEST); local w, h = canvas:GetClientSizeWH(); gl.Viewport(0, 0, w,h); gl.MatrixMode(gl.PROJECTION); gl.LoadIdentity(); gl.Frustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); gl.MatrixMode(gl.MODELVIEW); glu.LookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); -- Refresh the canvas so that it gets properly resized and rendered. canvas:Refresh() gstimer = wx.wxTimer(frame) frame:Connect(wx.wxEVT_TIMER, TimerTick) gstimer:Start(50) wx.wxGetApp():MainLoop() ``` 好了,这篇文章就写这些,下篇文章跟大家~~显摆~~分享一下我几个月之前研究WebGL的~~丰硕~~成果~期待一下~


程明2024-1-19 05:34:29 说:
亲爱的朋友:您好!中国各地出现了新冠变种毒株JN.1,传播速度比原来的XBB变种加快七到八倍,各地死亡人数在持续攀升,很多病患突然猝死。 送您躲避瘟疫保平安的方法。网址1:https://d14j9nji5l5p80.cloudfront.net/24gj 网址2:bitly.net/p555p
发表评论

必填,公开,这样称呼起来方便~

必填,不会被公开,不必担心~

http://

非必填,公开,目的是方便增进友好访问~

必填,请输入下方图片中的字母或数字,以证明你是人类

看不清楚
必填,最好不要超过500个字符
     ↑返回顶端↑