lua+cocos2dx飞镖怪物

以下是小弟写的一个lua+cocos2dx的脚本,请大家多多指教。里面使用的cocos2dx引擎是2.1的。

只需要将下面代码和上面3个图片贴到相应代码即可

小弟有的编译器老是编译不了为android请好心人贴一下图。

交流:QQ:390032295



-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
    print("----------------------------------------")
    print("LUA ERROR: " .. tostring(msg) .. "\n")
    print(debug.traceback())
    print("----------------------------------------")
end
--[[后台输出记录]]
local cclog = function(...)
    print(string.format(...))
end
local visibleSize = CCDirector:sharedDirector():getVisibleSize()--屏幕可见大小
local origin = CCDirector:sharedDirector():getVisibleOrigin()--屏幕可见位置
local screenWidth = CCDirector:sharedDirector():getWinSize().width;--屏幕宽度
local screenHeight = CCDirector:sharedDirector():getWinSize().height;--屏幕高度


local player
--[[创建玩家]]
local function createPlayer()
    local player = CCSprite:create("Player.png")--创建玩家精灵
    player:setPosition(player:getTextureRect().size.width/2,screenHeight/2)--获取图片宽大小
    return player
end


local blood
--[[创建血条]]
local bloodCreate = function (bloodSprite)
    bloodSprite = CCSprite:create("blood.jpg")--创建血条精灵
    bloodSprite:setTextureRect(CCRectMake(0, 0, bloodSprite:getTextureRect().size.width - 100,  20))--截取血条图片大小
    bloodSprite:setPosition(bloodSprite:getTextureRect().size.width/2,screenHeight - bloodSprite:getTextureRect().size.height/2)--设置位置
    CCLayerBackground:addChild(bloodSprite)--添加血条精灵到场景
    return bloodSprite
end
--[[控制血条]]
local function bloodControl(bloodSprite)
    if bloodSprite:getTextureRect().size.width ~= 0 then
        bloodSprite:setTextureRect(CCRectMake(0, 0, bloodSprite:getTextureRect().size.width - 1,  20))
        bloodSprite:setPosition(bloodSprite:getTextureRect().size.width/2,screenHeight - bloodSprite:getTextureRect().size.height/2)
    else
--结束返回主界面
    end
end


local tblTarget = {}--怪物临时表
local tblProjectlie = {}--飞镖临时表


--[[创建怪物]]
local function target2()
    local target = CCSprite:create("Target.png")--创建怪物精灵
    local random = math.random(0,visibleSize.height)--随机获取怪物y高度
--检测怪物高度是否在可视屏幕内
    if(random <= 20) then
random = random + 20
    elseif(random >= visibleSize.height - 20) then
random = random - 20
    end


    target:setPosition(origin.x + visibleSize.width,random)--设置怪物精灵的位置
    CCLayerBackground:addChild(target)--添加怪物精灵到场景


    table.insert(tblTarget,target)--向存放怪物的临时表添加这个怪物


--当怪物走到最左边的时候,移除这个精灵,并且减少血量
    local tarfinsh = function()
        for index = 1 , table.getn(tblTarget)
        do
            if tblTarget[index] == target
            then
                table.remove(tblTarget,index)--向怪物临时表移除这个精灵
            end
        end


        CCLayerBackground:removeChild(target,true)--在场景内移除怪物精灵
        bloodControl(blood)--减少血量
    end


    local actionMoveTo = CCMoveTo:create(5.0,CCPoint(origin.x,random))--创建从左到右的动作,运行时间为5秒
    local actionMoveDone = CCCallFuncN:create(tarfinsh)--创建上面声明的动作过程
    target:runAction(CCSequence:createWithTwoActions(actionMoveTo,actionMoveDone))--为怪物精灵添加动作
end
--[[创建发射的飞镖精灵]]
local function projectileMove(x,y)
    local playerPX,playerPY = player:getPosition()--获取玩家精灵的位置
    if(x < playerPX) then return end--如果点击的地方在玩家精灵的左侧,则不发射(因为写碰撞逻辑的时候没有考虑)


    local spriteProjectile = CCSprite:create("Projectile.png")--创建飞镖精灵
    spriteProjectile:setPosition(20,screenHeight/2)--设置飞镖精灵
    CCLayerBackground:addChild(spriteProjectile)--在场景里添加飞镖精灵
    table.insert(tblProjectlie,spriteProjectile)--向飞镖临时表添加飞镖精灵


--飞镖移动到最右边的时候移除出场面
    local profinsh = function()
        for index = 1 , table.getn(tblProjectlie)
        do
            if tblProjectlie[index] == spriteProjectile
            then
                table.remove(tblProjectlie,index)
            end
        end
        CCLayerBackground:removeChild(spriteProjectile,true)
    end


    local offx = math.abs(x - playerPX)
    local offy = y - playerPY
    cclog("offx:"..offx.."   offy:"..offy)


    local rate = offy / offx
    local realx = screenWidth - playerPX
    local realy = realx * rate
    local reall = math.sqrt(realx*realx+realy*realy)


    cclog("realx:"..realx.."   realy:"..realy)








    local actionMoveTo = CCMoveTo:create(reall/400,CCPoint(realx,realy))--飞镖移动的到点击地方
    local actionMoveDone = CCCallFuncN:create(profinsh)--到飞镖移动到最右边触发的动作


    local spanSprite = CCRotateTo:create(1,90)--旋转角度
    local spanTimes = CCRepeat:create(spanSprite,reall/400)--重复旋转次数


    local spanAction = CCSpawn:createWithTwoActions(spanTimes,actionMoveTo)--同时进行动作,一边旋转一边移动
    spriteProjectile:runAction(CCSequence:createWithTwoActions(spanAction,actionMoveDone))--为飞镖精灵添加动作
end


local label
--检测碰撞
--这里的移除方法写得不好,是直接在数组里移除,会导致移除项下一位不能遍历
--最好是写一个临时删除记录的表将要消除target的位置记录下来,当往下遍历的时候
--下一target位置减1,若遍历第二个匹配时再减1
--为避免如上问题:设计时一飞镖只能消灭一个敌人
local function CheckCash()
    for index = 1 , table.getn(tblProjectlie)
    do
        --local t = {3,3,5,10}
        --删除后自动伸缩表 local t = { 3, 5, 10, nil}
        --被删的索引后那个元素永远不会被遍历到
        if tblProjectlie[index] ~= nil then--移除数组之后,数组的最后一个为空nil
local pro = tblProjectlie[index]
if pro:getPosition() ~= nil then
local proPX,proPY = pro:getPosition()
local proRect
= CCRect(proPX - pro:getTextureRect().size.width/2,
proPY - pro:getTextureRect().size.height/2,
pro:getTextureRect().size.width,
pro:getTextureRect().size.height)


for index2 = 1 , table.getn(tblTarget) do
if tblTarget[index2] ~= nil then
local tar = tblTarget[index2]


if tar:getPosition() ~= nil then
local tarPX,tarPY = tar:getPosition()
local tarRect
= CCRect(tarPX - tar:getTextureRect().size.width/2,
tarPY - tar:getTextureRect().size.height/2,
tar:getTextureRect().size.width,
tar:getTextureRect().size.height)
--碰撞移除
if (CCRect.intersectsRect(proRect,tarRect)) then
table.remove(tblTarget,index2)
table.remove(tblProjectlie,index)
--print(tar)
CCLayerBackground:removeChild(tar,true)
CCLayerBackground:removeChild(pro,true)
--CCLayerBackground:removeChild(spriteProjectile,true)


local score = label:getString()


CCLayerBackground:removeChild(label,true)


label =CCLabelTTF:create(score + 1,"Arial",20)
label:setPosition(50,screenHeight - 50)
label:setColor(ccc3(0, 255, 255))
CCLayerBackground:addChild(label)
end
else
table.remove(tblTarget,index2)
end
end
end


else
table.remove(tblProjectlie,index)
end
        end
    end
end
--[[点击开始]]
local function onTouchBegan(x, y)
    cclog("onTouchBegan: %0.2f, %0.2f", x, y)
return true
end
--[[拖动]]
local function onTouchMoved(x, y)
    -- cclog("onTouchMoved: %0.2f, %0.2f", x, y)
end
--[[点击结束]]
local function onTouchEnded(x, y)
    cclog("onTouchEnded: %0.2f, %0.2f", x, y)
    projectileMove(x,y)
end
--[[调用上面的触屏方式三个方法]]
local function onTouch(eventType, x, y)
    if eventType == CCTOUCHBEGAN then
        return onTouchBegan(x, y)
    elseif eventType == CCTOUCHMOVED then
        return onTouchMoved(x, y)
    else
        return onTouchEnded(x, y)
    end
end


--------------------------------------
--[[create menu]]
local function createLayerMenu()
    local layerMenu = CCLayer:create()


    local menuPopup, menuTools, effectID


    local function menuCallbackClosePopup()
        menuPopup:setVisible(false)
    end


    local function menuCallbackOpenPopup()
        menuPopup:setVisible(true)
    end


    -- add a popup menu
    local menuPopupItem = CCMenuItemImage:create()
    menuPopupItem:setPosition(screenWidth / 2, screenHeight / 2)
    menuPopup = CCMenu:createWithItem(menuPopupItem)
    local itemStart = CCMenuItemLabel:create(CCLabelTTF:create("START!!!!!","Arial",20))
    layerMenu:addChild(menuPopup)
    return layerMenu
end
--------------------------------------




local function gameStart()
    -- avoid memory leak设定LUAGC的拉圾回收参数
    --collectgarbage("setpause", 100)
    --collectgarbage("setstepmul", 5000)
    require "hello2"
    cclog("result is " .. myadd(3, 5))
    cclog("visibleSize.width:"..visibleSize.width.."visibleSize.height:"..visibleSize.height)
    cclog("origin.x:"..origin.x.."      origin.y:"..origin.y)
    cclog("screenWidth:"..screenWidth)
    cclog("screenHeight:"..screenHeight)


    CCSceneBackground = CCScene:create()--创建场景
    CCDirector:sharedDirector():replaceScene(CCSceneBackground)--替换场景
    CCLayerBackground = CCLayerColor:create(ccc4(255, 255, 255, 255))--创建白色背景
    CCSceneBackground:addChild(CCLayerBackground)--添加背景到场景


    player = createPlayer()--创建玩家
    CCLayerBackground:addChild(player)--添加玩家


    local run1 = CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(target2, 1, false)--注册循环,让怪物不断进攻
    local run2 = CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(CheckCash, 0.1, false)--注册循环,检测飞镖与怪物碰撞


    --记分牌
    label = CCLabelTTF:create(0,"Arial",20)
                    label:setPosition(50,screenHeight - 50)
                    label:setColor(ccc3(0, 255, 255))
                    CCLayerBackground:addChild(label)


    blood = bloodCreate(blood)--血条


    --【创建菜单界面事件】
    local itemMain_Click = function()
        collectgarbage("setpause", 100)
        collectgarbage("setstepmul", 5000)


        CCDirector:sharedDirector():getScheduler():unscheduleScriptEntry(run1)--注销循环
        CCDirector:sharedDirector():getScheduler():unscheduleScriptEntry(run2)--注销循环
        tblTarget={}--清空怪物临时表
        tblProjectlie={}--清空飞镖临时表


        local sceneMeun = CCScene:create()--
        CCDirector:sharedDirector():replaceScene(sceneMeun)--运行场景
        local layerMeun = CCLayerColor:create(ccc4(0, 0, 0, 0))--创建白色背景
        sceneMeun:addChild(layerMeun)--添加背景到场景
--【创建开始按钮游戏界面点击事件】
        local itemStart_Click = function()
            gameStart()--开始游戏
            CCDirector:sharedDirector():resume()--恢复导演
        end
--【创建退出按钮点击事件】
        local itemExit_Click = function()
            CCDirector:sharedDirector():endToLua()--结束游戏
        end




        local itemStart = CCMenuItemFont:create("Start")--创建菜单子项目,开始
        local itemExit = CCMenuItemFont:create("Exit")--创建菜单子项目,退出


        itemStart:registerScriptTapHandler(itemStart_Click)--注册游戏开始按钮
        itemExit:registerScriptTapHandler(itemExit_Click)--注册退出按钮


        local actionFrames = CCArray:create()--创建数组
        actionFrames:addObject(itemStart)
        actionFrames:addObject(itemExit)


        local menu = CCMenu:createWithArray(actionFrames)
        menu:alignItemsVertically()--上到下显示
        layerMeun:addChild(menu)--将菜单添加到场景


        CCDirector:sharedDirector():resume()--恢复导演
    end
--【创建重新开始按钮点击事件】
    local itemRestart_Click = function()
        CCDirector:sharedDirector():getScheduler():unscheduleScriptEntry(run1)--注销循环
        CCDirector:sharedDirector():getScheduler():unscheduleScriptEntry(run2)--注销循环
        tblTarget={}--清空怪物临时表
        tblProjectlie={}--清空飞镖临时表


        gameStart()--开始游戏
        CCDirector:sharedDirector():resume()--恢复导演
    end
--【创建退出按钮点击事件】
    local itemExit_Click = function()
        CCDirector:sharedDirector():endToLua()
    end
--创建文字
    local labelMain = CCLabelTTF:create("Main","Arial",20)
    labelMain:setColor(ccc3(0, 255, 255))
    local labelRestart = CCLabelTTF:create("Restart","Arial",20)
    labelRestart:setColor(ccc3(0, 255, 255))
    local labelExit = CCLabelTTF:create("Exit","Arial",20)
    labelExit:setColor(ccc3(0, 255, 255))
--创建菜单子项目
    local itemMain = CCMenuItemLabel:create(labelMain)
    local itemRestart = CCMenuItemLabel:create(labelRestart)
    local itemExit = CCMenuItemLabel:create(labelExit)
--注册菜单点击事件
    itemMain:registerScriptTapHandler(itemMain_Click)
    itemRestart:registerScriptTapHandler(itemRestart_Click)
    itemExit:registerScriptTapHandler(itemExit_Click)


    local actionFrames = CCArray:create()
    actionFrames:addObject(itemMain)
    actionFrames:addObject(itemRestart)
    actionFrames:addObject(itemExit)


    local menu = CCMenu:createWithArray(actionFrames)
    menu:alignItemsVertically()--上到下显示
    menu:setVisible(false)--隐藏菜单
    CCLayerBackground:addChild(menu)--添加菜单到场景
    --【创建点击菜单事件】
    local itemMeun_OnClick = function()
        if CCDirector:sharedDirector():isPaused() == true then
        CCDirector:sharedDirector():resume()
        CCLayerBackground:setTouchEnabled(true)
        menu:setVisible(false)
        else
        CCDirector:sharedDirector():pause()
        CCLayerBackground:setTouchEnabled(false)
        menu:setVisible(true)
        end
    end


--创建菜单子项目
    local labelMeun = CCLabelTTF:create("Menu","Arial",20)
    labelMeun:setColor(ccc3(0, 255, 255))
    local itemMeun = CCMenuItemLabel:create(labelMeun)
    itemMeun:registerScriptTapHandler(itemMeun_OnClick)
--创建菜单
    local menu = CCMenu:createWithItem(itemMeun)
    menu:setPosition(30, 30)
    CCLayerBackground:addChild(menu)




    CCLayerBackground:registerScriptTouchHandler(onTouch)--注册菜单点击事件
    CCLayerBackground:setTouchEnabled(true)--设置为可以触屏
end
--【游戏主菜单】
local function mainMeun()
    collectgarbage("setpause", 100)
    collectgarbage("setstepmul", 5000)


    local sceneMeun = CCScene:create()
    CCDirector:sharedDirector():runWithScene(sceneMeun)--运行场景
    local layerMeun = CCLayerColor:create(ccc4(0, 0, 0, 0))--创建白色背景
    sceneMeun:addChild(layerMeun)--添加背景到场景


    local function itemStart_Click()
        gameStart()
    end
    local function itemExit_Click()
        CCDirector:sharedDirector():endToLua()
    end




    local itemStart = CCMenuItemFont:create("Start")
    local itemExit = CCMenuItemFont:create("Exit")


    itemStart:registerScriptTapHandler(itemStart_Click)
    itemExit:registerScriptTapHandler(itemExit_Click)






    local actionFrames = CCArray:create()
    actionFrames:addObject(itemStart)
    actionFrames:addObject(itemExit)


    local menu = CCMenu:createWithArray(actionFrames)
    menu:alignItemsVertically()--上到下显示
    layerMeun:addChild(menu)
end
--------------
local function main()
    mainMeun()
end
xpcall(main, __G__TRACKBACK__)--设置第一个运行的逻辑

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值