1000行代码写小游戏(终)

最后献上完整的1000行代码,基本功能已经完成,可以通过配置小怪和矿的位置和大小控制玩家时长和难度:

--------------------------------------------------------------------------------------------
-- Added by ???
--------------------------------------------------------------------------------------------
require("CommonFunction")
require("CommonVariables")
require("FontHelper")
--------------------------------------------------------------------------------------------
local MineSecretDialog = class( "MineSecretDialog", function()
	return ModalDialogBase:create()
end)

local Tag = {
	MainBg = 50,
    LevelLabel = 100,
    SkillDotLabel = 101,
    MoneyLabel = 102,
    IronKeyLabel = 103,
    SilverKeyLabel = 104,
    GoldKeyLabel = 105,
    CollectionLabel = 110,  -- 110-120
    ExpNumLabel = 200,
    HpNumLabel = 201,
    ActiveNumLabel = 202,
    RecoverNumLabel = 203,
    AtkNumLabel = 204,
    DefNumLabel = 205,
    BonusNumLabel = 250,
    BonusLockLabel = 251,
    BonusSprite = 252,
    SysNumLabel = 260,
    SysCostLabel = 270,
    SysNameLabel = 271,
}

local userData = {
    floor = 1,      -- 楼层
    level = 0,      -- 等级
    curExp = 0,     -- 当前经验
    maxExp = 0,     -- 升级经验
    money = 0,      -- 金钱
    ironKey = 0,    -- 铁钥匙
    silverKey = 0,  -- 银钥匙
    goldKey = 0,    -- 金钥匙
    skillDot = 0,   -- 升级点
    curActive = 0,  -- 当前体力
    maxActive = 0,  -- 体力
    curHp = 0,      -- 当前生命
    maxHp = 0,      -- 生命
    recover = 0,    -- 恢复
    atk = 0,        -- 攻击
    def = 0,        -- 防御
    collection = {  -- 收藏
        {letter = "S", num = 0},
        {letter = "H", num = 0},
        {letter = "O", num = 0},
        {letter = "W", num = 0},
        {letter = "E", num = 0},
        {letter = "R", num = 0},
    },
}
local ColorList = {
    H_Font_GrowUpSmall_10,
    H_Font_BrightYellow_10,
    G_Font_Purple_10,
    H_Font_LightBlue_10,
    H_Font_ORANGE_10,
    H_Font_DarkYellowLittle,
}
local ColorLock = {
    H_Font_LightBlue_10,
    H_Font_ORANGE_10,
    G_Font_Purple_10,
}
local BarMaxNum = {
    HP = 1000,
    ACTIVE = 500,
    RECOVER = 200,
    ATK = 200,
    DEF = 200,
    KEY = 99,
    COLLECT = 1,
}

