-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei。
转载请注明出处,本文作者:秦元培。 本文出处:http://blog.csdn.net/qinyuanpei/article/details/39826323
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
各位朋友,大家好,我是秦元培,欢迎大家关注我的博客。我地博客地址是blog.csdn.net/qinyuanpei。
假设提到游戏开发,大家一定会想到C/C++、DirectX、OpenGL等这些东西。但是众所周知,游戏行业是一个需求变化极快地行业,假设我们採用编译型的语言,那么我们可能非常难跟上这个时代的步伐,由于编译型的语言每经历一次重大地更新,整个项目都须要又一次编译,这样无疑会影响我们的开发效率。
那么,有没有一种更为高效的游戏开发模式呢?也许答案大家已经看到了。如今在游戏界普遍採用的方式是将游戏的底层逻辑交给C/C++这种底层语言,而将游戏的上层逻辑交给脚本语言。
由于底层逻辑更看重效率而上层逻辑更注重灵活、便捷地使用。比如我们熟知的Unreal引擎是採用UnrealScripts,这是一种相似于Java/C语法地语言。Unity3D引擎是採用的C#/javaScript/Boo这三种脚本语言;cocos2d-x採用地是Lua/javaScript这两种脚本语言,未来可能会支持很多其他的语言。大家可能想问一个问题:什么是脚本语言?所谓脚本语言是一种用来控制软件应用程序且仅仅在被调用时进行解释或编译的编程语言,这种语言通常以文本的形式来存储脚本代码。换句话说。脚本语言相似于一种指令,它缩短了传统应用程序的编写-编译-链接-执行(edit-compile-link-run)这个过程,是一种解释执行的程序。
也许人们发明脚本语言的那一刻起,从未想过要将脚本语言和游戏开发联系在一起,只是脚本语言注定会由于游戏开发而开拓出更为广阔的世界。本文将以眼下游戏开发领域较为流行的Lua语言为线索,深度解密游戏开发领域与脚本语言之间千丝万缕的联系。
一、什么是Lua?
Lua是一个小巧的脚本语言。巴西里约热内卢天主教大学里的一个研究小组于1993年开发,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成。差点儿在全部操作系统和平台上都能够编译,执行。一个完整的Lua解释器只是200k,在眼下全部脚本引擎中,Lua的速度是最快的。
这一切都决定了Lua是作为嵌入式脚本的最佳选择。相比Python和Per的内核。Lua的内核小于120KB。而Python的内核大约860KB,Perl的内核大约1.1MB。Lua语言支持面向对象编程和函数式编程,它提供了一个通用类型的表table,能够实现数组、哈希表、集合、对象的功能。
Lua支持协同进程机制。
作为一门可扩展的语言,Lua提供简单而稳定的交互接口,如Lua和C程序可通过一个堆栈交换数据,这使得Lua语言能够高速地和其他语言实现整合。整体来说。Lua语言具备以下长处:(1)语言优美、轻巧 (2)性能优良、速度快 (3)可扩展性强。
正由于Lua语言具备了这种特点,使得它能和游戏开发领域的需求完美地结合起来。由于我们须要这种一门语言,它能够和C/C++进行完美地交互。由于我们须要它对底层进行封装。它须要足够地简单,由于我们须要简单、灵活、高速地编写代码。
那么显然Lua就是我们一直在寻找地这种语言。
二、Lua能够做什么?
虽然博主已经告诉了大家太多的关于Lua语言的优秀特性,相信大家仍然会对Lua语言的能力存在怀疑。大家也许会想,Lua究竟能够做什么呢?在《Lua游戏开发》一书中作者已经告诉了我们答案:
1、编辑游戏的用户界面
2、定义、存储和管理基础游戏数据
3、管理实时游戏事件
4、创建和维护开发人员友好的游戏存储和加载系统
5、编写游戏的人工智能系统
6、创建功能原型,能够之后用高性能语言移植
这时候我们似乎认为Lua语言在某种程度上就是专门为游戏开发而诞生的,由于它将大量的优秀特性全部指向了游戏开发领域。因此Lua语言走进走进游戏开发领域变得顺利成章,那么,让我们接着往下看吧。Lua在游戏开发领域有那些成熟的案例吧。
三、哪些游戏使用了Lua?
1、魔兽世界
假设提到Lua在游戏领域中第一次崭露头角,我们就不能不说《魔兽世界》这款游戏。由于《魔兽世界》在其client中使用了Lua。使得Lua在游戏领域的作用第一次被展示出来。Lua语言因此在游戏开发领域成名。Lua语言的虚拟机非常轻巧,能够非常easy地嵌入到client程序中。假设须要更新client,仅仅须要更新脚本程序就可以。无需又一次编译整个client。
这样地长处使得Lua在游戏开发领域一战成名。能够说是《魔兽世界》为游戏开发领域带来了这样激动人心的伟大语言,作为Lua在游戏领域攻城略地的尝试,《魔兽世界》功不可没。
2、大话西游2
假设说《魔兽世界》开辟Lua在国外游戏领域地战场,那么网易的《大话西游2》无疑是开启了国内游戏制作公司使用Lua的先河。2002年网易开发《大话西游2》时,决定在client内嵌入新的脚本语言。由于当时使用的微软JScript存在较多Bug、维护不便、兼容性差。当时该项目技术负责人云风吸取了《大话西游1》时外挂泛滥的教训,决定选择一个新的语言。这样既能摆脱对JScript的依赖,又能有效地打击外挂制作者,权衡再三。终于选择了Lua 4.0。后来《大话西游2》在市场上取得了成功,国内游戏开发行业纷纷受此影响採用Lua,能够说是网易Lua走进了国内开发人员的视野。只是到今天为止。Lua在国内仍然是一门较为小众的语言。从《大话西游2》引领国内开发人员将视角转向Lua到今天将近10余年地时间。此中缘由。仅仅有大家自己去想个清楚啦。
3、古剑奇谭
《古剑奇谭》系列游戏是由上海烛龙信息科技有限公司研发的大型3DRPG单机游戏。
游戏设定源自于《山海经》,故事则以武侠和仙侠为创作题材,以中国神话时代为背景,讲述了中国古代侠骨柔情的仙侠文化。《古剑奇谭》系列游戏初代作品与二代作品採用的是不同的游戏引擎和不同的战斗模式,虽然如此,我们依旧能从中找到一个共同点。那就是在初代作品和二代作品中都毫无例外的使Lua作为游戏地脚本语言。
比如以下是《古剑奇谭》红叶湖迷宫场景的Lua脚本节选:
require("Necessary") require("StoryUtility") require("BigMap") require("Script_DLC4") --------------以下为初始化函数------------- function OnEnterLevel() if GetStoryVersion() == 2 then OnDLCEnterLevelM01() else if GetMainStory() == 10100 then callTaskFunction("story10100") elseif GetMainStory() == 161900 then callTaskFunction("story161900") end if gValue.MK == 1 then showNPC("NPC 06", false) showNPC("NPC 07", false) enableTrigger("Tri_MK",false) elseif gValue.MK >1 then showNPC("NPC 04", false) showNPC("NPC 05", false) showNPC("NPC 06", false) showNPC("NPC 07", false) enableTrigger("Tri_MK",false) enableTrigger("Tri_MK 02",false) end
4、仙剑奇侠传
既然提到了古剑奇谭,怎么能不提仙剑奇侠传呢?虽然和古剑奇谭初代作品公布时间仅仅相差一年的《仙剑奇侠传五》市场反响并没有像游戏制作方所预料地那样成功,只是这部作品值得称赞地地方还是蛮多的,由于进步总是要比缺点多的嘛,毕竟时代在进步。我们不能总是拿仙剑初代作品的高度去要求兴许作品。由于我们已经不再是那个年龄的人。而仙剑依旧要不断地突破自身、大胆创新和进取。好了,我们临时先感慨到这里,仙剑四、仙剑五以及仙剑五前传都使用了RenderWare引擎。可能唯一的不同就是仙剑五和仙剑五前传都使用了Lua吧,以下相同是一段从游戏中提取的脚本:
function baoxiang(id,npcID) player.Control(0) pid=player.GetMainPlayer() player.SetAnim(pid,203) global.Print(id) global.Wait(1) y=flag.GetValue(15093) ---------江洋大盗称号获得------------- jyd=flag.GetValue(15255) jyd=jyd+1 flag.SetValue(15255,jyd) global.Print(jyd) global.AddTimer(0.5,13279) ----------------------------------------- if id~=17711 then npc.SetAnim(npcID,501) global.Wait(1) end
5、金庸群侠传Lua复刻版
四、带你走进Lua的世界
最后想和大家分享是Lua语言编程的一个简单的演示样例,由于博主认为以后做游戏用脚本语言的场景会越来越多。所以能学会一门脚本语言能为你的游戏开发之路增色不少。由于博主刚開始学,所以脚本中有不足之处,希望大家能谅解。在学校的时间一天天地在降低,博主希望能和大家共同度过最后的这段时间。博主使用的是Lua5.2,使用的Sublime Text2作为脚本编辑器配合LuaDev插件进行编程的。假设大家想用懒惰点的办法,能够使用Lua for Windows这个集成环境。好了,以下開始吧,作为第一个Lua程序,我们直接给出代码,详细的语法及API大家能够自己去查阅。
--while-do演示样例代码 myValue=10 while(myValue <= 20) do print(myValue) myValue=myValue+1 end --sample table && for-do演示样例代码 myTables={"Item0","Item1","Item2","Item3"} for i=1,table.maxn(myTables) do print(myTables[i]) end --complex table演示样例代码 myTables={} myTables["A"]="ItemA" myTables["B"]="ItemA" myTables["C"]="ItemA" myTables["D"]="ItemA" print(myTables["A"])--"ItemA" --function演示样例代码 function fib(n) if(n<2) then return n else return fib(n-1)+fib(n-2) end end --math演示样例代码 maxValue=math.max(12,23,56,18,10)--56 minValue=math.min(25,34,12,75,8)--8 print(maxValue-minValue)--48 --字符串演示 myString="Hello this is the cool program language called Lua"; print(string.find(myString,"Lua"))--48,50 --io演示 io.write("Hello I get a powerful program language called Lua \n") io.write(string.format("This Lua is %s and now is %s \n",_VERSION,os.date()))
执行结果是:
每日箴言:趁年轻。走自己想走的路。没理由,不去闯。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWlueXVhbnBlaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei。
转载请注明出处,本文作者:秦元培, 本文出处:http://blog.csdn.net/qinyuanpei/article/details/39826323
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
版权声明:本文博主原创文章,博客,未经同意不得转载。转载请注明作者和出处,谢谢!