首页 > 文章中心 > 脚本语言

脚本语言

脚本语言

脚本语言范文第1篇

关键词:Lua;脚本语言;插件;C;游戏开发

中图分类号:TP311文献标识码:A文章编号:1009-3044(2010)04-0899-03

The Game Scripting Language Lua

WANG Lei

(Huali College, Guangdong University of Technology, Guangzhou 511325, China)

Abstract: Compact and efficient scripting language Lua, with the C / C + + language, the design is aimed at embedded applications, so as to provide a flexible application, expansion and customization capabilities allow customers to design their own in the game client script, produce special game logic plug-ins.

Key words: Lua; scripting language; plug-ins; C; game development

脚本语言又叫动态语言。是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的一种计算机编程语言,用来控制软件应用程序。几乎所有计算机系统的各个层次都有一种脚本语言,包括操作系统层,如计算机游戏,网络应用程序,文字处理文档,网络软件等。在许多方面,高级编程语言和脚本语言之间互相交叉,二者之间没有明确的界限。目前脚本语言正成为开发者的重要工具,脚本不仅解决了C/C++无法解决的开发效率难题,还降低了开发的成本和风险。因此脚本技术在游戏业内蓬勃发展起来,并且已经成为游戏业中不可或缺的一环。

1 脚本语言Lua介绍

lua小巧高效,作为C的扩展,能与C自然的结合与交互,所以常被用于写游戏逻辑,已经成为游戏里最常用的一种脚本。在当前的游戏开发行业中,除了《魔兽世界》和网易经典“西游系列”都使用了脚本外,现在大多数比较流行的程序也都使用了脚本,如腾讯的《QQgame))和搜狐的《天龙八部》等。不仅如此,现今的游戏引擎也都提供了脚本接口,无论是商业的unreal引擎还是开源的OGRE,无一例外。

2 Lua特点

2.1 Lua是一种轻量语言

它的官方版本只包括一个精简的核心和最基本的库。这使得Lua体积小、启动速度快。它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程式里。和许多"大而全"的语言不一样,网路通讯、图形界面等都没有预设提供。

2.2 Lua可以很容易地被扩展:

由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。Lua 与宿主语言之间的这种共生关系的核心是宿主语言是一个虚拟堆栈。虚拟堆栈与实际堆栈类似,是一种后进先出(LIFO)的数据结构,可以用来临时存储函数参数和函数结果。要从 Lua 中调用宿主语言的函数(反之亦然),调用者会将一些值压入堆栈中,并调用目标函数;被调用的函数会弹出这些参数(当然要对类型和每个参数的值进行验证),对数据进行处理,然后将结果放入堆栈中。当控制返回给调用程序时,调用程序就可以从堆栈中提取出返回值。

