cocos2dx 3.2之Lua打飞机项目

1          创建lua打飞机项目

cocos new T32Lua -dE:\Installed\cocos2d-x-3.2\cocos2d-x-3.2\projects -l lua

2  项目代码


Common.lua


--用于打印日志信息

function cclog(...)

print(string.format(...))

end

function createBackMenu(node, callback)

-- 获得窗口的大小

local winSize = cc.Director:getInstance():getWinSize()

-- 创建菜单

local menu = cc.Menu:create()

-- node中加入菜单

node:addChild(menu)

--local function startGame()

--  cc.Director:getInstance():replaceScene(SceneMenu())

--end

-- 加菜单项

local menuItem = cc.MenuItemImage:create("btn_back_normal.png", "btn_back_press.png")

-- 菜单中添加菜单项

menu:addChild(menuItem)

-- 注册处理函数

menuItem:registerScriptTapHandler(callback) -- 注册处理函数

-- menu的锚点默认是在屏幕正中间的,将它设置在屏幕右下角

menuItem:setAnchorPoint(cc.p(1, 0))

-- 重新设置菜单项的位置

menuItem:setPosition(winSize.width/2, -winSize.height/2);

-- 设置缩放,在2.3中x方向和y方向上的缩放比例必须相同,但是在3.2中没有限制

menuItem:setScale(2)

end

-- 设置触摸事件

function regTouch(node, onTouchBegan, onTouchEnded, onTouchMoved)

local evListen = cc.EventListenerTouchOneByOne:create()

evListen:registerScriptHandler(onTouchBegan, cc.Handler.EVENT_TOUCH_BEGAN)

-- 如果onTouchEnded不为空

if onTouchEnded ~= nil then

evListen:registerScriptHandler(onTouchEnded, cc.Handler.EVENT_TOUCH_ENDED)

end

-- 如果onTouchMoved不为空

if onTouchMoved ~= nil then

evListen:registerScriptHandler(onTouchMoved, cc.Handler.EVENT_TOUCH_MOVED)

end

-- 如果

local evDisp = node:getEventDispatcher()

evDisp:addEventListenerWithSceneGraphPriority(evListen, node)

end


LayerScrollBackground.lua   滚动的背景


require "Common"

function LayerScrollBackground()

local layer = cc.Layer:create()

-- 获得屏幕的大小

local winSize = cc.Director:getInstance():getWinSize()

-- 加背景

local bg = cc.Sprite:create("background.png")

-- 层中添加作为背景的精灵

layer:addChild(bg)

-- 设置精灵的锚点

bg:setAnchorPoint(0, 0)

-- 需要两个动作,一个动作向下移动,一个动作设置位置

local action1 = cc.MoveBy:create(10, {x=0, y=-winSize.height})

local action2 = cc.Place:create({x=0, y=0})

local action = cc.Sequence:create(action1, action2)

-- 执行动作

bg:runAction(cc.RepeatForever:create(action))

return layer

end


SceneMenu.lua 菜单


require "Common"

require "LayerScrollBackground"

require "SceneGame"

function SceneMenu()

local scene = cc.Scene:create()

local winSize = cc.Director:getInstance():getWinSize()

-- 滚动的背景

local bgLayer = LayerScrollBackground()

scene:addChild(bgLayer)

-- ScrollView

cc.SpriteFrameCache:getInstance():addSpriteFrames("chooselevel.plist")

local node = cc.Node:create()

for i = 1, 5 do

local spriteName = "ChooseLevel" .. i ..  ".png"

local spriteFrame = cc.SpriteFrameCache:getInstance():getSpriteFrame(spriteName)

local sprite = cc.Sprite:createWithSpriteFrame(spriteFrame)

node:addChild(sprite)

sprite:setPosition(winSize.width/2 + winSize.width*(i-1), winSize.height/2)

sprite:setTag(1000+i)

end

local scrollView = cc.ScrollView:create(winSize, node)

scene:addChild(scrollView)

