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