实际上在 Lua 中使用的所有的 C 应用程序编程接口(API)都是通过堆栈来进行操作的。堆栈可以保存 Lua 的值,不过值的类型必须是调用程序和被调用者都知道的,特别是向堆栈中压入的值和从堆栈中弹出的值更是如此(例如 lua_pushnil() 和 lua_pushnumber()。

2.3 Lua是一种多重编程范式的程式设计语言:

它只提供了很小的一个特性集合来满足不同编范式的需要,而不是为某种特定的编范式提供繁杂的特性支援。例如,Lua并不提供继承这个特性,但是你可以用元表来模拟它。诸如名字空间、类这些概念都没有在语言基本特性中实现,但是我们可以轻易的用表结构(Lua唯一提供的复杂数据结构)轻易模拟。Lua可以在运行时随时构造出一个函数,并把它看作一个对象(正是所谓的first class function),这个特性可以很好的满足函数式编程的需要。这是提供了这些基本的元特性,我们可以任意的对语言进行自需的改造。

2.4 Lua支持的数据类型非常之少

它只提供了 数字(缺省是双精度浮点数,可配置)、布尔量、字符串、表、子程序、协程(coroutine)以及用户自定义数据这几种。但是其处理表和字符串的效率非常之高,加上元表的支援,我们可以高效的模拟出需要的复杂数据类型(比如集合、数组等)。

2.5 Lua是一个动态弱类型语言

支援增量式垃圾收集策略。有内建的,与操作系统无关的协作式多线程(coroutine)支援。

2.6 Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数

这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。 一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。

Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能,这将给Lua带来更加优秀的性能。和Python等脚本不同,Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。不过Lua还是具备了比如数学运算和字符串处理等基本的功能。

3 Lua在游戏中的应用实例

3.1 一个简单的例子

假设在暗黑游戏中,有一套准备刺客剑(Assassin Sword),设定只有达到20级且是刺客(assasin)类时方能装备该物品。在程序创建一个数列存放这些信息,例如:

Player = { }

Player[1] = { level = 15, class = "warrior", weapon = "knife" }

在代码中检查是否有资格装备该武器,如下:

if Player[1].level >= 20 and Player[1].class == "assassin" then

Player[1].weapon = "Assassin Sword "

end

3.2 以游戏中的一个 Lua 档案为例,列出建构起一个插件的主要代码

local function LoadAddOnWrapper(addon)

local o = getfenv(0)

n = {}

local oldmt = getmetatable(o)

setmetatable(o, mt)

local success, ret = pcall(LoadAddOn, addon)

setmetatable(o, oldmt)

if not success then

geterrorhandler()(ret)

return

elseif not ret then

DEFAULT_CHAT_FRAME:AddMessage("Error loading LoadOnDemand plugin " .. addon)

return

end

local dependencies

local plugin

for k,v in pairs(n) do

if IsCorrectPlugin(v) then

if plugin then

if not dependencies then

dependencies = {}

end

table.insert(dependencies, plugin)

end

plugin = v

end

end

if not plugin then

DEFAULT_CHAT_FRAME:AddMessage("Error loading LoadOnDemand plugin " .. addon)

return

end

return ret, plugin, dependencies

end

function FuBar:OnProfileEnable(oldName, _, copyFrom)

isChangingProfile = true

if not next(FuBar.db.profile) then

local def

local profile = self:GetProfile()

if profile:find("^char/") or profile:find("^class/") then

local class = select(2, UnitClass("player"))

def = _G["FUBAR_DEFAULTS_" .. class] or FUBAR_DEFAULTS

else

def = FUBAR_DEFAULTS

end

if type(def) == "function" then

def = def()

end

def = copyTable(def)

for k,v in pairs(def) do

FuBar.db.profile[k] = v

end

end

if type(self.db.profile.loadOnDemand) ~= "table" then

self.db.profile.loadOnDemand = {}

end

if type(self.db.profile.tooltip) ~= "table" then

self.db.profile.tooltip = {}

end

if type(self.db.profile.panels) ~= "table" then

self.db.profile.panels = {}

end

CleanDB()

doneSetupPlugins = false

pluginsToSetup = {}

for i,plugin in ipairs(plugins) do

pluginsToSetup[plugin] = true

local frame = plugin:GetFrame()

frame:Hide()

frame:ClearAllPoints()

plugin:SetPanel(nil)

end

for i = self:GetNumPanels(), 1, -1 do

self:GetPanel(i):del(true)

end

for i = #self.db.profile.panels, 1, -1 do

if self.db.profile.panels[i] then

FuBar_Panel:new()

end

end

if self:GetNumPanels() == 0 then

FuBar_Panel:new()

end

self:CheckResolution()

for i = 1, GetNumAddOns() do

local name, _, notes, enabled, loadable = GetAddOnInfo(i)

if IsAddOnLoadOnDemand(i) and enabled and loadable and not IsAddOnLoaded(i) then

if findFuBarDep(GetAddOnDependencies(name)) then

if not self.db.profile.loadOnDemand[name] then

self:LoadPlugin(name)

elseif not self.db.profile.loadOnDemand[name].disabled and (not self.db.profile.loadOnDemand[name].condition or CheckLoadCondition(self.db.profile.loadOnDemand[name].condition)) then

self:LoadPlugin(name)

else

local exists = false

for _,n in ipairs(toBeLoaded) do

if n[1] == name then

exists = true

break

end

end

if not exists then

table.insert(toBeLoaded, {name, notes})

end

end

end

end

end

for i,plugin in ipairs(plugins) do

if plugin.IsDisabled and plugin:IsDisabled() and plugin:GetPanel() then

plugin:GetPanel():RemovePlugin(plugin)

end

end

4 结束语

Lua程序设计语言是一个简洁、轻量、可扩展的脚本语言。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua的最大用途是在宿主程序中作为脚本使用。由于是嵌入式脚本,因此它们在客户前端可以表现得极其灵活。通过将配置参数及实现具体功能的方法逻辑抽离到脚本中,在修改及拓展时就能更加方便更新处理而无需重新编译主体框架代码。因此很多应用程序使用Lua作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。

参考文献:

[1] LuaForge[EB/OL]./.

脚本语言范文第2篇

关键词:Coco2d-x;动态更新;Lua;跨平台开发

中图分类号:TP368.1 文献标识码:A

Abstract:The Lua scripting language technology has brought the new heaven and earth for the development of Coco2d-x.Through the Lua scripting language development Cocos2d-x application,get rid of the tedious code of C/C++ development,makes the development of fast and efficient and can run on multiple platforms at the same time,the Lua scripting language can expand sex,can make it a good integration in the application.At the same time the Lua language become controller in development.Control the application logic and Coco2d-providing display functions of x and cross-platform features.Such development can dynamically modify the client not only bugs,but also dynamic update application content to avoid the update of customer churn.Free,small,fast,easy to transplant the Lua language reduces the development cost and guarantee the application performance.

Keywords:Cocos2d-x;dynamic updating;Lua;cross-platform development

1 引言(Introduction)

Cocos2d-x是基于C++语言的移动端应用程序开发的开源框架。Cocos2d-iPhone项目的C++版本[1]。Cocos2d-x开发框架用C++语言重写了Cocos2d开发框架从而实现应用开发跨平台,在跨平台移动端应用开发中Cocos2d-x框架被大量使用[2]。其开发的手机应用,可以在C++或者Lua中编写。Cocos2d-x项目能够兼容iOS操作系统,Android操作系统,黑莓Blackberry操作系统等。在PC端Cocos2d-x开发框架支持的操作系统包括Linux操作系统、Mac操作系统和Windows操作系统等PC端操作系统,因此,Cocos2d-x能够在PC端操作系统中可以进行编辑和调试使得其在开发中变得高效快捷[3]。

2 基于Lua动态脚本语言Coco2d-x应用开发的关键技术(The key technology of Cocos2d-x application development based on the dynamic scripting language Lua)

(1)Lua技术

Lua是一个小巧的动态语言。Lua动态语言的设计初衷,为应用程序开发提供订制功能与灵活的拓展。作为脚本语言它具有轻量、可拓展、简洁等特点[4]。因为C++语言与Lua脚本语言具有良好交互能力。可以复杂繁琐的C++开发变为简单快捷的Lua语言开发。

(2)Lua与C++交互技术

Lua动态脚本语言与C++语言的通讯分为两部分,首先是Lua动态语言通过Lua Binding访问C++语言中的类库或者函数以及传递参数,其次分是C++语言回调Lua C API访问Lua的函数以及传递参数。

(3)Cocos2d-x开发手机应用技术

在实际开发中,使用Cocos2d-x框架进行移动端应用程序开发,依赖其可以和平美兼容,使其项目可以做到多个平台一套代码,多个平台一个版本避免了多平台版本不统一的尴尬。通过与之相配套的CocosStdioUI编辑快速生成plist文件可视化进行界面布局提高实际项目中的开发效率,让应用开发变得更加迅捷高效开发。

3 基于Lua动态脚本语言Coco2d-x应用开发的应用

与实现(The use and implementation of Cocos2d-x

application development based on the dynamic

scripting language Lua)

3.1 Lua与C++的交互技术实现

在C++中初始化Lua:

Lua_State * L=lua_open(); //初始化Lua环境

void CCinitLua() {

lua_openlibs(L); //载入Lua全部标准库

}

完成在C++来执行Lua文件。Lua被嵌入到C++程序中,起到一个黏合作用。而Cocos2d-x框架其强大的功能分别来自于不同的类库。Lua动态语言在程序开发中作为整个应用程序的逻辑控制器,在开发中Lua脚本语言充当大脑而开发框架充当肢体。以消息机制为例,通过调用C++语言的函数达到,回调Lua动态语言函数。以C++绘制函数为例,C++通过绘制函数传输一个消息给Lua语言,当绘制函数进行重绘时也就在Lua语言中执行相同的函数。这样就可以在书法简练没有类型的Lua中编写C++代码,省去了C++的复杂语法从而有拥有了C++的强大功能。通过这个方式就能够实现其他事件机制。

动态脚本语言Lua调用C++接口时,进行参数传递,回调结果的获取。需要把C++中函数位置通过指定的方式传达给Lua语言。在Lua调用C++,C++从栈中找到交互的栈,从而获取其中的参数,调用结束后将返回结果信息放入栈中。在当Lua语言中绘制函数被调用时,同时也调用了C++中做相应处理的函数,这样动态语言Lua与C++的交互就是实现的。

3.2 Lua与Cocos2d-x交互

Cocos2d-x具体来说更像是一个类库的合集其中把图形渲染和多媒体播放甚至物理引擎,分解集合成一个lib。通过C++调用这个lib中的具体方法而实现快速的手机应用开发的框架。通过Lua动态语言嵌入到Cocos2d-x开发框架中,并与其良好的结合。达到了在脚本中开发跨平台手机应用。

3.3 利用Cocos2d-x开发应用

目前移动端操作系统主要有iOS操作系统,Android操作系统。移动应用程序开发需要使用Cocos2d-x进行开发可以避免一款程序多套代码的尴尬。

(1)利用Lua+Coco2d-x开发Android应用

通过Native Development Toolkit(NDK)我们可以在eclipse里面集成外部库(比如Cocos2d-x),使用C/C++来编写Android程序。这些库被编译成动态库通过JNI(Java Native Interface)与Java Android体系程序进行交互。下面有两种使用方法:

①独立模式:直接在makefile中使用arm-linux-androideabi-g++。

②集成模式:使用$NDKROOT/ndk-build shell工具,它是一种高度可定制的makefile,专门为NDK库所设计的。

首先修改Anroid/jni/Android.mk中文件如下:

LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)subdirs:=$(addprefix $(LOCAL_PATH)/http:///../,$(addsuffix /Android.mk, \

cocos2dx\CocosDenshion/android\lua/proj.android/jni\))subdirs+= $(LOCAL_PATH)/pyramid/Android.mk

