关闭

lua on cocos2dx 札记(三

标签: luacocos2dx游戏开发
357人阅读 评论(0) 收藏 举报
分类:


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


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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3813次
    • 积分:116
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类