scrollView:setContentSize(winSize.width*5, winSize.height)

scrollView:setDirection(0)

-- 增加Touch处理

local function onTouchBegan(touch, event)

return true

end

local function onTouchEnded(touch, event)

local sLoc = touch:getStartLocation()

local dLoc = touch:getLocation()

local d = {x=sLoc.x - dLoc.x, y=sLoc.y-dLoc.y}

local pt = node:convertToNodeSpace(sLoc)

if d.x*d.x+d.y*d.y < 25 then

for i=1, 5 do

local sprite = node:getChildByTag(1000+i)

local rc = sprite:getBoundingBox()

if cc.rectContainsPoint(rc, pt) then

cc.Director:getInstance():replaceScene(SceneGame(i))

cclog("start new game " .. i)

end

end

end

end

regTouch(scene, onTouchBegan, onTouchEnded)

local function Back()

cc.Director:getInstance():replaceScene(SceneStart())

end

createBackMenu(scene, Back)

return scene

end


SceneStart.lua


require "SceneMenu"

require "Common"

function SceneStart()

local scene = cc.Scene:create()

local winSize = cc.Director:getInstance():getWinSize()

cclog(winSize.width .. winSize.height)

-- 加背景图片

local bg = cc.Sprite:create("background.png")

scene:addChild(bg)

bg:setPosition(winSize.width/2, winSize.height/2)

-- 加菜单按钮

local menu = cc.Menu:create()

scene:addChild(menu)

local function startGame()

cc.Director:getInstance():replaceScene(SceneMenu())

end

-- 加菜单项

local menuItemStart = cc.MenuItemImage:create("btn1_normal.png", "btn1_push.png")

menu:addChild(menuItemStart)

menuItemStart:registerScriptTapHandler(startGame) -- 注册处理函数

return scene

end


SceneGame.lua


require "Common"

require "LayerScrollBackground"

function SceneGame(idx)

--创建

local scene = cc.Scene:create()

local winSize = cc.Director:getInstance():getWinSize()

-- 滚动的背景

local bgLayer = LayerScrollBackground()

-- 场景中加上层

scene:addChild(bgLayer)

-- 数据结构,子弹的数组和敌机的数组

local bullets = {}

-- 添加敌机

local enemys = {}

-- 创建英雄战机

local plane = cc.Sprite:create("Player" .. idx .. ".png")

-- 场景中添加飞机

scene:addChild(plane)

-- 设置飞机的位置

plane:setPosition(winSize.width/2, plane:getBoundingBox().height)

-- 设置plane的ZOrder

plane:setLocalZOrder(100)

----- 加载战斗机的属性

local vm =  cc.FileUtils:getInstance():getValueMapFromFile("planeinfo.xml");

plane.damage = tonumber(vm["planedamageamount" .. idx])

plane.hp = tonumber(vm["plane" .. idx .. "_hp"])

plane.cd = tonumber(vm["planeshootspeedrate" .. idx])

plane.curCD = 0;

cclog(plane.damage .. " " .. plane.hp .. " " .. plane.cd)

-- 显示分数和血的Label

local labelScore = nil

local labelHP = nil

local function createLabels()

-- 设置label

labelHP = cc.Label:createWithSystemFont("" .. plane.hp, "Arial", 50)

-- 设置Label的锚点

labelHP:setAnchorPoint(cc.p(1, 1))

-- 设置锚点的位置

labelHP:setPosition(winSize.width, winSize.height)

scene:addChild(labelHP)

labelHP:setLocalZOrder(1010)

labelScore = cc.Label:createWithSystemFont("0", "Arial", 50)

labelScore:setAnchorPoint(cc.p(0, 1))

labelScore:setPosition(0, winSize.height)

scene:addChild(labelScore)

labelScore:setLocalZOrder(1010)

end

createLabels()

-- 移动飞机

-- 增加Touch处理

local function onTouchBegan(touch, event)

return true

end

local function onTouchMoved(touch, event)

local x, y = plane:getPosition()