include $(subdirs)

修改jni\Application.mk文件:

APP_MODULES:=cocos2d cocosdenshion lua game

在android\src\org\cocos2dx\xx\x\.java中修改:

static {

System.loadLibray("cocos2d");

System.loadLibrary("cocosdenshion");

System.loadLibrary("lua");

System.loadLibrary("game");

}

(2)利用Lua+Coco2d-x开发iOS应用

在Mac操作系统终端中填入:

cd $COCOS2DX_HOME

sud./install-templates-xcode.sh-u

在Cocos2d-x框架安装成功以后在Xcode中会出现新的Cocos2d-x模板选择即可创建新的工程。由于lua语言不能直接与Objective-C交互,所以我们使用Lua Bingding和C/C++交互。同时C++和Objective-C可以混编,使用C++可以直接调用Objective-C,让C++作为Lua和Objective-C交互的桥梁(图1)。

(3)Lua开发应用

我们通过用Lua动态语言创建场景、层、精灵来实现应用中的一个通过用户触摸图片跟随用户手指移动的功能。

Mc_Scene=cocos2d.CCScene.node()

Mc_Layer=cocos2d.CCLayer.node()

Mc_Scene:addChild(Mc_Layer)

Mc_Sprite=cocos2d.CCSprite:SpriteWithFile

("machao.png")

Mc_Layer:addChild(Mc_Sprite)

SceneSize=cocos2d.CCDirector:shareDirector:getWinSize()

