一个四向动画精灵类。。。
-- a_Sprite: animated sprite
-- START
a_Sprite = class("a_Sprite",
function(spriteFrame)
--init with texture?
return CCSprite:createWithSpriteFrame(spriteFrame)
end
)
a_Sprite.__index = a_Sprite
function a_Sprite:create(...)
--init private fields, in the other words, local variables corresponding to params
local fileName, numOfFrames, numOfDirections, defaultDirection, frameDelay, spritePaused, x, y
for k,v in pairs({...}) do
--required params
if v.fileName ~= nil then
fileName = v.fileName
else
errBox("sprite file name is missing")
end
if v.numOfFrames ~= nil then
numOfFrames = v.numOfFrames
else
errBox("sprite number of frames is missing")
end
--optional param
if v.numOfDirections ~= nil then
numOfDirections = v.numOfDirections
else
numOfDirections = 4
end
if v.defaultDirection ~= nil then
defaultDirection = v.defaultDirection
else
defaultDirection = 0
end
if v.frameDelay ~= nil then
frameDelay = v.frameDelay
else
frameDelay = 0.3
end
if v.spritePaused ~= nil then
spritePaused = v.spritePaused
else
spritePaused = false
end
if v.x ~= nil then
x = v.x
else
local visibleSize = CCDirector:sharedDirector():getVisibleSize()
local origin = CCDirector:sharedDirector():getVisibleOrigin()
x = origin.x + visibleSize.width / 2
end
if v.y ~= nil then
y = v.y
else
local visibleSize = CCDirector:sharedDirector():getVisibleSize()
local origin = CCDirector:sharedDirector():getVisibleOrigin()
y = origin.y + visibleSize.height / 2
end
end
-- init public fields, could be called by object of the class
self.numOfFrames = numOfFrames
self.frameDelay = frameDelay
self.isMoved = false
local texture = CCTextureCache:sharedTextureCache():addImage(fileName)
local frameWidth = texture:getContentSize().width / numOfFrames
local frameHeight = texture:getContentSize().height / numOfDirections
local frames = CCArray:create()
for i = 1, numOfFrames do
frames:addObject(CCSpriteFrame:createWithTexture(texture, CCRectMake((i-1) * frameWidth, defaultDirection * frameHeight, frameWidth, frameHeight)))
end
local sprite = a_Sprite.new(frames:objectAtIndex(0))
sprite.isPaused = spritePaused
sprite:setPosition(x, y)
local animation = CCAnimation:createWithSpriteFrames(frames, frameDelay)
local animate = CCAnimate:create(animation);
sprite:runAction(CCRepeatForever:create(animate))
return sprite
end
function a_Sprite:setDirection(direction)
local texture = self:getTexture()
local frameWidth = texture:getContentSize().width / self.numOfFrames
local frameHeight = texture:getContentSize().height / self.numOfFrames
--debug("height: %2f, width: %2f", frameHeight, frameWidth)
local frames = CCArray:create()
for i = 1, self.numOfFrames do
frames:addObject(CCSpriteFrame:createWithTexture(texture, CCRectMake((i-1) * frameWidth, direction * frameHeight, frameWidth, frameHeight)))
end
local animation = CCAnimation:createWithSpriteFrames(frames, self.frameDelay)
local animate = CCAnimate:create(animation);
self:runAction(CCRepeatForever:create(animate))
end
function a_Sprite:move(direction, speed)
--debug(direction)
if not self.isMoved then
return
else
self:setDirection(direction)
--down
if direction == 0 then
self:setPosition(self:getPositionX(), self:getPositionY() - speed)
--left
elseif direction == 1 then
self:setPosition(self:getPositionX() - speed, self:getPositionY())
--up
elseif direction == 2 then
self:setPosition(self:getPositionX(), self:getPositionY() + speed)
--right
elseif direction == 3 then
self:setPosition(self:getPositionX() + speed, self:getPositionY())
end
end
--self:setDirection(direction)
end
function a_Sprite:getDirection(tx, ty)
local x, y = self:getPosition()
--debug("x = %0.2f, y = %0.2f, tx = %0.2f, ty = %0.2f", x, y, tx, ty)
--top area of the Y axis
if ty - y > 0 then
--up
if ty - y > math.abs(tx - x) then
--debug("move up")
return 2
else
--right
if tx - x > 0 then
--debug("move right")
return 3
--left
else
--debug("move left")
return 1
end
end
--bottom area of the Y axis
else
--down
if math.abs(ty - y) > tx - x then
--debug("move down")
return 0
else
--right
if tx - x > 0 then
--debug("move right")
return 3
--left
else
--debug("move left")
return 1
end
end
end
end
-- END