local BonusType = CreateEnumTable({"MINE", "ENEMY", "SYSTEM", "BOSS"})
local SysType = CreateEnumTable({"AACT", "AATK", "ADEF", "AKEY", "ADOT", "ROCK"})
local sz = CCDirector:sharedDirector():getVisibleSize()
local posX, posX2, posY, gap = 150, 320, sz.height - 13, 15
local barSize = CCSizeMake(120,12)
--------------------------------------------------------------------------------------------
function MineSecretDialog:init()
    self:registerScriptHandler( self.onNodeEvent )
	self:setContentSize( sz );

    CFModuleReload("MineSecretConfig")

	local menu = ScrollMenu:create()
    menu:setContentSize(sz);
    self:addChild( menu, 2 );
    menu:setPosition( ccp(0,0) );
    self.m_menu = menu

    AddSprite("p_diabg_common.png", ccp(sz.width/2, sz.height/2), self, Tag.MainBg, -10)

    local bgKuang = CCScale9Sprite:create( "p_pvpol_bg_blue.png", CCRectMake(0, 0, 485/2, 173/2), CCRectMake(282/2, 90/2, 10, 10) )
    bgKuang:setContentSize( CCSizeMake(sz.width, sz.height) )
    self:addChild( bgKuang, 1 )
    bgKuang:setPosition( sz.width/2, sz.height/2 )
    self.m_bgKuang = bgKuang

    local arrowup = AddSprite("p_cmn_arrow_up.png", ccp(posX2 + 175, posY + 5), bgKuang)
    arrowup:setScale(0.5)
    arrowup:runAction(CCRepeatForever:create(CCSequence:createWithTwoActions(
            CCEaseSineInOut:create(CCMoveBy:create(0.8, ccp(0, 2))), 
            CCEaseSineInOut:create(CCMoveBy:create(0.8, ccp(0, -2))))))

    AddSprite("yaoshi1.png", ccp(posX2 + 150, posY - gap * 2), bgKuang):setScale(0.25)
    AddSprite("yaoshi2.png", ccp(posX2 + 177, posY - gap * 2), bgKuang):setScale(0.25)
    AddSprite("yaoshi3.png", ccp(posX2 + 204, posY - gap * 2), bgKuang):setScale(0.25)

    AddLabel( "经验", ccp(posX - 12, posY), bgKuang, 0, ColorList[1] )
    self.m_expBar = AddScale9Sprite("p_purecolor_green.png", ccp(posX, posY), CCRectMake(0, 0, 10, 10), CCRectMake(2, 2, 6, 6), barSize, bgKuang)
    self.m_expBar:setAnchorPoint(ccp(0, 0.5))

    AddLabel( "生命", ccp(posX - 12, posY - gap), bgKuang, 0, ColorList[2] )
    self.m_hpBar = AddScale9Sprite("p_purecolor_brightyellow.png", ccp(posX, posY - gap), CCRectMake(0, 0, 10, 10), CCRectMake(2, 2, 6, 6), barSize, bgKuang)
    self.m_hpBar:setAnchorPoint(ccp(0, 0.5))
    AddButton( "p_followpet_detail_addbtn.png", "p_followpet_detail_addbtn.png", menu, ccp(posX + 130, posY - gap), self.onAddHp, self )

    AddLabel( "体力", ccp(posX - 12, posY - gap * 2), bgKuang, 0, ColorList[3] )
    self.m_activeBar = AddScale9Sprite("p_purecolor_purple.png", ccp(posX, posY - gap * 2), CCRectMake(0, 0, 10, 10), CCRectMake(2, 2, 6, 6), barSize, bgKuang)
    self.m_activeBar:setAnchorPoint(ccp(0, 0.5))
    AddButton( "p_followpet_detail_addbtn.png", "p_followpet_detail_addbtn.png", menu, ccp(posX + 130, posY - gap*2), self.onAddActive, self )

    AddLabel( "恢复", ccp(posX2 - 12, posY), bgKuang, 0, ColorList[4] )
    self.m_recoverBar = AddScale9Sprite("p_purecolor_blue.png", ccp(posX2, posY), CCRectMake(0, 0, 10, 10), CCRectMake(2, 2, 6, 6), barSize, bgKuang)
    self.m_recoverBar:setAnchorPoint(ccp(0, 0.5))
    AddButton( "p_followpet_detail_addbtn.png", "p_followpet_detail_addbtn.png", menu, ccp(posX2 + 130, posY), self.onAddRecover, self )

    AddLabel( "攻击", ccp(posX2 - 12, posY - gap), bgKuang, 0, ColorList[5] )
    self.m_atkBar = AddScale9Sprite("p_purecolor_orange.png", ccp(posX2, posY - gap), CCRectMake(0, 0, 10, 10), CCRectMake(2, 2, 6, 6), barSize, bgKuang)
    self.m_atkBar:setAnchorPoint(ccp(0, 0.5))
    AddButton( "p_followpet_detail_addbtn.png", "p_followpet_detail_addbtn.png", menu, ccp(posX2 + 130, posY - gap), self.onAddAtk, self )

    AddLabel( "防御", ccp(posX2 - 12, posY - gap * 2), bgKuang, 0, ColorList[6] )
    self.m_defBar = AddScale9Sprite("p_purecolor_darkyellow.png", ccp(posX2, posY - gap * 2), CCRectMake(0, 0, 10, 10), CCRectMake(2, 2, 6, 6), barSize, bgKuang)
    self.m_defBar:setAnchorPoint(ccp(0, 0.5))
    AddButton( "p_followpet_detail_addbtn.png", "p_followpet_detail_addbtn.png", menu, ccp(posX2 + 130, posY - gap*2), self.onAddDef, self )

    self:initUserData(1)
    self:updateUserData()
    self:addMineAndEnemy()

    -- 关闭按钮
    local pClose = ImageButton:create("p_btn_close.png", "p_btn_close_down.png", nil, self)
    menu:addChild( pClose, 0 )
    pClose:setPosition( ccp(sz.width - 1, sz.height - 1) ) 
    pClose:registerScriptTapHandler( self.onClose )
    pClose:setAnchorPoint(ccp(1, 1))
end

-- 更新所有UserData
function MineSecretDialog:updateUserData()
    self:addUserExp(0, 0, true)
    self:updateUserHp(0, 0, true)
    self:updateUserActive(0, 0, true)
    self:addUserRecoverAtkDef(0, 0, 0, true)
    self:updateUserMoney(0, true)
    self:updateUserKey(0, 0, 0, true)
    self:updateUserCollection(nil, 0, true)
end
-- 初始化固定等级的最大值
function MineSecretDialog:initUserData(level)
    userData.level = level
    userData.maxExp = getUserMaxExp(level)
    if level == 1 then
        local initBattleData = getInitBattleData()
        userData.curActive = initBattleData.active
        userData.maxActive = initBattleData.active
        userData.curHp = initBattleData.hp
        userData.maxHp = initBattleData.hp
        userData.recover = initBattleData.recover
        userData.atk = initBattleData.atk
        userData.def = initBattleData.def
    end