Mc_Sprite:setPosition(cocos2d.CCPoint(SceneSize.width*0.5,SceneSize.height*0.5))

Mc_Layer.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHBEGAN,"btnTouchBegin")

Mc_Layer.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHMOVED,"btnTouchMove")

Mc_Layer.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHEND,"btnTouchEnd")

Pointbegin=nil

Function btnTouchBegin(e)

Local v=e[1]

Local pointMove=v:locationInView(v:view())

pointMove= cocos2d:CCDirector:sharedDirector():covertoGL(pointMove)

Mc_sprite:setPosition(cocos2d.CCPoint(pointMove.x,pointMove.y))

End

Function btnTouchMove(e)

Local v=e[1]

Local pointMove=v:locationInView(v:view())

pointMove= cocos2d:CCDirector:sharedDirector():covertoGL(pointMove)

Mc_sprite:setPosition(cocos2d.CCPoint(pointMove.x,pointMove.y

End

Function btnTochMove(e)

Cocos2d.CCLuaLog("T_end")

end

CocoDenshion.SimpleAudioEngine:shareEngine():playBackgroundmusic("background3.mp3",true)

CocoDenshion.SimpleAudioEngine:shareEngine():preloadEffect("effect1.wav")

Cocos2d.CCDirector:shareDirector():runwithScnen

(Mc_Scene)

Cocos2d.CCLuaLog("脚本运行结束")

4 结论(Conclusion)

本文使用Lua动态语言进行移动应用程序的设计与开发,把灵活高效的脚本语言应用到移动端应用程序开发,通过其良好的嵌入能力与Android平台和iOS平台结合,利用Cocos2d-x进行应用开发。Lua动态语言能使应用程序的逻辑和与前端视图完全剥离开,不仅大大减少的应用程序的开发周期还使其具有客户端动态更新的功能,又通过Cocos2d-x开发框架与多平台相兼容,降低了开发成本。同时也降低了应用程序的复杂程度,增加了代码的可复用性。

参考文献(References)

[1] Jayant Varma.Lua实战:IOS游戏开发[M].北京:人民邮电出版社,2014:77-78.

[2] 刘剑卓.Cocos2D-X游戏开发技术精解[M].北京:人民邮电出版社,2013:53-54.

[3] 满硕泉.Cocos2D-X权威指南[M].北京:机械工业出版社,2010:26-27.

[4] Ierusalimschy R.Progarmming in Lua[M].北京:电子工业出版社,2006:141-143.

作者简介:

脚本语言范文第3篇

关键词:FLASH;波浪效果;ACTIONduplicateMovieClip;网页效果

中图分类号:TP37文献标识码:A 文章编号:1009-3044(2007)03-10832-02

在FLASH中制作海浪效果,传统的方法是通过手绘海浪形态,然后运用形状动画通过复制多条海浪产生最后连绵不绝的海浪效果(如图1所示)。

图1

这种做法在卡通片中应用很广泛,但在网页制作中有时不太合适,原因是网页上的空间有限制,如果波浪的条数太多,形态造型稍大就会引起网速太慢,毕竟现在保持一定的网页的的浏览速度还是最重要的,因此网页上的FLASH在横向和纵向的空间都不会很大,这样海浪造型大量复制的效果在有限的狭小空间里就很难展现了,所以寻求一种能够展现大量海浪效果,又不太影响网速的FLASH制作方法是目前网页设计者经常思考的问题。我在大量网页制作和FLASH实践中研究出一种方案,可以解决上述问题,现论述如下,与业内人员共享;我的整体构思是这样的,在FLASH中绘制一条线,然后运用Action(Action Scripts是FLASH中一种面向对象的编程语言[1]) 中的duplicateMovieClip命令,将线条进行多重复制,在复制过程中,再合理运用setProperty命令可以添加移动和放缩等变换命令,这样不用另行绘制,通过命令组织和一条曲线就解决海浪多重造型问题,最后将这些复制出的线条放到合适图案背景上,组合成一幅海潮汹涌、绵绵不绝的精美场景。如图2所示:

图2

首先要将FLASH页面设置成网页所需尺寸(本例为765×175),并将第一个图层名改为lang,然后在场景中插入一个影片剪辑起名为xian,在这个名为xian的影片剪辑中将组织主要的命令来制作多重海浪

(1)在这个影片剪辑的第一帧场景中用线条工具先画一条波浪线,长度约500左右,由于后续步骤中要在横向不断加宽,所以初始的线条长度不要太宽,这条线在画法上要注意两侧曲率要小,尽可能平缓一些,而中间波浪幅度稍大,并要有层次,在这个例子里,我设置两高两低并合理分配和调节,从而满足视觉需要;

(2)将这条波浪线选中,按F8转化成另一个影片剪辑命名为lang,目的很简单,要在这个影片剪辑中将这条波浪线进行形状动画,波浪就会不停进行波峰波谷起伏变化,视觉效果更佳,动画的设置为:以二十帧为界,中间第十帧为一个转折关键帧,两侧形态一致,中间关键帧形态变化;颜色的安排是这样,第一帧线条为白色,第十帧线条为蓝紫,第二十帧线条为绿色,白色的安排可以使海浪有光感和浪尖处白色浪花的感觉,紫色的安排是可以和蓝色背景图案相融合,绿色的是在画面中添加一定的对比色,使画面有丰富多彩的感觉;如图3所示:

图3

(3)退回到xian影片剪辑中,确定lang影片剪辑处于选中状态,在属性栏中为它起个名为0,注意此处只能命名为0(因为后期在赋值语句中调用的初始影片剪辑名字是数字,并且最小是0),现在第一帧上加入如下Action Script:

i = 1;(//设初始变量为1,在下一帧会调用一个i-1的影片剪辑,所以只处初始值设为1//)

max = 50; (//这个数值是由页面尺寸和波峰高度决定的,在本例中这个数值视觉效果好 //)

setProperty("0", _visible, false); (// 设置名为0的影片剪辑不可见//)

setProperty("0", _alpha, 0); (//设置名为0的影片剪辑不透明度为0//)

Properties(属性)是定义对象的attributes(属性)的[2],上面四条语句为引导语句并进行初始设定,不能放在第二帧上,原因是第二帧会重复五十次,如果将初始设定值放到第二帧处就会引起值混乱;

(4)在xian 影片剪辑中按F6加入第二个关键帧,如果此时播放,不会看到任何动画效果,因为动画仅播放了一帧,并且由于初始设定为不可见,所以在没有执行第二帧的语句时,没有动画效果,在第二帧上写入如下语句:

duplicateMovieClip(i-1, i, i); (//i-1是调用影片剪辑的名称,第二个i是复制出的影片剪辑的新名称,第三个i是深度级别,深度级别是复制的影片剪辑的堆叠顺序。这种堆叠顺序很像时间轴中图层的堆叠顺序;较低深度级别的影片剪辑隐藏在较高堆叠顺序的剪辑之下。必须为每个复制的影片剪辑分配一个唯一的深度级别,以防止它替换现有深度上的影片。这一步复制出一个名字叫i的影片剪辑,下面是对这个影片剪辑进行一定的属性设置 //)

setProperty(i, _y, getProperty(i-1, _y)+i/10); (//这个命令是对一个目标进行基本属性设置的,在这里是设置新产生的影片剪辑位置坐标y值增加i/10,这样复制出的线可以相对上一条线条向下窜一定距离,从而有一浪接一浪的感觉,//)

setProperty(i, _alpha, getProperty ( i-1, _alpha )+3); (//这个设置是调整新产生影片剪辑的不透明度,这里要计算一下,由于本例中在第一帧设定一共要复制50条,所以如果每条线的不透明度初始值为0,每条线不透明度+2就可以使最后一条线不透明度达到100,但是那样的效果不好看,所以经过实验,每条线alpha 值+3层次更好,最后实线也多一些,实虚的分布较合理,//)

setProperty(i, _xscale, getProperty(i-1, _xscale)+4); (//这个设置是将新产生的影片剪辑的x即水平方向的比例增加,数值是实验得出比较合适的值,要注意的是这数值在执行语句时是按百分数进行的,+4即为在上一条线上水平方面的比例增加4%,这样波浪线的变化更象海浪冲向岸边逐渐延伸的感觉//)

i = i+1; (//这个参数是为下一条线的复制进行赋值//)

需要说明的是,当影片正在播放时,运用duplicateMovieClip创建一个影片剪辑的实例。无论播放头在原始影片剪辑(或“父级”)中处于什么位置,复制的影片剪辑的播放头始终从第一帧开始。并在结束后如果没有进行stop控制,还会从第一帧开始下一个动画循环,父影片剪辑中的变量不拷贝到复制的影片剪辑中。如果删除父影片剪辑,则复制的影片剪辑也被删除。使用removeMovieClip命令可以删除由 duplicateMovieClip 创建的影片剪辑实例。另外,我在实际制作时,将第二帧的这初始线条的不透明度设为50%,最终输出的效果也很好,这可能是对比较明显的缘故;

现在,一条新的波浪线产生了,下面要进行的就是重复这过程,直到产生足够的线条

(5)继续在xian 影片剪辑中按F6加入第三个关键帧,为避免麻烦应将这帧场景中的线条删除,这一帧的主要用途是进行赋值的检查,如果赋值没到50,应使动画回到第二帧继续产生波浪线,超过50时,就停止不再产生新的波浪线条,具体帧命令如下:

if (i

这里主要运用了if语句,对条件进行计算以确定影片中的下一步动作。如果条件为 true,则 Flash 将运行条件后面的语句。如果条件为 false,则 Flash 跳过花括号内的语句,运行else后面的语句[3]。脚本中创建了分支逻辑。具体来说,在本例中当参数i的赋值小于等于50时,动画跳转到第二帧,继续执行第二帧中的复制波浪线,并偏移y 方向位置和增加x方向的比例值这些语句;当i的赋值大于50时,执行else后的命令,即在第三帧处动画停止,而这时,前面已复制出的海浪线条继续各自的形状动画和位置及比例变化,这是由duplicateMovieClip所决定的,因而就产生了前面绵绵不绝的海浪效果;

(6)现在FLASH场景中的海浪效果基本完成,下面说一下如何合理地输出,有好多人在输出时,不太注意输出设置中的参数,FLASH默认输出参数中,有一个JPEG的品质选项值为80%,而本例中多重波浪效果的制作是由一根很细的线条产生的,所以质量低有可能使线条的输出不易分清,因而在这个输出设置中一定要将JPEG输出质量调为100%,这才能保证最后的效果;

现在可以退出xian这个影片剪辑了,在场景一中可以暂时导入一张在网页中用作背景的图片,将xian这个影片剪辑调好位置,为了减少flash文件的大小,最后要将这个参考背景图去掉,这么做的原因有两个,一是flash中进行图像输出时,要降低图像的质量,影响视觉效果,二是,flash中有图像会较大增加flas的调用时间,影响网页速度,所以在调整好海浪在图像中的位置后,将背景图删掉,然后就可以输出了;至于背景图像用html语言在网页填加;

这里还有个问题,这时输出来的flash,会有一个系统默认的颜色衬底,为了网页中flash的海浪动画效果能够透在选好的背景图像上,需要在网页中调入flas的程序下面加上如下语句,就可以去除flash输出影片的衬底从而在网页上展现出迷人的海浪效果;

(//这一步是调用制作好的flash影片//)

(//将flash影片质量设置为最好//)

(//将flash影片默认的背景透明,//)

以上步骤就可以将一根很细很小的波浪线,经过一系列语句和命令设置,产生出连绵不绝的海浪效果,合理调用在网页上,速度很快,我认为是一个很好的在网页上显现波浪效果的方案,而在实际应用也得到了认可,同行们可以到这个网页上去感受它的魅力。

网络是一个令设计者兴奋的、强大的可视化媒体,它具有全球范围的、数字庞大的访问者,和其它创造性的媒体一样,各种要素要结合在一起才能创造出一个成功的站点[4],因此如本文所述通过程序来代替传统手绘进行网页视觉效果的创作是一个新思路。

参考文献:

[1]袁建洲,编著.FLASH MX,FIREWORKS MX,DREAMWEAV

ER MX三合一实用教程[M].北京: 电子工业出版社,2004.139

[2]黄刚,于林,编著. MACROMEDIA FLASHMX 中文版标准教程.北京: 希望电子出版社,2003.216.

[3]贺凯,邹婷,编著.FLASHMX2004 完全征服手册.北京: 中国青年出版社,2004年.297.

脚本语言范文第4篇

摘要:本文浅析Lua、Python脚本语言的特点,介绍并总结脚本系统在游戏引擎框架中的应用,并指出了可视化脚本系统在游戏引擎的发展趋势。

关键词:游戏架构 可视化脚本系统 脚本语言

一、引言

随着游戏产业的蓬勃发展,在国外涌现出一大批优秀的三维游戏引擎,著名的商业引擎有Epic公司的Unreal系列引擎、Crytek公司的CryEngine系列引擎、BigWorld公司的BigWorld引擎和Garage Games公司的Torque 3D引擎等。优秀三维游戏引擎通常包括:渲染引擎、物理引擎、音效引擎、脚本系统、动画系统、人工智能、网络引擎等,而且提供方便、快捷、有效、可扩展的接口以方便游戏开发人员在这个接口上开发游戏相应的模块,并且还提供了功能极其强大的编辑器,主要包括场景编辑器、模型编辑器、物理系统编辑器和粒子系统编辑器等,并配备齐全的第三方插件进行导入和导出,以满足各种复杂的游戏开发的需求。游戏引擎主要是通过脚本系统来控制游戏内容和游戏逻辑[1],即将游戏内容和游戏引擎相分离,避免硬编码,可以不需要重新编译整个工程的情况下,调整、测试和修改游戏运行的机制和特性,并且还能够在后很容易的进行扩展[2]。

二、游戏开发中脚本语言的应用

由于游戏引擎规模越来越复杂,游戏内容情节越来越丰富,使脚本技术在游戏引擎框架得到广泛的应用,并且已经成为其中不可或缺的组成部分,在游戏应用领域中大放异彩。目前比较流行的脚本语言:Lua、Python、GameMonkey及Ruby等,其中Lua 是一个小巧、精悍、高效的脚本语言,其设计目的主要是为了嵌入应用程序中,进而为应用程序提供灵活的扩展、配置和定制功能。Lua脚本和C/C++代码可以相互调用,也可以作为配置文件,并且更加容易理解和维护,这使得其得到广泛应用。Lua由标准C代码实现,代码简洁优美,并支持跨平台编译和执行。Lua是一种为支持有数据描述机制的一般过程式编程语言而设计的扩展编程语言[4]。

其实现过程主要是载入Lua基本库(#include "lua.h"、#include "lauxlib.h"和#include "lualib.h")、编写Lua的脚本文件,并调用Lua函数,在Lua中是以函数指针的形式调用函数,任何在Lua中注册的函数必须有同样的原型为:typedef int(*lua_CFunction)(lua_State *L)、执行Lua脚本文件(lua_dofile(L, "脚本文件名")来完成。目前应用程序采用Lua作为嵌入式脚本语言,以此来实现可配置性、可扩展性,其中包括魔兽世界、愤怒的小鸟等。

而Python是一种面向对象、可扩展性、直译式的语言,其语法简捷而易学,具有丰富和强大的类库的支持。Python标准库的主要提供了:系统管理、数据库接口、文本和文件处理、图形系统、网络通信和协议等功能,Python社区提供了大量、成熟而可靠的第三方应用模块更是大放异采,主要涉及系统编程、多媒体应用、科学计算、Web编程开发和图形系统等领域,并且可以把Python嵌入C/C++程序,但其执行的速度不够快。

目前无论是商业的Unreal、CryEngine及Unity3D等引擎还是开源的图形渲染引擎OGRE,无不例外都提供了相应的脚本系统,从而实现了与外部进行很好的交互,避免直接调用底层,从而使得编码变得简单容易[3]。

三、脚本系统

由于在游戏引擎创建脚本系统能够缩短游戏程序编译时间、减少模块之间的耦合度,有利于代码的复用[5],延长游戏软件的生命周期,降低了开发的成本,提高了开发效率。脚本系统在总体设计上分为属性脚本和命令脚本系统的设计,开发游戏脚本系统,其优点在于:可以创建自定义的脚本语言(语法和语义的规则);为程序提供灵活的可扩展性;和授权脚本系统(Lua遵守MIT),缺点主要需要开发人员掌握关于编译器理论、虚拟机等相关领域知识;需要大量花费时间去测试以确保其稳定,其中比较成熟脚本如Unreal Script是为Unreal开发人员创建的,是一种强大的内置的编程语言,主要设计目标: 支持时间、网络、属性等新兴的概念并简化了游戏编程。Unreal提供的诸如Unreal Kismet是一个灵活且强大的可视化脚本系统,它允许非开发人员编写关卡中的复杂的游戏性流程脚本,进而帮助用户创建丰富的游戏剧情等,从而使得可视化脚本系统有着无可比拟的开发效率,进而走在游戏开发设计的最前沿。

四、结束语

为了降低游戏开发进度和难度,当前游戏引擎中都包含可视化脚本系统,其具有友好界面、操作方便、功能强大、修改容易等特点,开发人员只需要通过逻辑关系将已经封装好的功能模块以线条连接方式,就可以创建所需要的脚本功能,极大的发挥可视化脚本系统的灵活性、可交互性和健壮性,非常适合游戏开发。

参考文献:

[1]李广松, 陈荣征.基于Lua的网络游戏脚本系统设[J].现代计算机(专业版),2009(12):180-182

[2]Alex Varanese. 游戏脚本高级编程[M]. 北京:清华大学出版社,2006:16-21.

[3]邵堃.刘宗田.脚本语言发展研究[J].计算机科学2000,27(1).

脚本语言范文第5篇

关键词:复合型外语人才 脚本理论 口语教学

一、引言

当前,随着我国对外交往向纵深发展,传统的外语人才培养模式已经不能满足社会发展的新需求。社会发展呼唤更多的既有扎实的外语交际能力又有较强的其它专业知识的复合型、应用型外语人才。尽管学界对复合型外语人才的表述各不相同,但其核心思想却是一致的,即通过“外语+专业”的模式来培养外语人才,使其能够利用外语这个工具从事某项专业工作。

“外语+专业”的培养模式符合社会经济发展的要求,但是基于这种思想的复合型外语人才培养却面临两大问题:一是外语与其他专业之间存在明显的界面,即外语和专业之间无法融合;二是外语和专业之间出现了“此消彼长”的情况,即加强了专业却又弱化了外语。这充分说明目前复合型外语人才在培养途径方面存在问题。那么,如何才能使学习者既不削弱外语能力,又有较强的专业能力,从而具备用外语“做事”的能力呢?

二、基于脚本理论的口语教学的理论解析

1.口语交际的实质与维度

口语交际包括听说两方面,从本质上讲是一个言语理解与言语生成的相反的双向互动过程,但其所涉及的核心维度是一致的,即任何言语理解和输出都是听话者和说话者大脑中的语言知识以及对外部世界的认知这两种结构与外部信息之间互动的结果。而对于我国成年外语学习者而言,其大脑中存在着更为复杂的母语和外语两种语言的语言知识结构以及对外部世界的认知结构,这四种结构之间存在着错综复杂的交叉对比关系,也构成了外语语言与思维的特殊心理机制。在这些结构当中尤为值得关注的有两点:英汉两种语言所固化的概念以及概念隐喻等方面既有相似性也有差异;母语相对强大,外语相对弱小,母语和外语之间存在着“概念落差”。

培养复合型外语人才也相应地面临三项重要任务:重视英汉两种语言所反映的概念以及概念隐喻之间存在的差异,使英语学习者具有较深的跨文化意识和较强的跨文化交际能力;不断丰富外语的语言知识结构和认知结构,降低外语和母语之间的“概念落差”,从而具备一般的日常交际能力;在母语和外语之间有关已有认知的“概念落差”达到基本平衡以后,积极构建社会需求且自己感兴趣的专业认知结构及相应的语言知识结构,从而具备利用外语从事某项专业工作的能力。

无论是日常会话,还是专业交流,其本质都是外语口语交际,都涉及到言语理解和言语输出。那么如何才能够有效地进行交际?朱纯认为,按照听者同样熟悉的常规来组织的话语将更容易理解。这句话实际上是针对有效交际问题对听说双方都提出了要求,那就是双方必须享有“同样熟悉的常规”。而且,这种熟悉的常规共享的越多,话语的理解和表达就越简单有效。那么,这种所谓的“同样熟悉的常规”到底是什么呢?

2.外语与专业有效融合的途径

脚本(script)是计算机科学家R.Schank和社会心理学家R.Abelson针对图式理论只能解释孤立句子的生成与理解的不足而提出的一个概念,主要用于解决人工智能常见的两个问题:一是如何利用计算机处理描写复杂人类行为的段落和语篇;二是如何利用情境相似性来避免理解新情境时所必须的重复推断。他们最初利用脚本来描述诸如进食堂就餐等经常性反复性出现的极具常规的社会情境。后来,脚本的意义也从专指极具常规的社会情境扩展为可以指代任何社会情境,从单纯应用于人工智能发展到用于解释人的记忆结构。为适应人工智能以及心理学发展的需要,Schank对原有脚本概念进行了修正和丰富,使其包括记忆组织包(MOPs)和场景(Scenes)等新的表征形式,从而涵盖了其他学者对脚本概念的拓展意义。

本质上,脚本是指“专门为经常出现的事件序列设计的知识结构”,它具有动态性,依赖概念,并以“预料”为基础。脚本描述了解决一个特殊问题或应付一种特殊情境过程中所采取的一系列行动,它是人们的行动、思想及语言的基础。从认知语言学的角度看,这种知识结构显然包括对这些事件序列的认知结构以及表述这些认知结构的语言结构。因此,包含对事物的认知结构及相应的语言结构的脚本理当成为联系外语和专业的纽带与桥梁,因为它不仅是外语口语有效交际所依赖的“同样熟悉的常规”,也是适应某种工作要求所必备的专业背景知识以及在未来工作中进行创新的基础,这说明基于脚本理论的口语教学从理论上讲符合复合型外语人才培养的要求。

三、基于脚本理论口语教材设计

教材建设是口语教学的重要方面,根据复合型外语人才培养面临的三项任务,复合型外语人才的培养的教材建设应该包括以下两个阶段。

1.基础阶段

该阶段以日常生活所涉及的基本情境为主,主要用来解决英汉两种语言之间存在的“概念落差”以及两种语言在概念层面间的差异问题。通过该阶段的学习,使得外语学习者的“概念落差”达到基本平衡,并且对两种语言所反映的概念范畴以及思维所赖以存在的隐喻机制等的差异有较深入的认知,从而能够借助大脑中的脚本知识进行有关日常生活的各种交际,并为复合型外语人才培养的高级阶段做好充分的准备。因此,基础阶段的脚本应该包括饮食、购物、就医、交通、旅行、约会、情感、社会、学习等涉及日常生活的各个方面。

2.高级阶段

该阶段以带有专业性的工作场景为主,主要是构建社会需求以及自己喜爱的专业背景认知结构以及相应的语言结构。与其他专业人才不同的是,复合型外语人才对所复合的专业知识的要求并不像该专业的学生对他们的专业要求的那样,面面俱到,细致入微,而只需要把该专业最具核心的概念以及相关工作程序融为一体,形成该专业的脚本,从而使外语学习者具备利用外语进行该项专业工作的能力。该阶段脚本可以包括对外贸易、物流、旅游、国际金融等涉外行业中的具体业务情境。

四、基于脚本理论的口语课堂教学设计

根据复合型外语人才的培养任务以及教材的阶段划分,课堂教学也理应分为初级阶段和高级阶段。但是由于初级阶段所涉及的知识为大家所熟知,所以本文仅从高级阶段选取货物出口这个典型脚本作为案例,简要探讨如何根据脚本理论进行口语课堂教学设计。

1.教学目标

了解货物出口的基本流程、各环节的主要任务及相应的英语表达;了解各个阶段可能会出现的问题,增强货物出口脚本的预见性。

2.教学重点和难点

货物出口流程认知与语言表达;可能出现的问题及解决方式。

3.教学方法

多媒体辅助教学;情境模拟等。

4.教学步骤

利用多媒体演示货物出口流程、各环节以及相关英语表达范例;角色扮演,模拟货物出口流程中各个环节中的对话;利用货物出口脚本对货物出口中可能出现的问题进行对话解决。

5.教学评析

货物出口脚本属于复合型外语人才培养高级阶段的教学内容,其中所涉及的内容非常丰富,学习者需要在课前做大量的准备工作,以利于在课堂上能够迅速地理解该脚本中的事件序列,熟知事件序列中所需要的语言表达,从而在短时间内获得有关货物出口流程中的基本的知识和语言表达。

五、结论

脚本是特定场景下发生的一系列事件在大脑中的表征形式,尽管这种表征形式与现实情况有一定的差别,但是它是对现实情况的的高度抽象和系统化的重新建构,是知识结构的一种典型形式。这种典型结构与外界丰富多彩的现实事物互动以交换信息,从而不断同化新知识,也不断调整已有的知识结构。它是外语理解与表达不可或缺的重要维度,也是工作创新的源泉和基础。因此,利用脚本理论进行口语教学,使外语与专业知识充分融合,是培养复合型外语人才的一种行之有效的途径。但是基于脚本理论的口语教材设计需要整合外语与专业两方面的力量,其课堂教学设计对教师会有更高的要求。

参考文献:

[1]罗世平.也谈21世纪复合型外语人才培养模式[J].外语界,2000,(3).

[2]黄源深.21世纪的复合型英语人才[J].外语界,2001,(1).

[3]朱纯.外语教学心理学[M].上海:上海外语教育出版社,1994.

[4]尹德谟.母语与外语“知识――认知双元结构”在FLT中的理论解析[J].西华大学学报,2006,(3).

[5]Schank R C. Dynamic Memory[M]. Cambridge, England:Cambridge University Press,1982.

[6]Ungerer & Schmid. An Introduction to Cognitive linguistics[M].Beijing:FLTRP,1996.

相关期刊更多

日语教育与日本学研究

省级期刊 审核时间1个月内

华东理工大学出版社有限公司

日语教育与日本学

省级期刊 审核时间1个月内

中国日语教学研究会上海分会

华西语文学刊

省级期刊 审核时间1个月内

西南交通大学外国语学院