#同人游戏脚本语言探索以及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