end
-- 更新等级,经验条和升级点
function MineSecretDialog:addUserExp(addExp, addSkillDot, isInit)
    addExp = addExp or 0
    addSkillDot = addSkillDot or 0
    isInit = isInit or false

    local updateLevel, updateSkillDot, updateExp = false, false, false
    if addExp > 0 then
        if userData.curExp + addExp >= userData.maxExp then
            self:updateUserLevel(addExp)
            updateLevel, updateSkillDot = true, true
        else
            userData.curExp = userData.curExp + addExp
        end
        updateExp = true
    end
    if addSkillDot ~= 0 then
        userData.skillDot = math.max(0, userData.skillDot + addSkillDot)
        updateSkillDot = true
    end

    if updateLevel or isInit then AddLabel( userData.floor.." F    ".."LV. "..userData.level, ccp(48, sz.height - 16), self.m_bgKuang, Tag.LevelLabel, H_Font_Btn_Cancle_Stroke ) end
    if updateSkillDot or isInit then AddLabel( userData.skillDot, ccp(posX2 + 162, posY), self.m_bgKuang, Tag.SkillDotLabel, ColorList[1] ) end
    if updateExp or isInit then
        self.m_expBar:setScaleX(userData.curExp/userData.maxExp)
        AddLabel( userData.curExp.."/"..userData.maxExp, ccp(posX + 5, posY), self.m_bgKuang, Tag.ExpNumLabel, ColorList[1], ccp(0, 0.5) )
    end
end
-- 计算增加的经验能够连升几级
function MineSecretDialog:updateUserLevel(addExp)
    userData.curExp = userData.curExp + addExp - userData.maxExp
    self:initUserData(userData.level + 1)
    userData.skillDot = userData.skillDot + getLevelUpAddSkillDot(userData.level)
    if userData.curExp >= userData.maxExp then
        self:updateUserLevel(0)
    end
end
-- 更新血量
function MineSecretDialog:updateUserHp(addHp, addMaxHp, isInit)
    addHp = addHp or 0
    addMaxHp = addMaxHp or 0
    isInit = isInit or false

    local updateHp = false
    if addMaxHp > 0 then
        userData.maxHp = userData.maxHp + addMaxHp
        updateHp = true
    end
    if addHp ~= 0 then
        userData.curHp = math.min(userData.maxHp, math.max(0, userData.curHp + addHp))
        updateHp = true
    end

    if updateHp or isInit then
        self.m_hpBar:setScaleX(countBarScaleX(userData.curHp/userData.maxHp, userData.maxHp/BarMaxNum.HP))
        AddLabel( userData.curHp.."/"..userData.maxHp, ccp(posX + 5, posY - gap), self.m_bgKuang, Tag.HpNumLabel, ColorList[2], ccp(0, 0.5) )
    end
end
-- 更新体力
function MineSecretDialog:updateUserActive(addActive, addMaxActive, isInit)
    addActive = addActive or 0
    addMaxActive = addMaxActive or 0
    isInit = isInit or false

    local updateActive = false
    if addMaxActive > 0 then
        userData.maxActive = userData.maxActive + addMaxActive
        updateActive = true
    end
    if addActive ~= 0 then
        userData.curActive = math.min(userData.maxActive, math.max(0, userData.curActive + addActive))
        updateActive = true
    end

    if updateActive or isInit then
        self.m_activeBar:setScaleX(countBarScaleX(userData.curActive/userData.maxActive, userData.maxActive/BarMaxNum.ACTIVE))
        AddLabel( userData.curActive.."/"..userData.maxActive, ccp(posX + 5, posY - gap * 2), self.m_bgKuang, Tag.ActiveNumLabel, ColorList[3], ccp(0, 0.5) )
    end
end
-- 更新恢复,攻击,防御
function MineSecretDialog:addUserRecoverAtkDef(addRecover, addAtk, addDef, isInit)
    addRecover = addRecover or 0
    addAtk = addAtk or 0
    addDef = addDef or 0
    isInit = isInit or false

    if addRecover > 0 or isInit then
        userData.recover = userData.recover + addRecover
        self.m_recoverBar:setScaleX(countBarScaleX(userData.recover/BarMaxNum.RECOVER))
        AddLabel( userData.recover, ccp(posX2 + 5, posY), self.m_bgKuang, Tag.RecoverNumLabel, ColorList[4], ccp(0, 0.5) )
    end

    if addAtk > 0 or isInit then
        userData.atk = userData.atk + addAtk
        self.m_atkBar:setScaleX(countBarScaleX(userData.atk/BarMaxNum.ATK))
        AddLabel( userData.atk, ccp(posX2 + 5, posY - gap), self.m_bgKuang, Tag.AtkNumLabel, ColorList[5], ccp(0, 0.5) )
    end

    if addDef > 0 or isInit then
        userData.def = userData.def + addDef
        self.m_defBar:setScaleX(countBarScaleX(userData.def/BarMaxNum.DEF))
        AddLabel( userData.def, ccp(posX2 + 5, posY - gap * 2), self.m_bgKuang, Tag.DefNumLabel, ColorList[6], ccp(0, 0.5) )
    end