local d = touch:getDelta()

plane:setPosition(x+d.x, y+d.y)

end

local function onTouchEnded(touch, event)

end

regTouch(scene, onTouchBegan, onTouchEnded, onTouchMoved)

------------------- shoot

-- angle参数代表的发射角度,delta表示子弹发射的起始位置和英雄战机的位置的偏移

local function shootOne(angle, delta)

cc.SimpleAudioEngine:getInstance():playEffect("m/bullet.wav")

local bullet = cc.Sprite:create("Bullet.png")

scene:addChild(bullet)

local x, y = plane:getPosition()

bullet:setPosition(x+delta.x, y+delta.y)

bullet:setRotation(angle)

-- math.rad(角度) 把角度转换成弧度

local dx = math.sin( math.rad(angle) ) * winSize.height

local dy = math.cos( math.rad(angle) ) * winSize.height

local moveBy = cc.MoveBy:create(5, cc.p(dx, dy))

bullet:runAction(moveBy)

-- 子弹保存在数组里

table.insert(bullets, bullet)

end

local function Shoot()

local sizePlane = plane:getContentSize()

if idx == 1 then

shootOne(0, cc.p(0, sizePlane.height/2))

elseif idx == 2 then

shootOne(0, cc.p(0, sizePlane.height/2))

shootOne(0, cc.p(-sizePlane.width/4, sizePlane.height/4))

shootOne(0, cc.p(sizePlane.width/4, sizePlane.height/4))

elseif idx == 3 then

shootOne(0, cc.p(0, sizePlane.height/2))

shootOne(-30, cc.p(0, sizePlane.height/2))

shootOne(30, cc.p(0, sizePlane.height/2))

elseif idx == 4 then

shootOne(0, cc.p(0, sizePlane.height/2))

shootOne(180, cc.p(0, -sizePlane.height/2))

shootOne(90, cc.p(sizePlane.width/2, 0))

shootOne(270, cc.p(-sizePlane.width/2, 0))

elseif idx==5 then

shootOne(45, cc.p(0, 0))

shootOne(45+90, cc.p(0, 0))

shootOne(45+180, cc.p(0, 0))

shootOne(45+270, cc.p(0, 0))

end

end

local function tickShoot()

plane.curCD = plane.curCD + 1

if plane.curCD >= plane.cd then

Shoot()

plane.curCD = 0

end

end

local tickShootID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(tickShoot, 0, false)

-- 检查子弹是否飞出窗口外

local function checkBulletAndEnemy()

-- 得到子弹数量

local n = table.getn(bullets)

for i = n, 1, -1 do

local bullet = bullets[i]

-- 判断bullet是不是出了窗口

local x, y = bullet:getPosition()

if x<0 or y<0 or x>winSize.width or y > winSize.height then

bullet:removeFromParent()

table.remove(bullets, i) -- 从bullets数组中,删除下标为i的元素

cclog("bullet is out of window")

end

end

n = table.getn(enemys)

for i = n, 1, -1 do

local enemy = enemys[i]

-- 判断enemy是不是出了窗口

local x, y = enemy:getPosition()

if y < -enemy:getContentSize().height/2 then

enemy:removeFromParent()

table.remove(enemys, i) -- 从enemys数组中,删除下标为i的元素

end

end

end

local tickCheckBullet = cc.Director:getInstance():getScheduler():scheduleScriptFunc(checkBulletAndEnemy, 0, false)

-- 产生敌机的定时器

local function genEnemy(type)

-- 创建敌机精灵,加入到数组,加入渲染树

-- 增加敌机属性

-- 随机设置位置

local enemy = cc.Sprite:create("Enemy" .. type .. ".png")

table.insert(enemys, enemy)

scene:addChild(enemy)

-- 敌军飞机的额外属性

local hp = {10, 30, 100}

enemy.hp = hp[type]

local score = {1000, 3000, 10000}

enemy.score = score[type]

local speed = {150, 100, 50}

enemy.speed = speed[type]

