lua on cocos2dx 札记(三


一个四向动画精灵类。。。


-- 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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值