end
-- 更新金币
function MineSecretDialog:updateUserMoney(addMoney, isInit)
    addMoney = addMoney or 0
    isInit = isInit or false

    if addMoney ~= 0 or isInit then
        userData.money = math.max(0, userData.money + addMoney)
        AddLabel( "$ "..userData.money, ccp(posX2 + 151, posY - gap), self.m_bgKuang, Tag.MoneyLabel, ColorList[2], ccp(0, 0.5) )
    end
end
-- 更新铜,银,金钥匙
function MineSecretDialog:updateUserKey(addIronKey, addSilverKey, addGoldKey, isInit)
    addIronKey = addIronKey or 0
    addSilverKey = addSilverKey or 0
    addGoldKey = addGoldKey or 0
    isInit = isInit or false

    if addIronKey ~= 0 or isInit then
        userData.ironKey = math.min(BarMaxNum.KEY, math.max(0, userData.ironKey + addIronKey))
        AddLabel( userData.ironKey, ccp(posX2 + 163, posY - gap * 2), self.m_bgKuang, Tag.IronKeyLabel, H_Font_Gray_Stroke_10, ccp(0.5, 0.5) )
    end

    if addSilverKey ~= 0 or isInit then
        userData.silverKey = math.min(BarMaxNum.KEY, math.max(0, userData.silverKey + addSilverKey))
        AddLabel( userData.silverKey, ccp(posX2 + 190, posY - gap * 2), self.m_bgKuang, Tag.SilverKeyLabel, H_Font_Gray_Stroke_10, ccp(0.5, 0.5) )
    end

    if addGoldKey ~= 0 or isInit then
        userData.goldKey = math.min(BarMaxNum.KEY, math.max(0, userData.goldKey + addGoldKey))
        AddLabel( userData.goldKey, ccp(posX2 + 217, posY - gap * 2), self.m_bgKuang, Tag.GoldKeyLabel, H_Font_Gray_Stroke_10, ccp(0.5, 0.5) )
    end
end
-- 更新收藏品
function MineSecretDialog:updateUserCollection(collectLetter, addNum, isInit)
    addNum = addNum or 1
    isInit = isInit or false
    local count = 0

    if collectLetter ~= nil then 
        for i=1,#(userData.collection) do
            if userData.collection[i].letter == collectLetter then 
                userData.collection[i].num = math.min(BarMaxNum.COLLECT, userData.collection[i].num + addNum)
                local color = H_Font_WhiteSmall
                if userData.collection[i].num > 0 then color = ColorList[i] end
                AddLabel( userData.collection[i].letter, ccp(15 + (i-1)*20, posY - gap * 2), self.m_bgKuang, Tag.CollectionLabel+i, color, ccp(0.5, 0.5) )
            end
            if userData.collection[i].num > 0 then count = count + 1 end
        end
        if count == #(userData.collection) then
            -- TODO: 集齐七龙珠,召唤神龙
            for i=1,#(userData.collection) do
                userData.collection[i].num = userData.collection[i].num - 1
            end
            isInit = true
        end
    end

    if isInit then
        for i=1,#(userData.collection) do
            local color = H_Font_WhiteSmall
            if userData.collection[i].num > 0 then color = ColorList[i] end
            AddLabel( userData.collection[i].letter, ccp(15 + (i-1)*20, posY - gap * 2), self.m_bgKuang, Tag.CollectionLabel+i, color, ccp(0.5, 0.5) )
        end
    end
end
-- 增加矿,敌人和系统
function MineSecretDialog:addMineAndEnemy()
    local bonusList = getBonusListInfo()
    for i,v in ipairs(bonusList) do
        if v.types == BonusType.MINE then
            self:initMineStatus(v)
        elseif v.types == BonusType.ENEMY then
            self:initEnemyStatus(v)
        elseif v.types == BonusType.SYSTEM then
            self:initSystemStatus(v)
        elseif v.types == BonusType.BOSS then

        end
    end
