您的位置:首页 > 编程语言 > Lua

3D游戏精灵-兔子脚本 (lua语言开发,xfun平台)

2012-12-09 15:07 791 查看
require "XLuaBase"

--{{XFUN EVENT

--在此处添加事件

X_ON_LUAINIT(OnItemInit)

X_ONCURANIMATEEND(OnItemCurAnimateEnd)

X_ONSPRITECLOSETO(OnSpriteCloseTo)

ON_XEVENT(412,"*","OnSpriteMoveTo")

--}}XFUN EVENT

--范围半径

#define NRADIUS 1000

--动画总数

#define NANIMATECOUNT 4

--当前行走动画索引

#define NANIMATEID_MOVE 2

--精灵移动时两个节点之间的最短距离

#define NMOVE_MINDISTANCE 100

---------------------------------------------

--事件处理函数

---------------------------------------------

LXRandomMove = {}

LXRandomMove.__index = LXRandomMove

objRandomMove = {}

setmetatable(objRandomMove,LXRandomMove) ---设置元表数据

---------------------------------------------

--类实现函数

---------------------------------------------

--物体初始化

function LXRandomMove:OnItemInit(objSprite, fRadius)

math.randomseed(os.time())

self:Init(objSprite, fRadius)

--开始移动物体

self:MoveNext()

end

--初始化数据

function LXRandomMove:Init(objSprite, fRadius)

self.objSprite = objSprite --精灵对象

local objTrans = objSprite.GetTranslate() --中心点位置

self.ptCenter = objTrans.GetPosition()

self.fRadius = fRadius --范围半径

self.tMove = {} --移动速度

if self.tMove then

self.tMove.nMaxMove = 1.4 --最大移动速度(m/s)

self.tMove.nMinMove = 1.0 --最小移动速度(m/s)

end

self.nPlayAnimateCount = 1 --待机时动画总数

self.nCurAnimate = -1 --当前动画索引

self:InitPath(self.ptCenter) --路径节点

end

--初始化路径数据

function LXRandomMove:InitPath(ptLast)

--随机路线

self.Nodes = {} --当前路径的节点

self.nNodeCount = 10 --当前节点总数

self.nNodeIndex = 1 --当前节点索引

local ptNode

local ptPrevious = ptLast

local nMove

local fDistance

for i = 1, self.nNodeCount, 1 do

self.Nodes[i] = X3DPoint.CreateObject() --节点数据

repeat

if i > 1 then

ptPrevious = self.Nodes[i - 1]

end

nMove = self:RandomOneData(self.Nodes[i])

fDistance = ptLast.Distance(self.Nodes[i])

until fDistance > NMOVE_MINDISTANCE --两个节点之间的距离大于某值

--得到地表高度

self.Nodes[i].y = theSpace.GetTerrainHeight(self.Nodes[i])

--保存速度

self.tMove[i] = nMove

end

end

--随机一个数据

function LXRandomMove:RandomOneData(ptNode)

--随机速度

local nMove = math.random(self.tMove.nMinMove*10, self.tMove.nMaxMove*10) /10

--随机半径和角度

local nAngle = math.random(0, 360)

local fAnale = math.rad(nAngle)

local nRadius = math.random(0, self.fRadius)

--使用缓存

ptNode.z = self.ptCenter.y

ptNode.x = self.ptCenter.x + nRadius*math.cos(fAnale)

ptNode.z = self.ptCenter.z + nRadius*math.sin(fAnale)

return nMove

end

--当前路径结束

function LXRandomMove:OnCurPathEnd(ptLast)

self:InitPath(ptLast)

end

--当前动画结束

function LXRandomMove:OnItemCurAnimateEnd(param)

if param == self.nCurAnimate then

self.nPlayAnimateCount = self.nPlayAnimateCount - 1

if self.nPlayAnimateCount > 0 then

self:PlayAnimate(this)

else

self:MoveNext()

end

end

end

--移动到下一个路径

function LXRandomMove:MoveNext()

--当前位置

local objTrans = self.objSprite.GetTranslate()

local ptCur = objTrans.GetPosition()

--下一个位置

self.nNodeIndex = self.nNodeIndex + 1

if self.nNodeIndex > self.nNodeCount then

self:OnCurPathEnd(ptCur)

self.nNodeIndex = 1

end

local ptNext = self.Nodes[self.nNodeIndex]

--移动物体

self:MoveTo(ptCur,ptNext)

end

--从一个位置移动到另外一个位置

function LXRandomMove:MoveTo(ptCur,ptNext)

local ptDirection = ptNext - ptCur

ptDirection.y = 0

local fDistance = ptNext.Distance(ptCur)

local fTime = (fDistance/100) / self.tMove[self.nNodeIndex] *1000 --100是将单位从cm换算成m, 1000是将秒换算为毫秒

--物体移动

self.objSprite.MoveTo(ptNext, ptDirection, 0, NANIMATEID_MOVE, fTime, 0)

end

--移动到目标位置

function LXRandomMove:OnSpriteMoveTo(param)

--随机判断做动画还是移动

--self.nPlayAnimateCount = math.random(0, self.nPlayAnimateCount)

self.nPlayAnimateCount = 1

if self.nPlayAnimateCount > 0 then

self:PlayAnimate()

else

self:MoveNext()

end

end

--做动画

function LXRandomMove:PlayAnimate()

repeat

self.nCurAnimate = math.random(0, NANIMATECOUNT - 1)

until self.nCurAnimate ~= NANIMATEID_MOVE

self.objSprite.PlayAnimate(self.nCurAnimate, false)

end

--人物靠近

function LXRandomMove:OnSpriteCloseTo(objSprite)

if not objSprite then

return

end

--得到自身位置

local objSelfTrans = self.objSprite.GetTranslate()

local ptSelf = objSelfTrans.GetPosition()

--得到人物位置

local objSpriteTrans = objSprite.GetTranslate()

local ptDes = objSpriteTrans.GetPosition()

--向人物走出一步

local vecDir = ptDes - ptSelf

vecDir.Normalize()

ptDes.x = ptSelf.x + vecDir.x*NMOVE_MINDISTANCE

ptDes.y = ptSelf.y + vecDir.y*NMOVE_MINDISTANCE

ptDes.z = ptSelf.z + vecDir.z*NMOVE_MINDISTANCE

self:MoveTo(ptSelf, ptDes)

end

---------------------------------------------

--事件处理函数

---------------------------------------------

--初始化

function OnItemInit(this,nEventID,SendName,param)

--初始化数据

objRandomMove:OnItemInit(this, NRADIUS)

--精灵靠近

this.EnableClosetoEvent(5)

end

--动画结束

function OnItemCurAnimateEnd(this,nEventID,SendName,param)

objRandomMove:OnItemCurAnimateEnd(param)

end

--移动到目标位置

function OnSpriteMoveTo(this,nEventID,SendName,param)

objRandomMove:OnSpriteMoveTo(param)

end

--人物靠近

function OnSpriteCloseTo(this,nEventID,SendName,param)

if param.bEnter == 1 then --靠近

local objSprite = param.ItemObject

objRandomMove:OnSpriteCloseTo(objSprite)

end

end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