enemy.type = type

-- 设置初始位置

local sizePlane = enemy:getContentSize()

math.randomseed(os.time())

local x = math.random(sizePlane.width/2, winSize.width-sizePlane.width/2)

local y = winSize.height + sizePlane.height/2

enemy:setPosition(x, y)

-- 设置飞机飞行动作

local distance = winSize.height + sizePlane.height + 5

local moveBy = cc.MoveBy:create(distance*1.0/enemy.speed, cc.p(0, -distance))

enemy:runAction(moveBy)

end

local function genEnemy1()

genEnemy(1)

end

local function genEnemy2()

genEnemy(2)

end

local function genEnemy3()

genEnemy(3)

end

local tickGenEnemy1 = cc.Director:getInstance():getScheduler():scheduleScriptFunc(genEnemy1, 1, false)

local tickGenEnemy2 = cc.Director:getInstance():getScheduler():scheduleScriptFunc(genEnemy2, 3, false)

local tickGenEnemy3 = cc.Director:getInstance():getScheduler():scheduleScriptFunc(genEnemy3, 10, false)

local function loadBoomAnimation()

local spriteFrameCache = cc.SpriteFrameCache:getInstance()

spriteFrameCache:addSpriteFrames("PFBoom.plist")

-- CCArray* arr = CCArray:create()

local spriteFrames = {}

for i = 1, 18 do

local spriteFrame = spriteFrameCache:getSpriteFrame("Boom_" .. i .. ".png")

table.insert(spriteFrames, spriteFrame)

end

local animation = cc.Animation:createWithSpriteFrames(spriteFrames, 0.05)

cc.AnimationCache:getInstance():addAnimation(animation, "ENEMYBOOM")

end

loadBoomAnimation()

local function removeEnemy(node, tab)

node:removeFromParent()

end

local function enemyBoom(idx)

local enemy = enemys[idx]

cc.SimpleAudioEngine:getInstance():playEffect("m/enemy" .. enemy.type .. "_down.wav")

-- 增加分数

local score = labelScore:getString()

score = tonumber(score) + enemy.score

labelScore:setString("" .. score)

table.remove(enemys, idx)

-- 执行爆炸动画,然后再调用removeFromParent

local animation = cc.AnimationCache:getInstance():getAnimation("ENEMYBOOM")

local animate = cc.Animate:create(animation)

local callfunc = cc.CallFunc:create(removeEnemy)

local seq = cc.Sequence:create(animate, callfunc)

enemy:runAction(seq)

-- enemy:removeFromParent()

end

local function collision()

local nEnemy = table.getn(enemys)

local rcPlane = plane:getBoundingBox()

for i = nEnemy, 1, -1 do

local enemy = enemys[i]

local rcEnemy = enemy:getBoundingBox()

local bEnemyBoom = false

-- 如果敌机和英雄战机碰撞, rcEnemy, rcPlane

if cc.rectIntersectsRect(rcEnemy, rcPlane) then

plane.hp = plane.hp - enemy.hp

labelHP:setString("" .. plane.hp)

if plane.hp <= 0 then

cc.Director:getInstance():replaceScene(SceneMenu())

break

end

enemyBoom(i)

bEnemyBoom = true

end

-- 跟子弹进行碰撞检测

if bEnemyBoom == false then

local nBullet = table.getn(bullets)

for j = nBullet, 1, -1 do

local bullet = bullets[j]

-- 如果子弹和敌机碰撞

local ptBullet = cc.p( bullet:getPosition() )

if cc.rectContainsPoint(rcEnemy, ptBullet) then

bullet:removeFromParent()

table.remove(bullets, j)

enemy.hp = enemy.hp - plane.damage;

if enemy.hp <= 0  then

enemyBoom(i)

break  -- 表示这个敌机不再和下一个子弹做碰撞检测

end

end

end

end

end

end

local tickCollisionID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(collision, 0, false)

local function Back()

cc.Director:getInstance():replaceScene(SceneMenu())

end

createBackMenu(scene, Back)

-- 注销定时器

local function onNodeEvent(event)

if "enter" == event then

cclog("OnEnter")

cc.SimpleAudioEngine:getInstance():playMusic("m/game_music.wav", true)

end

if "exit" == event then

cc.SimpleAudioEngine:getInstance():stopMusic()

cc.Director:getInstance():getScheduler():unscheduleScriptEntry(tickShootID)

cc.Director:getInstance():getScheduler():unscheduleScriptEntry(tickCheckBullet)

cc.Director:getInstance():getScheduler():unscheduleScriptEntry(tickGenEnemy1)

cc.Director:getInstance():getScheduler():unscheduleScriptEntry(tickGenEnemy2)

cc.Director:getInstance():getScheduler():unscheduleScriptEntry(tickGenEnemy3)

cc.Director:getInstance():getScheduler():unscheduleScriptEntry(tickCollisionID)

end

end

scene:registerScriptHandler(onNodeEvent)

return scene

end


main.lua


--引入lua的方式是通过require

require "Cocos2d"

require "Cocos2dConstants"

-- cclog 打印日志的方式

cclog = function(...)

print(string.format(...))

end

-- for CCLuaEngine traceback    lua中连接字符串的方式是通过 .. 实现的

function __G__TRACKBACK__(msg)

cclog("----------------------------------------")

cclog("LUA ERROR: " .. tostring(msg) .. "\n")

cclog(debug.traceback())

cclog("----------------------------------------")

return msg

end

local function main()

collectgarbage("collect")

-- avoid memory leak

collectgarbage("setpause", 100)

collectgarbage("setstepmul", 5000)

-- initialize director  lua中定义局部变量的是通过local的方式

local director = cc.Director:getInstance()

local glview = director:getOpenGLView()

if nil == glview then

glview = cc.GLView:createWithRect(‘HelloLua‘, cc.rect(0,0,768/2,1280/2))

director:setOpenGLView(glview)

end

-- 设置设计分辨率,这个就是图片的实际大小

glview:setDesignResolutionSize(768, 1280, cc.ResolutionPolicy.NO_BORDER)

--turn on display FPS

director:setDisplayStats(true)

--set FPS. the default value is 1.0/60 if you don‘t call this

director:setAnimationInterval(1.0 / 60)

-- 设置加载的文件包

cc.FileUtils:getInstance():addSearchPath("src")

cc.FileUtils:getInstance():addSearchPath("res")

--support

local targetPlatform = cc.Application:getInstance():getTargetPlatform()

if (cc.PLATFORM_OS_IPHONE == targetPlatform) or (cc.PLATFORM_OS_IPAD == targetPlatform) or

(cc.PLATFORM_OS_ANDROID == targetPlatform) or (cc.PLATFORM_OS_WINDOWS == targetPlatform) or

(cc.PLATFORM_OS_MAC == targetPlatform) then

cclog("result is ")

--require(‘debugger‘)()

end

-----------------------------------------------

-- 自定义的文件的require必须在 addSearchPath之后,2.2.3没有这个问题

require "SceneStart"

cc.Director:getInstance():runWithScene(SceneStart())

end

local status, msg = xpcall(main, __G__TRACKBACK__)

if not status then

error(msg)

end


运行结果:

时间: 2024-10-27 17:16:36

cocos2dx 3.2之Lua打飞机项目的相关文章

Cocos2d-x游戏开发之lua编辑器 subime 搭建,集成cocos2dLuaApi和自有类

Sublime Text http://baike.baidu.com/view/10701920.htm?from_id=8130415&type=syn&fromtitle=Sublime&fr=aladdin 简介 Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用),也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能的V

cocos2d-x 我要入门——微信打飞机(9)

这是前段时间完成的了,一直没总结起来 因为刚好3.0横空出世,重新安装vs2013,cocos2dx3.0 ,cocoStudio-- 也是想把飞机移植到手机上,遇到了很多问题,用什么方法移植,一直想在myeclipse里安装ADT插件,用于创建安卓项目,卸载安装出错卸载安装出错,那两天就是这么过来的.后来还是简单粗暴地解决了安卓环境的问题,直接下载集成ADT的eclipse.但还是在创建项目时候出错了.至今未果.(当然也是恶心了太多天了,我暂且放下,结果,沉没在各种作业当中,也沉浸在各种即将和

【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

[COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-16 10:08 30803人阅读 评论(18) 收藏 举报 游戏脚本luaanimationpython 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/681.htm

Cocos2d-x使用Luajit将Lua脚本编译为bytecode,实现加密 更新

项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密,试了一下,确实可行. 下面是使用原生的lua解释器编译字节码: 1.新建一个名为1.lua的文件,里面只有一句话print("Hello Lua"),新建一个空的out.lua脚本文件 2.开始--运行--cmd 3.luac -o out.lua 1.lua 注: luac -o [编译后脚本名] [脚本名],必要时带上脚本路径 回车之后,再打开out

Cocos2d-x游戏开发之lua工程创建

操作系统:OS X 10.85 Cocos2d-x 版本: 2.2.1 使用Cocos2d-x 可以创建lua工程,已经使用cpp创建的工程也可以继承lua进行开发,但是lua并不支持mac工程(因为一些框架的问题). 支持的工程文件如下: 所有使用创建工程create.py language 为cpp的工程,后集成lua及其工具的时候,要注意这一点. 撒 现在进入cocos2d-x 目录之下,通过cd 进入文件目录 进入之后,如果忘记了命令,可以直接运行 create_project.py 如

Cocos2d-x 3.1.1 Lua示例 ActionEaseTest(动作)

Cocos2d-x Lua示例 ActionEaseTest(动作) 本篇博客介绍Cocos2d-x中的动作,Cocos2d-x为我们提供了丰富的动作接口,下面笔者就详细介绍一下: 本系列博客介绍的是lua的实现,想看C++实现请移步到Cocos2d-x为我们提供的例子: Action类继承关系图,各位可以到http://cn.cocos2d-x.org/doc/cocos2d-x-3.0/db/d61/classcocos2d_1_1_action.html进行参考: 本篇博客的例子并没有涉及

Cocos2d-x 3.1.1 安装和创建项目---(入门必看)

1.安装python2.7.8,安装cocos2dx 3.1.1,并将python2.7.8安装路径加入系统环境变量中; 2.python2.7.8很简单,基本就是默认就可以了. 3.cocos2dx 3.1.1下载完之后,就解压.然后F:\cocos2d-x-3.1.1\build(我的解压之后是放在f盘的),然后在build这里可以找到cocos2d-win32.vc2012.sln,用vs2012打开它,然后生成解决方案(生成的这个过程比较慢,大概10分钟吧),然后在F:\cocos2d-

微信打飞机项目前期心得

这几天,我学习完了JS基础,利用JS基础简单制作了一个微信打飞机电脑版的小游戏,在这之中的过程收益良多! 之前学习JS基础的时候,老师讲过顶部小球下落特效,商品移动效果,以及定时器,当时仅仅只是简单理解到了这 3个效果的写法,并未深入使用,然而这次的项目中使用到了这些内容让我有了深的认识. 首先,我一开始对对象这种写法感到生疏,别扭,觉得使用起来很不习惯,不过这次打飞机项目我使用对象写法之后, 才感到对象的重要及方便.比如子弹的产生,敌机的产生,他们各自的参数我都可以提前用对象写好,这样我需要产

《cocos2d-x游戏开发》—— lua学习总结(一)数组的使用

在lua中,数组是用table来实现的. 1.数组的定义: self.itemArrays = {}; --作为数组来使用的表itemArrays 2. 数组插入一条数据: local showItemSprite =  CCSprite:create(); --创建一个精灵对象showItemSprite table.insert(self.itemArrays,table.getn(self.itemArrays)+1,showItemSprite); --将showItemSprite插入