end
-- 初始化矿的信息和状态
function MineSecretDialog:initMineStatus(v)
    local times = 0
    local haveRunAction = false 
    local itemSize = CCSizeMake(v.width, v.height)
    local mineData = getMineActivendRecover(v.width, v.height)

    local sprite = CCScale9Sprite:create("p_purecolor_gray.png", CCRectMake(0, 0, 10, 10), CCRectMake(2, 2, 6, 6))
    sprite:setContentSize(itemSize)
    local mineItem = CCMenuItemSprite:create( sprite, sprite )
    self.m_menu:addChild(mineItem, 1)
    mineItem:setPosition(v.pos)
    mineItem:setAnchorPoint(ccp(0, 1))
    
    local itemBar = AddScale9Sprite("p_purecolor_blue.png", ccp(0, v.height/2), CCRectMake(0, 0, 10, 10), CCRectMake(2, 2, 6, 6), itemSize, mineItem)
    itemBar:setAnchorPoint(ccp(0, 0.5))
    if v.locked then AddLabel( "锁", ccp(v.width/2, v.height/2), mineItem, Tag.BonusLockLabel, ColorLock[v.key or 1] ) end
    if v.digged == false then 
        itemBar:setScaleX(0)
        AddLabel( "0%", ccp(3, v.height/2), mineItem, Tag.BonusNumLabel, G_Font_Black_8, ccp(0, 0.5) ) 
    end

    mineItem:registerScriptTapHandler(function ()
        game.fleetingLabelManager:pushLabel( "posX "..v.pos.x.." posY "..v.pos.y, self )
        cclog("the mine data is",mineData.life,v.digged,v.curlife)
        if v.locked then
            if self:checkKeyEnough(v.key) then
                v.locked = false
                game.fleetingLabelManager:pushLabel( "解锁成功", self )
                mineItem:removeChildByTag( Tag.BonusLockLabel, true )
            end
        else
            if v.digged and self.m_timer - times < 0.6 then
                return
            elseif v.digged then
                times = self.m_timer
            end
            -- 判断剩余的体力是否足够此次点击消耗
            local cost = mineData.clickCost
            if v.digged == false then cost = math.ceil(math.min(mineData.life - v.curlife, mineData.clickCost)) end
            if userData.curActive < cost then
                game.fleetingLabelManager:pushLabel( "体力不足", self, "error" )
                return
            end
            self:updateUserActive(0 - cost)

            if v.digged then
                -- 收获金币,并有1%概率获得收藏品
                local collectPercent = self:getRandomNum(0.8, 1.2)
                self:updateUserMoney(math.floor((mineData.clickMoney)*collectPercent))
                if v.collect and self:getRandomResult(1) then self:updateUserCollection(v.collect) end
            else
                v.curlife = v.curlife + cost
                itemBar:setScaleX(v.curlife/mineData.life)
                AddLabel( math.floor(100*v.curlife/mineData.life).."%", ccp(3, v.height/2), mineItem, Tag.BonusNumLabel, G_Font_Black_8, ccp(0, 0.5) ) 
               
                if v.curlife == mineData.life then
                    v.digged = true
                    mineItem:stopAllActions()
                    mineItem:removeChildByTag( Tag.BonusNumLabel, true )
                    -- 开发完成,开始收获金币、经验,并有20%概率获得收藏品
                    self:addUserExp(mineData.digExp)
                    self:updateUserMoney(mineData.digMoney)
                    if v.collect and self:getRandomResult(20) then self:updateUserCollection(v.collect) end
                else
                    if haveRunAction == false then
                        haveRunAction = true
                        local array = CCArray:create()
                        array:addObject(CCDelayTime:create(0.2))                    
                        array:addObject(CCCallFunc:create(function ()
                            if v.curlife > 0 then 
                                v.curlife = math.max(0, v.curlife - mineData.recover) 
                                itemBar:setScaleX(v.curlife/mineData.life)
                                AddLabel( math.floor(100*v.curlife/mineData.life).."%", ccp(3, v.height/2), mineItem, Tag.BonusNumLabel, G_Font_Black_8, ccp(0, 0.5) ) 
                            end
                            if v.curlife == 0 then
                                haveRunAction = false
                                mineItem:stopAllActions()
                            end
                        end))   
                        mineItem:runAction(CCRepeatForever:create(CCSequence:create(array)))                        
                    end
                end
            end
        end
    end)
end
-- 初始化敌人的信息和状态
function MineSecretDialog:initEnemyStatus(v)
    local haveRunAction = false 
    local itemSize = CCSizeMake(v.width, v.height)
    local enemyData = getEnemyLifeAndRecover(v.width, v.height)

    local sprite = CCScale9Sprite:create("p_purecolor_red.png", CCRectMake(0, 0, 10, 10), CCRectMake(2, 2, 6, 6))
    sprite:setContentSize(itemSize)
    local enemyItem = CCMenuItemSprite:create( sprite, sprite )
    self.m_menu:addChild(enemyItem, 1)
    enemyItem:setPosition(v.pos)
    enemyItem:setAnchorPoint(ccp(0, 1))
    
    local itemBar = AddScale9Sprite("p_purecolor_brightyellow.png", ccp(0, v.height/2), CCRectMake(0, 0, 10, 10), CCRectMake(2, 2, 6, 6), itemSize, enemyItem)
    itemBar:setAnchorPoint(ccp(0, 0.5))
    if v.locked then AddLabel( "锁", ccp(v.width/2, v.height/2), enemyItem, Tag.BonusLockLabel, ColorLock[v.key or 1] ) end
    if v.digged == false then v.curlife = enemyData.life end
    itemBar:setScaleX(v.curlife/enemyData.life)
    AddLabel( v.curlife.."/"..enemyData.life, ccp(3, v.height/2), enemyItem, Tag.BonusNumLabel, G_Font_Black_8, ccp(0, 0.5) ) 

    enemyItem:registerScriptTapHandler(function ()
        game.fleetingLabelManager:pushLabel( "posX "..v.pos.x.." posY "..v.pos.y, self )
        cclog("the enemy data is",v.locked,v.digged,v.curlife)
        if v.locked then
            if self:checkKeyEnough(v.key) then
                v.locked = false
                game.fleetingLabelManager:pushLabel( "解锁成功", self )
                enemyItem:removeChildByTag( Tag.BonusLockLabel, true )
            end
        else
            if v.digged == false then
                -- 根据攻击和防御计算消耗的血量
                local userDamage = math.ceil(math.max(enemyData.atk/4, enemyData.atk - userData.def))
                local enemyDamage = math.ceil(math.max(userData.atk/4, userData.atk - enemyData.def))
                if userData.curHp < userDamage then
                    self:updateUserHp(0 - userData.curHp)
                    -- game.fleetingLabelManager:pushLabel( "血量不足", self, "error" )
                    return
                else
                    self:updateUserHp(0 - userDamage)
                end

                v.curlife = math.max(0, v.curlife - enemyDamage)
                itemBar:setScaleX(v.curlife/enemyData.life)
                AddLabel( v.curlife.."/"..enemyData.life, ccp(3, v.height/2), enemyItem, Tag.BonusNumLabel, G_Font_Black_8, ccp(0, 0.5) ) 
               
                if v.curlife == 0 then
                    v.digged = true
                    enemyItem:stopAllActions()
                    -- 开发完成,开始收获金币、经验,并有50%概率获得收藏品
                    self:addUserExp(enemyData.digExp)
                    self:updateUserMoney(enemyData.digMoney)
                    if v.collect and self:getRandomResult(50) then self:updateUserCollection(v.collect) end
                else
                    if haveRunAction == false then
                        haveRunAction = true
                        local array = CCArray:create()
                        array:addObject(CCDelayTime:create(0.2))                    
                        array:addObject(CCCallFunc:create(function ()
                            if v.curlife < enemyData.life then 
                                v.curlife = math.min(enemyData.life, v.curlife + enemyData.recover) 
                                itemBar:setScaleX(v.curlife/enemyData.life)
                                AddLabel( v.curlife.."/"..enemyData.life, ccp(3, v.height/2), enemyItem, Tag.BonusNumLabel, G_Font_Black_8, ccp(0, 0.5) ) 
                            end
                            if v.curlife == enemyData.life then
                                haveRunAction = false
                                enemyItem:stopAllActions()
                            end
                        end))   
                        enemyItem:runAction(CCRepeatForever:create(CCSequence:create(array)))                        
                    end
                end
            end
        end
    end)
