上传我的文档
下载
收藏
该文档贡献者很忙,什么也没留下。
下载此文档
正在努力加载中...
怎么开发脚本?用2014按键精灵学习制作游戏自动打怪脚本
下载积分:1000
内容提示:怎么开发脚本?用2014按键精灵学习制作游戏自动打怪脚本
文档格式:DOC|
浏览次数:430|
上传日期: 22:03:10|
文档星级:
该用户还上传了这些文档
怎么开发脚本?用2014按键精灵学习制作游戏自动打怪脚本
官方公共微信汇众教育公主坟游戏动漫学院
当前位置: & 正文
游戏开发语言“游戏中的脚本语言”--公主坟游戏学院
汇众教育公主坟游戏学院
公主坟新闻相册
游戏业中的脚本
脚本不是业的新技术,但脚本为业外的人所知悉,却应归功于《魔兽世界》(以下简称Wow)在世界范围的流行。通过Wow伟大的自定义界面系统,Lua这一脚本语言一举成名天下知。
虽然Lua的出名有点横空出世的感觉,但游戏业内早就使用脚本来开发了。即便是在国内,我们所熟悉的网游大多数是用脚本开发的。此前已有人士透露,网游的长青树《梦幻西游》和《大话西游2》就大量应用了脚本技术;特别是《大话西游2》,比Wow早几年做了基于Lua脚本的游戏开发。可以说,国内与国外在脚本技术上并不存在差距,大家都是站在同一起跑线上的,这为国内游戏行业赶超国际水平提供了强大的保障。
回顾过去,我们发现单机版游戏时代很少听到脚本这个词。那么,为什么在网游时代脚本成了业界宠儿?原因是多方面的。比如在单机时代,无论游戏机还是PC的性能都非常低下,需要具有更高执行效率的编译型语言来“压榨”机器性能。但硬件性能的提升并不是脚本流行开来的决定性因素,真正的原因是市场的需要。
时代的市场需求快速变化、竞争激烈,如果延用单机时代一年半载才出一个新版本的开发方式,那必然会被市场淘汰。正是这种快速变幻的市场需要和低效的开发工具之间的矛盾,引发了开发工具的革命----脚本语言风生水起。脚本的兴起因为游戏业中传统的编译型语言(asm/C/C++)的性能优势在硬件性能大幅攀升的今天已经不复存在。在网游时代,游戏业中的主要矛盾已经由性能低下的硬件与游戏执行效率之间的矛盾转变为快速变化的市场需要与低效的开发工具之间的矛盾,脚本在网游时代的辉煌是历史的必然。
除了市场和硬件因素外,还有一点不能忽略。那就是C/C++进行的高成本性和高项目风险。随着java/.net逐年流行,大学生中学习C/C++编程语言的人越来越少。物以希为贵,人亦如是。C/C++程序员新鲜血液补给少,而网游开始流行,巨大的网游市场需求造成大量的人才空缺,这时也就带来了C/C++的高成本。即便是资本雄厚的公司,可以雇佣大量C/C++程序员开发游戏,也不能无视C/C++高级特性和高度的灵活性带来的高项目风险。C/C++是易学难精的编程语言,应用在大型项目的时候极容易因为程序员的水平参差不齐而引起沟通不畅,还有滥用的高级特性也容易引入大量的bug。游戏公司希望找到一个方案以解决高成本、高风险的问题----这个方案就是在游戏中使用脚本。
脚本的现状
脚本解决了C/C++无法解决的开发效率难题,而且降低了成本和风险。脚本在业中就此蓬勃地发展了起来,现在脚本技术已经成为游戏业中不可或缺的一环。横看当前脚本技术,一片大好形势就如同八九点钟的太阳。不仅语言百家争鸣,而且书籍也层出不穷;不仅在游戏业开花结果,在web等其它应用也大放异彩。
首先,我们来看看现在比较流行的脚本: Python、Lua、ruby和Erlang。Python和Lua是开发的中坚力量;ruby凭借ruby on rails的web开发框架的强劲力量,不可小瞧它在游戏业的前途;erlang在高并发性上的原生优势吸引了无数追求高性能的网游服务器的开发人员的目光。
然后让我们来看看书籍和资料方面。大家都知道,文档对语言的普及起到正向催化剂的作用,甚至可以看作是语言的有机组成部分,必不可少。Python经过基金会的多年经营和在NASA、Google得到重用的原因,书籍方面比较丰富;ruby随着RoR的流行水涨船高,这两年行情看好,书籍也出版得越来越多了;反观Lua,虽然流行度一直走高,但出来的书却没有几本,跟他苦涩的接口设计和缺乏针对大型应用的原生支持不无关系;Erlang是典型的少众语言,但随着多核时代的来临和高并发网络应用的需求,有着光明的发展前景,现在《Programming Erlang》等书已经在策划出版了。
最后把焦点重新聚集到游戏开发行业中来,可以发现脚本言语已经在游戏业中开发结果,硕果累累。除了前文提到的《魔兽世界》和网易经典“西游系列”都使用了脚本外,现在大多数流行程序都使用脚本,如腾讯的《QQgame》和搜狐的《天龙八部》等。现在的游戏引擎也都提供了脚本接口,无论是商业的Unreal引擎还是开源的OGRE,无一例外。
脚本的优势
脚本在游戏业中找到自己的一席之地,是因为网游市场需要一个快速开发方案来避免C/C++开发带来的项目高成本和高风险。那么,具体而言脚本相对于C/C++这类编译型语言有什么优势呢?
一、易于学习、代码可维护性强。通常脚本的语法都非常简单,也没有太多高阶的特性,学习的门槛较C/C++低得多。如Python号称只需要花一个下午即可学会。这使得游戏开发公司可以招聘完全没有脚本编程经验的新手,通过低成本的培训,迅速走上工作岗位。除易于学习外,脚本代码也有更好的可维护性(尽管写出没有人看得懂的Lua代码也非难事)。因为脚本不会有很多高阶特性(如C++里的模板元编程就是高阶特性),所以脚本程序员有更多精力关注架构、模式、重用和测试,从而提高了代码的质量;相应地,没有那么多让人困惑的高阶特性,也使得代码“简洁”不少。
二、降低开发成本。如第一点所言,脚本易于学习,使得游戏开发公司可以大量应用新手,是降低成本的有效手段。那么如何来保证新手写的代码的质量呢?这需要我们辩证地看问题。从经验上看新手写的程序无论用什么言语,bug肯定不少。但一个C新手编写的代码和Python新手编写的相同功能的代码相比,C版本应该会有更多的bug。由于C程序需要编译,而脚本程序(大部分)都可以直接解释执行,所以在排除bug方面脚本也有先天的优势,这使得脚本在低成本的同时能够更好地保证代码质量。
三、形***才壁垒。软件开发行业是一个动荡的行业,无数的程序员都在跳槽和谋划跳槽的状态中过日子。使用脚本开发,形***才壁垒是游戏业减少人才流动的有效手段。因为脚本现在除了在游戏业中大红大紫外,并没有在其它行业形成杀手级应用(虽然在web开发方面也有燎原之势,但终究不似在游戏业中的地位高尚)。这就让游戏程序员很少会考虑非游戏业的职位,而其它行业的程序员却可能会因为脚本的易学习性转投游戏业。脚本除了能有效形成行业间的人才壁垒外,也能有效地形成企业间的人才壁垒。因为现有的脚本种类繁多,不同公司往往有不同的选择,甚至有些公司使用自己开发的脚本语言。程序员从公司A跳槽到公司B可能就要学习使用另一种脚本,这提高了跳槽的成本,从而使人才流动减少。
脚本的发展趋势
依照目前的趋势来看,脚本语言也一定会更加普及开来,而且会渗透到其它行业中去。随着网游从业人员的增长,脚本程序员也一直相应地增长着,而且Web2.0热潮引起的网络需求,也促生了一批批新的脚本程序员。网游市场就像一个正在滚动的雪球,带动着脚本的普及。
随着脚本在游戏业中越来越流行,市场就会需要更高的生产效率。脚本虽然一定程度上缓解了市场与生产工具之间的矛盾,但仍然不够彻底。由于市场竞争趋于激烈,而网游在很多功能实现都相差无几:如网络、数据库、图形甚至部分逻辑。这必然会催生网游生产组装化----大量的中间件相互组合形成新的网游。从现在来看,Bigworld、PhysX和Unreal等都是比较流行的网游中间件。脚本语言是粘合各个中间件的良好胶水语言,所以随着网游生产组装化,脚本有良好的发展空间。
那么,当脚本发展到如日中天的时候,会取代C/C++这些编译型语言吗?我认为不会。脚本语言和编译型语言在生产效率和执行效率上各擅胜场,网络游戏既需要能快速应变的脚本,也需要能快速执行以提供更绚丽游戏效果的编译型语言,在未来,它们之间会保持长久的和谐互补关系,相辅相成。
综上所述,网游时代是上帝赐予脚本语言的绝好时机,脚本语言很快将迎来自己光芒四射的世代。脚本语言拥有编译型语言无可比拟的生产效率优势,它们将并肩奋战在游戏最前线。
&&&&&&亚洲最大的动漫游戏人才培养基输出基地,目前在国内40多个大中城市及马来西亚、新加 坡等国外设有游戏学院&动漫学院直属校区:学生超过35000人,毕业学生就职于国内外近千家游戏动漫企业,职业涵盖游戏开发师、游戏美工师和动漫设计师等。是国内最早 、也是规模最大的专业动漫游戏学院。
【】 &&&&&&&
&&&&&&动漫产业,被誉为21世纪最具发展潜力的朝阳产业。调查显示,中国动漫市场具有1000亿元 的潜在价值空间。国家力争在未来5至10年内,跻身世界动漫大国和强国行列,动漫游戏行业已显示出诱人前景。众多动漫精英人才成为企业的香饽饽,企业纷纷开起年薪十万挖人 才。
&&&&&09年游戏动漫等朝阳产业人才一季度平均薪酬在6300元,也正说明在国内朝阳行业中, 游戏和动漫产业平均劳动报酬较高。除此之外,整个2010年的动漫游戏市场规模达千亿,而人才的需求也在30万左右,整个产业强劲的发展趋势代表着我们正向动漫大国、动漫强 国靠近。
汇众教育公主坟游戏学院 双证教育多管齐下
【动漫游戏课程介绍】
动漫设计,动画设计师,网络游戏程序开发,3D网络游戏软件开发,游戏美术设计等。
【技能学历】
工业与信息产业部***&& 北京航天航空大学网络学院学历***&&& 2D/3D动漫*** & 汇众教育认证***&&&&&&&
【就业方向】
动漫专业:高级动漫设计师、高级角色动画师、高级建模师
游戏专业:游戏场景设计师、游戏架构师、游戏原画设计师、游戏开发工程师、UI程序员 等
【招生对象】
应届和往届高中、中专、职高毕业生及同等学历者。
计划招生人数:300(小班授课、脱产学习、一对一的教学模式)
报名方法:报名时提交***书复印件、***复印件、同底2寸个人免冠照片4张,填写报名表后 即可入学,入学后学院统一组织考前辅导和报名考试。
学院名称:
学院地址:北京市海淀区西三环中路甲18号公主坟南四维大厦三层
交通路线:地铁1号线公主坟站C出口往南200米
咨询***:
学院网站:
在线报名网址:
&&& &,地处长安街沿线,周边有海淀高新技术产业园及石景山文化创意产业园。 校区自2004年成立起来,被誉为示范校区,创建精英型、学习型团队 为不断追求目标,以教师和学生的发展为立足之本, 07年评为全国十佳校区、08年评为体系内A级校区.
&&& &周边聚集了北京工商大学,北京师范大学,北方工业大学、北京外国语学院 等十几所全国知名重点院校,及北京西单图书大厦、北京军事博物馆,北京 电视台,八一电影制片场,学习气氛浓郁、并且优越的地理条件引来众多游戏企业参观考察并与多家游戏企业进行项目合作及外包,使学员在此掌握最新行业的动态,提前置身于工作环境中.
【点击咨询】 ↓↓↓
&&&& &&&&&&&&&&&
----温馨提醒----
&&& 我校为北京地区高师资配备的直属校区,享 有07、08、09年全国十佳校区、A类校区、全国最佳就业校区、教学示范校区等殊荣,主攻方向人才培养,教学就业名居全国首位,、是独立创立的学校品牌,敬请学员广泛关注,谨防受骗!
推荐阅读Recommended Reading
开班信息Class Information
就业指导Employment
北京市海淀区莲花池西路16号金鑫大厦C座2层
全国服务咨询***
京ICP备号北京汇众益智科技有限公司 地址:北京市海淀区上地东路35号颐泉汇3层 ***:010-此页面上的内容需要较新版本的 Adobe Flash Player。
最新开发文章
最新信息推荐
上市公司专栏
实时股价每分更新
纳斯达克(美元)(市值:亿美元)
综指: 涨跌幅:
恒生指数(港币)(市值:亿港币)
综指: 涨跌幅:
综指: 涨跌幅:
游戏脚本的实现
来源:互联网02-26-2010
创建一个角色扮演游戏项目时,会发现在源码中编写游戏相关信息十分困难(这样做也是非常鲁莽的)。最好的办法就是使用外部数据源(类似于程序的代码),称之为游戏脚本(例如对话)。以这种方式,可以控制游戏的流程并节省宝贵的时间,因为不需要在每次做出改变后重新进行编译。
理解脚本
当创建游戏时,游戏脚本与所编写的程序代码非常类似,只是游戏脚本相对于游戏引擎而言是外部的。正因为它们是外部的,所以才可以迅速地对脚本做出更改,而不用重新编译整个游戏引擎。否则对于一个超过100万行代码的项目,仅仅为了改变一个对话行就要重新编译整个项目。
脚本的使用并不会非常困难,而且游戏的每个方面都可以从脚本的运用中获益,比如导航菜单、战斗控制、处理玩家的物品清单,都可以使用脚本。举个例子,进行游戏开发时,把自己想象成处于战斗的用户,他们有规律地使用一系列的法术发起攻击。但在游戏开发过程中可能决定改变部分法术,如果法术的资料是硬编码的话,将面临一个非常麻烦的问题,必须更改控制法术的那些程序代码的每个实例,更不用说去调试和检验那些代码直到正确为止。为什么要花费如此多的时间去做这些改变呢?
相反,可以将法术以及它们对游戏中人物的影响编写到几个小小的脚本里。每当战斗打响时,这些脚本被加载,并显示可供选择的法术。一旦该法术被施展,一个脚本将发挥自己的作用,从造成损伤到产生运动或法术图形的动画。
有两种类型的脚本系统可供使用,第一种涉及到使用某种脚本编程语言,在脚本文件中输入命令,编译该文件,并在游戏中执行编译好的脚本文件。第二种是第一种的简化版本,将命令输入到一个文件中,系统通过从一个预先定义好的命令集里选择命令来创建脚本。
为了简化问题的处理,我们使用第二种脚本系统来创建自己的脚本命令集,称之为Mad Lib Scripting(MLS)系统,它使用一个预先定义好的命令集合(称为行为action),同时每个定义好的命令都与一个游戏功能相关联。
下图是一个脚本命令集示例:
使用这样一个有限的行为集合,就不再需要复杂的可编译脚本语言了。相反,只需要告诉脚本系统要使用哪些行为,以及这些行为将使用怎样的选项以实现游戏的功能。对于这种方法,最大的好处就是不再需要为指定一个简单的行为而罗列代码行,可以通过编号来引用行为和选项。
举个例子,Play Sound行为的编号为4,而且该行为仅要求一个输入,即播放声音的编号。在脚本中只存储两个数值:一个对应于行为,另一个代表了声音。使用数值表示行为(代替文本)的方法可以使这种类型脚本的处理既快速又简单。
Mad Lib Scripting系统的设计
创建在游戏中想到的行为,可以通过创建或编辑脚本来填充那些空白点(称之为条目entries)。对于每个行为,请明确提供一个可供空白条目填充的选项列表,它的类型可以从一行文本到一串数字。接着将行为和空白条目进行编号,以便脚本系统可以引用它们,以下是一些行为列表的范例:
1. Character (*NAME*) takes (*NUMBER*) damage.
在这6种行为中,都有0个或多个空白条目位于括号内,每个空白条目包含了一个文本字符串或者一个数字,这个行为与可能条目(以及条目的类型)的列表被称之为行为模板(action template),如下图所示:
一旦使用了行为模板,就可以使用它们的编号而不是行为的文本进行引用(文本的存在只是为了使用户能够更容易理解每个行为所实现的功能)。
MLS系统的编写
为了使MLS系统功能尽可能强大,需要设计它以便可以支持多重行为的模板,而且每个行为模板都包含不受数量限制的行为。以这种方式,就可以将系统复用到任何想要的项目中。当一个脚本完成时,将脚本读入到引擎中,并处理各自的行为,为每个由脚本编辑器所输入的行为使用指定的条目。
一个行为模板需要保存行为的列表,包括文本、条目编号以及每个条目的数据。每个行为按它们在列表中的索引值进行编号,同时每个行为中的空白条目也被加以编号。可以为每个条目指定一种类型(文本型、整数型、浮点型、布尔型、多重选择型),如下所示:
0. No entry type
每个条目类型都有一个独特的特征,字符串类型的长度是可以变化的,数字型可以是两个数字范围之间的任何数值,而布尔值可以是TRUE或者FALSE。至于多重选项型,每个选项都有它自己的文本字符串(脚本从一个列表中获取选项,而且所选选项的索引编号比它的文本更适用)。
行为可以采用如下格式:
Action #1: Spell targets (*MULTIPLE_CHOICE*).
Possible choices for blank entry #1:
我们通过创建结构体E***Y_RULE和ACTION来处理条目规则与行为。
enumE***Y_TYPE{E***Y_NONE=0,E***Y_TEXT,E***Y_BOOL,E***Y_INT,E***Y_FLOAT,E***Y_CHOICE};char*char_ typedefintBOOL; //============================================================================ //Structurestostoreinformationaboutasingleblankentry. //============================================================================ typedefstructE***Y_RULE { long//typeofblankentry(E***Y_TEXT,E***Y_BOOL,) //Thefollowingtwounionscontainthevariousinformationaboutasingleblankentry, //fromthemin/maxvalues(forintandfloattypes),aswellasthenumberofchoices //inamultiplechoiceentry. union { longlong_//minvalueoflongtype floatfloat_//minvalueoffloattype longnum_//numberofchoicesinlist }; union { longlong_//maxvalueoflongtype floatfloat_//maxvalueoffloattype char_ptr*//choicetextarray }; //structureconstructortocleartodefaultvalues E***Y_RULE() { memset(this,0,sizeof(*this)); } //structuredestructortocleanupusedresources ~E***Y_RULE() { //specialcaseforchoicetype if(type==E***Y_CHOICE&&choices!=NULL) { for(longi=0;i
"If flag #~ is ~ then"
INT 0 255 BOOL "Else" "Endif" "Set flag #~ to ~" INT 0 255 BOOL "Print ~" TEXT "Move character to ~, ~, ~" FLOAT 0.0 2048.0 FLOAT 0.0 2048.0 FLOAT 0.0 2048.0 "Character ~ ~ ~ ~ points" CHOICE 3 "Main Character" "Caster" "Target" CHOICE 2 "Gains" "Looses" INT 0 128 CHOICE 2 "Hit" "Magic" "Engage in battle sequence #~" INT 0 65535 "End Script"
脚本条目的创建
因为ENREY_RULE结构仅包含了行为和条目的规则,所以需要另外的结构数组去存储每个条目的数据。这些新的结构包括了在条目中所使用的文本、布尔值、多重选项,我们使用结构体E***Y来表示。
//============================================================================typedefstructE***Y { long//typeofblankentry(E***Y_TEXT,E***Y_BOOL,) union { longio_//usedforsaving/loading long//lengthoftext(0terminator) long//selectioninchoice BOOLbool_//BOOLvalue longlong_//longbalue floatfloat_//floatvalue }; char*//entrytextbuffer E***Y() { memset(this,0,sizeof(*this)); } ~E***Y() { delete[] } }*E***Y_PTR; 在处理脚本条目的过程中,当一个脚本出现了许多条目时,最麻烦的问题也就接踵而来。脚本中的每个行为都要求一个相匹配的E***Y_RULE结构,其依次包含了一定数量的E***Y结构。为了更好地处理一个脚本的结构,还需要其他的结构来记录属于脚本行为的每个条目,我们将它命名为SCRPT。
//============================================================================typedefstructSCRIPT { longaction_//[0,numberofactions-1] longnum_//numberofentriesinthisaction E***Y_PTR//arrayofentries SCRIPT*//previousinlinkedlist SCRIPT*//nextinlinkedlist SCRIPT() { memset(this,0,sizeof(*this)); } ~SCRIPT() { delete[] } }*SCRIPT_PTR; prev和next维护了整个脚本的连接列表,为了构造SCRIPT结构的连接列表,从代表脚本的第一个行为的根结构开始,然后使用next和prev将SCRIPT结构连接起来,如下图所示:
ACTION_TEMPLATE类的整合
理解了行为模板所使用的结构以及所容纳的脚本后,现在开始将它们整合到一起创建一个加载并处理脚本的类。
//============================================================================typedefclassACTION_TEMPLATE { private: longm_num_//numberofactionsintemplate ACTION_PTRm_root_//listoftemplateactions public: ACTION_TEMPLATE(); ~ACTION_TEMPLATE(); BOOLload_actions(constchar*filename); voidfree(); longget_num_actions(); ACTION_PTRget_root_action(); ACTION_PTRget_action(longact_index); SCRIPT_PTRcreate_script(longact_index); longget_num_entries_rule(longact_index); E***Y_RULE_PTRget_entry_rule(longact_index,longentry_rule_index); voidexpand_default_action_text(char*buffer,ACTION_PTRaction); BOOLexpand_action_text(char*buffer,SCRIPT_PTRscript); }*ACTION_TEMPLATE_PTR; 实现:
//------------------------------------------------------------------------staticBOOL_get_quoted_line(FILE*fp,char*data,longmax_data_size) { intc; longpos=0; //readuntilaquoteisreached(orEOF) while(1) { if((c=fgetc(fp))==EOF) returnFALSE; if(c=='"') { //readuntilnextquot(orEOF) while(1) { if((c=fgetc(fp))==EOF) returnFALSE; //returntextwhen2ndquotefound if(c=='"') { data[pos]=0; break; } //addacceptabletexttoline if(c!=0x0a&&c!=0x0d)//ifcharacterisnotlinefeed,notcarriage. { if(posnext=NULL; if(act_ptr==NULL) m_root_action= else act_ptr->next= act_ptr= //copyactiontext strcpy(act->text,text); //storeactionindex act->index=m_num_ //increasethenumberofactionsloaded m_num_actions++; size_ttext_len=strlen(text); //countthenumberofentriesintheaction for(size_ti=0;inum_entries_rule++; } //allocatedandreadinentries(ifany) if(act->num_entries_rule!=0) { act->entries_rule=newE***Y_RULE[act->num_entries_rule]; for(shortentry_index=0;entry_indexnum_entries_entry_index++) { E***Y_RULE_PTRentry_rule=&act->entries_rule[entry_index]; //gettypeofentry _get_word(fp,text,size); if(!stricmp(text,"TEXT"))//TEXTtype,nothingdata. { entry_rule->type=E***Y_TEXT; } elseif(!stricmp(text,"INT"))//LONGtype,getminandmaxvalues { entry_rule->type=E***Y_INT; //getminvalue _get_word(fp,text,size); entry_rule->long_min=atol(text); //getmaxvalue _get_word(fp,text,size); entry_rule->long_max=atol(text); } elseif(!stricmp(text,"FLOAT"))//FLOATtype,getminandmaxvalues { entry_rule->type=E***Y_FLOAT; //getminvalue _get_word(fp,text,size); entry_rule->float_min=(float)atof(text); //getmaxvalue _get_word(fp,text,size); entry_rule->float_max=(float)atof(text); } elseif(!stricmp(text,"BOOL"))//BOOLtype,nooptions. { entry_rule->type=E***Y_BOOL; } elseif(!stricmp(text,"CHOICE"))//CHOICEtype,getnumberofentriesandentry'stexts. { entry_rule->type=E***Y_CHOICE; //getthenumberofchoices _get_word(fp,text,size); entry_rule->num_choices=atol(text); entry_rule->choices=newchar_ptr[entry_rule->num_choices]; //geteachentrytext for(longchoice_index=0;choice_indexnum_choice_index++) { _get_quoted_line(fp,text,size); entry_rule->choices[choice_index]=strdup(text); } } } } } fclose(fp); returnTRUE; } //------------------------------------------------------------------------ //Returnnumberofactionsintemplate. //------------------------------------------------------------------------ longACTION_TEMPLATE::get_num_actions() { returnm_num_ } //------------------------------------------------------------------------ //ReturnrootACTIONstructure. //------------------------------------------------------------------------ ACTION_PTRACTION_TEMPLATE::get_root_action() { returnm_root_ } //------------------------------------------------------------------------ //ReturnspecifiedACTIONstructure. //------------------------------------------------------------------------ ACTION_PTRACTION_TEMPLATE::get_action(longact_index) { //returnerrorifhigherthannumberofactions if(act_index>=m_num_actions) returnNULL; ACTION_PTRact_ptr=m_root_ //scanlist while(act_ptr) { if(act_ptr->index==act_index) returnact_ act_ptr=act_ptr-> } returnNULL; } //------------------------------------------------------------------------ //Createscriptfromspecifiedactionindex. //------------------------------------------------------------------------ SCRIPT_PTRACTION_TEMPLATE::create_script(longact_index) { //makesureitisavalidaction if(act_index>=m_num_actions) returnNULL; ACTION_PTRact_ //getpointertoaction if((act_ptr=get_action(act_index))==NULL) returnNULL; //createnewSCRIPTstructure SCRIPT_PTRscript=newSCRIPT; script->action_index=act_ script->num_entries=act_ptr->num_entries_ script->entries=newE***Y[script->num_entries]; //setupeachentry for(longi=0;i
相关新闻:
相关专题: