lua+cocos2dx飞镖怪物

  • Post author:
  • Post category:其他




以下是小弟写的一个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__)–设置第一个运行的逻辑



版权声明:本文为ChococlateTan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。