end
-- 初始化系统的信息和状态
function MineSecretDialog:initSystemStatus(v)
    local times = 0
    local haveRunAction = false 
    G_Font_Purple = { name = DefaultFont, size = 15, color = FontColor.Purple }
    G_Font_Orange = { name = DefaultFont, size = 15, color = FontColor.Orange }
    G_Font_Blue = { name = DefaultFont, size = 15, color = FontColor.Blue }
    local rockBonus = {"6", "8", "9", "E", "$", "@", "*"}
    local itemSize = CCSizeMake(v.width, v.height)

    local sprite = CCScale9Sprite:create("p_purecolor_"..v.color..".png", CCRectMake(0, 0, 10, 10), CCRectMake(2, 2, 6, 6))
    sprite:setContentSize(itemSize)
    local sysItem = CCMenuItemSprite:create( sprite, sprite )
    self.m_menu:addChild(sysItem, 1)
    sysItem:setPosition(v.pos)
    sysItem:setAnchorPoint(ccp(0, 1))

    local clickCost,addNum,sysName = 0,0,""
    if v.sys == SysType.AACT then
        clickCost,addNum,sysName = v.cost[v.curst],v.curst*5,"ACT"
    elseif v.sys == SysType.AATK then
        clickCost,addNum,sysName = v.cost[v.curst],v.curst*5,"ATK"
    elseif v.sys == SysType.ADEF then
        clickCost,addNum,sysName = v.cost[v.curst],v.curst*5,"DEF"
    elseif v.sys == SysType.ADOT then
        clickCost,addNum,sysName = v.cost[v.curst],v.curst*5,"DOT"
    elseif v.sys == SysType.AKEY then
        clickCost,sysName = v.cost[1],"KEY"
        AddLabel( " ? ", ccp(v.width/2, v.height/2), sysItem, Tag.SysNumLabel+1, G_Font_Purple, ccp(0.5, 0.5) )
    elseif v.sys == SysType.ROCK then
        clickCost,sysName = v.cost[1],"ROCK"
        AddLabel( " ? ", ccp(v.width/2 - 20, v.height/2), sysItem, Tag.SysNumLabel+1, G_Font_Purple, ccp(0.5, 0.5) )
        AddLabel( " ? ", ccp(v.width/2, v.height/2), sysItem, Tag.SysNumLabel+2, G_Font_Purple, ccp(0.5, 0.5) )
        AddLabel( " ? ", ccp(v.width/2 + 20, v.height/2), sysItem, Tag.SysNumLabel+3, G_Font_Purple, ccp(0.5, 0.5) )
    end
    AddLabel( "$"..clickCost, ccp(5, v.height-10), sysItem, Tag.SysCostLabel, G_Font_Black_8, ccp(0, 0.5) )
    AddLabel( sysName, ccp(v.width-5, 10), sysItem, Tag.SysNameLabel, G_Font_Black_8, ccp(1, 0.5) ) 
    if addNum > 0 then AddLabel( "+"..addNum, ccp(v.width/2, v.height/2), sysItem, Tag.SysNumLabel, G_Font_Purple, ccp(0.5, 0.5) ) end

    sysItem:registerScriptTapHandler(function ()
        if self.m_timer - times < 1 then
            return
        else
            times = self.m_timer
        end
        local clickcost = v.cost[1]
        if #v.cost > 1 and v.curst <= #v.cost then
            clickcost = v.cost[v.curst]
        end
        game.fleetingLabelManager:pushLabel( "posX "..v.pos.x.." posY "..v.pos.y.." cost "..clickcost, self )

        local redMoney = true
        if v.sys == SysType.ROCK and v.curst > 0 then
            redMoney = false
        end
        if userData.money < clickcost and redMoney then
            game.fleetingLabelManager:pushLabel( "金币不足", self, "error" )
            return
        elseif redMoney then
            self:updateUserMoney(0 - clickcost)
        end

        local addnum = 0
        if v.sys == SysType.AACT then
            self:updateUserActive(0, v.curst*5)
            v.curst = v.curst + 1
            addnum = v.curst*5
        elseif v.sys == SysType.AATK then
            self:addUserRecoverAtkDef(0, v.curst*5, 0)
            v.curst = v.curst + 1
            addnum = v.curst*5
        elseif v.sys == SysType.ADEF then
            self:addUserRecoverAtkDef(0, 0, v.curst*5)
            v.curst = v.curst + 1
            addnum = v.curst*5
        elseif v.sys == SysType.ADOT then
            self:addUserExp(0, v.curst*5)
            v.curst = v.curst + 1
            addnum = v.curst*5
        elseif v.sys == SysType.AKEY then
            if self:getRandomResult(1) then
                AddLabel( " 紫 ", ccp(v.width/2, v.height/2), sysItem, Tag.SysNumLabel+1, G_Font_Purple, ccp(0.5, 0.5) )
                self:updateUserKey(0, 0, 1)
            elseif self:getRandomResult(10) then
                AddLabel( " 橙 ", ccp(v.width/2, v.height/2), sysItem, Tag.SysNumLabel+1, G_Font_Orange, ccp(0.5, 0.5) )
                self:updateUserKey(0, 1, 0)
            else
                AddLabel( " 蓝 ", ccp(v.width/2, v.height/2), sysItem, Tag.SysNumLabel+1, G_Font_Blue, ccp(0.5, 0.5) )
                self:updateUserKey(1, 0, 0)
            end
        elseif v.sys == SysType.ROCK then
            if v.curst == 0 then v.curst = v.curst + 1 end
            if haveRunAction then 
                v.curst = v.curst + 1
                sysItem:stopAllActions() 
                haveRunAction = false
            end

            if v.curst < 4 then
                local array = CCArray:create()
                array:addObject(CCDelayTime:create(0.1))                    
                array:addObject(CCCallFunc:create(function ()
                    v.result[v.curst] = v.result[v.curst] + 1
                    if v.result[v.curst] > #rockBonus then v.result[v.curst] = 1 end
                    AddLabel( rockBonus[v.result[v.curst]], ccp(v.width/2 + (v.curst-2)*20, v.height/2), sysItem, Tag.SysNumLabel+v.curst, G_Font_Purple, ccp(0.5, 0.5) )
                    haveRunAction = true
                end))   
                if haveRunAction == false then
                    sysItem:runAction(CCRepeatForever:create(CCSequence:create(array))) 
                end
            else
                -- 进行结算
                game.fleetingLabelManager:pushLabel( v.result[1].." "..v.result[2].." "..v.result[3], self, "error" )
                if v.result[1] == v.result[2] and v.result[2] == v.result[3] and v.result[3] == 1 then

                elseif v.result[1] == v.result[2] and v.result[2] == v.result[3] and v.result[3] == 2 then

                elseif v.result[1] == v.result[2] and v.result[2] == v.result[3] and v.result[3] == 3 then

                elseif v.result[1] == v.result[2] and v.result[2] == v.result[3] and v.result[3] == 4 then

                elseif v.result[1] == v.result[2] and v.result[2] == v.result[3] and v.result[3] == 5 then

                elseif v.result[1] == v.result[2] and v.result[2] == v.result[3] and v.result[3] == 6 then

                elseif v.result[1] == v.result[2] and v.result[2] == v.result[3] and v.result[3] == 7 then

                end
                v.curst = 0
                v.result = {0,0,0}
            end
        end

        if #v.cost > 1 then
            if v.curst > #v.cost  then
                AddLabel( "完", ccp(v.width/2, v.height/2), sysItem, Tag.SysNumLabel, G_Font_Purple, ccp(0.5, 0.5) )
                sysItem:removeChildByTag( Tag.SysCostLabel, true )
                sysItem:setEnabled(false)
                return
            else
                AddLabel( "$"..v.cost[v.curst], ccp(5, v.height-10), sysItem, Tag.SysCostLabel, G_Font_Black_8, ccp(0, 0.5) )
                AddLabel( "+"..addnum, ccp(v.width/2, v.height/2), sysItem, Tag.SysNumLabel, G_Font_Purple, ccp(0.5, 0.5) )
            end
        end

    end)
end


-- 检查对应种类的钥匙是否足够,不足进行提示,足够扣除钥匙、更新数量并解锁
function MineSecretDialog:checkKeyEnough(keyId, needNum)
    local keyList = {"ironKey", "silverKey", "goldKey"}
    local keyStr = {"蓝钥匙", "橙钥匙", "紫钥匙"}
    local costNum = {0, 0, 0}
    keyId = keyId or 1
    keyId = math.max(1, math.min(3, keyId))
    needNum = needNum or 1
    if (userData[keyList[keyId]] - needNum) >= 0 then
        costNum[keyId] = 0 - needNum
        self:updateUserKey(costNum[1], costNum[2], costNum[3])
        return true
    else
        game.fleetingLabelManager:pushLabel( keyStr[keyId].."不足", self, "error" )
        return false
    end
end
-- 随机生成传入概率数的随机结果
function MineSecretDialog:getRandomResult(percentage)
    math.randomseed(tostring(os.time()):reverse():sub(1, 6))  
    local random = math.random(1, 100)
    if random <= percentage then
        return true
    else
        return false
    end
end
-- 随机生成两个数之间的数
function MineSecretDialog:getRandomNum(from, to)
    math.randomseed(tostring(os.time()):reverse():sub(1, 6))  
    local random = math.random(from*10, to*10)/10
    return random
end

function MineSecretDialog:onEnter()
    self.schedulerId = CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(function()
            -- 恢复体力值
            if userData.curActive < userData.maxActive then
                self:updateUserActive(1)
            end
            -- 恢复生命值
            if userData.curHp < userData.maxHp then
                self:updateUserHp(math.floor(userData.recover/10))
            end

            self.m_timer = self.m_timer + 0.2
        end
        , 0.2, false)   
end

function MineSecretDialog:onExit()
    CCDirector:sharedDirector():getScheduler():unscheduleScriptEntry(self.schedulerId)
end

function MineSecretDialog:onEnterTransitionDidFinish()
end

function MineSecretDialog:create()
	local instance = MineSecretDialog:new()

    instance.m_menu = nil
    instance.m_bgKuang = nil
    instance.m_expBar = nil
    instance.m_hpBar = nil
    instance.m_activeBar = nil
    instance.m_recoverBar = nil
    instance.m_atkBar = nil
    instance.m_defBar = nil

    instance.m_timer = 0

	function instance.onNodeEvent(event)
		if event == 'enter' then
			instance:onEnter()
		elseif event == 'exit' then 
			instance:onExit()
		elseif event == 'enterTransitionFinish' then
			instance:onEnterTransitionDidFinish()
		end
	end

    function instance.onAddHp()
        if userData.skillDot > 0 then
            instance:addUserExp(0, -1)
            instance:updateUserHp(0, 1)
        else
            game.fleetingLabelManager:pushLabel( "技能点不足", instance, "error" )
        end
    end

    function instance.onAddActive()
        if userData.skillDot > 0 then
            instance:addUserExp(0, -1)
            instance:updateUserActive(0, 1)
        else
            game.fleetingLabelManager:pushLabel( "技能点不足", instance, "error" )
        end
    end

    function instance.onAddRecover()
        if userData.skillDot > 0 then
            instance:addUserExp(0, -1)
            instance:addUserRecoverAtkDef(1, 0, 0)
        else
            game.fleetingLabelManager:pushLabel( "技能点不足", instance, "error" )
        end
    end

    function instance.onAddAtk()
        if userData.skillDot > 0 then
            instance:addUserExp(0, -1)
            instance:addUserRecoverAtkDef(0, 1, 0)
        else
            game.fleetingLabelManager:pushLabel( "技能点不足", instance, "error" )
        end
    end

    function instance.onAddDef()
        if userData.skillDot > 0 then
            instance:addUserExp(0, -1)
            instance:addUserRecoverAtkDef(0, 0, 1)
        else
            game.fleetingLabelManager:pushLabel( "技能点不足", instance, "error" )
        end
    end

	function instance.onClose()
        instance:close(false)
    end

	-- 初始化
	instance:init()
	return instance
end

return MineSecretDialog


PS:有些函数可能没有列全,请参考之前文章写的lua函数


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值