利用工作之余学习了cocos2d-x lua,现在把之前学习的知识运用一下,做个小游戏,用的是cocos2d-x 3.2 lua 开发工具是 cocos IDe
看看效果图
开始编写吧
1、项目结构
2、编写游戏的开始场景 StartGame.lua
--游戏启动场景StartGame=class("StartGame",function () return cc.Scene:create()end)function StartGame:createScene()local scene=StartGame.new()scene:@R_403_3941@()return scene endfunction StartGame:@R_403_3941@() local layer=cc.Layercolor:create(cc.c4b(255,255,255))self:addChild(layer)local size=cc.Director:getInstance():getWinSize()local start=cc.MenuItemFont:create("开始") start:setcolor(cc.c3b(0,0)) start:setposition(size.wIDth/2,size.height/2) start:registerScriptTapHandler(function(sender)--跳到游戏场景cc.Director:getInstance():replaceScene(GameScene:createScene())end) local exit=cc.MenuItemFont:create("退出") exit:setScale(0.5) exit:setcolor(cc.c3b(0,0)) exit:setposition(size.wIDth-50,50) exit:registerScriptTapHandler(function(sender) cc.Director:getInstance():endTolua() end) local menu=cc.Menu:create(start,exit)menu:setposition(0,0)layer:addChild(menu) endreturn StartGame
开始场景只有一个开始按钮和结束按钮,比较简单
3、编写游戏中的 小黑人精灵,小黑人精灵是一个精灵动画,并为小黑人创建一个矩形的刚体,用于碰撞检测
Hero.lua
--英雄精灵Hero=class("Hero",function () return cc.Sprite:create()end)function Hero:createHero() --- --@return cc.Sprite splocal sp=Hero.new()sp:init()return sp; endfunction Hero:init() local wIDth = 50 local height = 55--设置精灵的显示大小 self:setContentSize(wIDth,height) -- self:setTexture(Res.hero) self:setScale(0.5) self:setname("hero") self:setTag(1) --创建一个矩形body local heroBody=cc.PhysicsBody:createBox(cc.size(wIDth,height)) self:setPhysicsBody(heroBody)-- self:getPhysicsBody():setDynamic(false) self:getPhysicsBody():setRotationEnable(false) --设置不受重力的影响-- self:getPhysicsBody():setGravityEnable(false)--设置碰撞掩码 heroBody:setcategoryBitmask(0x03) heroBody:setContactTestBitmask(0x01) heroBody:setCollisionBitmask(0x01) --加载小黑人纹理 local cache=cc.SpriteFrameCache:getInstance() cache:addSpriteFrames(Res.heroPList,Res.heroPng) --小黑人动画 local animFrames={} for i=1,8 do local frame=cache:getSpriteFrame(string.format("hero_%d.png",i)) animFrames[i]=frame end local animation=cc.Animation:createWithSpriteFrames(animFrames,0.1) local animate=cc.Animate:create(animation) self:runAction(cc.RepeatForever:create(animate)) endreturn Hero
4、编写游戏中的障碍物
Block.lua
--障碍物精灵Block=class("Block",function () return cc.Sprite:create()end)function Block:createBlock(blockSpeed) local sp=Block.new() sp:init(blockSpeed) return sp endfunction Block:init(blockSpeed)--随机障碍物的大小 local wIDth = math.random(0,20) + 5 local height = math.random(0,100) + 20--设置障碍物精灵在最最右边出现-- self:setpositionX(cc.Director:getInstance():getVisibleSize().wIDth)-- self:setContentSize(wIDth,height) self:setTextureRect(cc.rect(0,wIDth,height)) self:setcolor(cc.c3b(0,0)) --设置为静态刚体 local blockBody=cc.PhysicsBody:createBox(cc.size(wIDth,height)) self:setPhysicsBody(blockBody) self:getPhysicsBody():setDynamic(false) blockBody:setcategoryBitmask(0x03) --类别掩码 默认值为0xFFFFFFFF blockBody:setContactTestBitmask(0x02) --接触掩码 默认值为 0x00000000 blockBody:setCollisionBitmask(0x02) --碰撞掩码 默认值为0xFFFFFFFF self:scheduleUpdateWithPriorityLua(function(dt) --不断改变x的位置 self:setpositionX(self:getpositionX()-blockSpeed) if self:getpositionX() < 0 then --移除自身 self:unscheduleUpdate() self:removeFromParent() end end,0) endreturn Block
5、编写游戏中的宝石精灵
Gem.lua
--宝石精灵类Gem=class("Gem",function () return cc.Sprite:create()end)function Gem:ctor() --宝石的移动速度 self.gemSpeed=1 endfunction Gem:cretateGem()local sp=Gem.new() sp:init() return sp endfunction Gem:init()local size=cc.Director:getInstance():getWinSize() self:setname("gem") --取整1、2、3 math.randomseed(os.time()) local index=math.floor(math.random(1,3)) local cache=cc.SpriteFrameCache:getInstance() --绿宝石 if 1 == index then self:setSpriteFrame(cache:getSpriteFrame("green.png")) self:setScale(0.25) self:setTag(21) --紫宝石 elseif 2 == index then self:setSpriteFrame(cache:getSpriteFrame("purple.png")) self:setScale(0.25) self:setTag(22) --红宝石 elseif 3 == index then self:setSpriteFrame(cache:getSpriteFrame("red.png")) self:setScale(0.25) self:setTag(23) end local gemBody=cc.PhysicsBody:createEdgeBox(cc.size(25,25)) gemBody:setcategoryBitmask(0x01) --类别掩码 默认值为0xFFFFFFFF gemBody:setContactTestBitmask(0x01) --接触掩码 默认值为 0x00000000 gemBody:setCollisionBitmask(0x01) --碰撞掩码 默认值为0xFFFFFFFF self:setPhysicsBody(gemBody) self:scheduleUpdateWithPriorityLua(function(dt) --不断改变x的位置 self:setpositionX(self:getpositionX()-self.gemSpeed) if self:getpositionX() < 0 then --移除自身 self:unscheduleUpdate() self:removeFromParent() end end,0) end--设置宝石移动的速度function Gem:setGemSpeed(speed) self.gemSpeed=speedendfunction Gem:getGemSpeed(speed) return self.gemSpeedendreturn Gem
6、编写游戏中的控制类,这里控制了精灵的出现和碰撞
Control.lua
--控制精灵的动作Control=class("Control")function Control:create(layer,positionY) local control=Control.new() control:init(layer,positionY)return control endfunction Control:ctor()self.size=nil self.layer = nil self.positionY=nil self.effectLabel=nil --移动的速度 self.blockSpeed=2--控制什么时候创建 障碍物精灵self.createBlockHero=nilself.nextBlockHero=nil--控制什么时候创建宝石self.createGem=nilself.nextGem=nil end-----@param cc.Layer layerfunction Control:init(layer,positionY) self.size=cc.Director:getInstance():getWinSize() self.layer=layer self.positionY=positionY --创建一个英雄精灵 local hero=Hero:createHero() print(self.positionY+hero:getContentSize().height / 2) hero:setposition(50,self.positionY+hero:getContentSize().height / 2) self.layer:addChild(hero) --跳跃按钮 local itemControl=cc.MenuItemImage:create(Res.control_n,Res.control_p) itemControl:setScale(0.35) itemControl:setposition( self.size.wIDth-40,30) itemControl:registerScriptTapHandler(function() if hero:getpositionY() < hero:getContentSize().height + self.positionY then hero:getPhysicsBody():setVeLocity(cc.p(0,500)) end end) local menu=cc.Menu:create(itemControl) menu:setposition(0,0) self.layer:addChild(menu) --速度变化特效 self.effectLabel=cc.Label:createWithTTF("","Fonts/Marker Felt.ttf",32) self.effectLabel:setcolor(cc.c3b(0,0)) self.effectLabel:enableGlow(cc.c4b(0,0)) self.effectLabel:setposition(self.size.wIDth-50,self.positionY+self.size.height/2-self.effectLabel:getContentSize().height/2) self.layer:addChild(self.effectLabel)-- self.effectLabel:setVisible(false) --初始化计数参数 self:reset() end --- --@param touch cc.touch --@param event cc.Event-- function Control:r(touch,event)-- -- end function Control:reset() self.createBlockHero=0 self.nextBlockHero=math.random(0,99)+120 end--创建障碍物精灵 score分数function Control:updateBlock(score) --createBlockHero计数增加 self.createBlockHero=self.createBlockHero+1 -- 随机时间生成障碍物 if self.createBlockHero >= self.nextBlockHero then --控制障碍物移动的速度 --- --@param cc.Sprite blockSprite local blockSprite=Block:createBlock(self.blockSpeed) if score >=20 and score < 50 then print("blockSpeed:",self.blockSpeed) if self.blockSpeed < 3 then self:test("+3") self.blockSpeed=3 end elseif score >=50 and score < 80 then if self.blockSpeed < 3 then self:test("+5") self.blockSpeed=5 end elseif score >=80 and score < 100 then if self.blockSpeed < 5 then self:test("+6") self.blockSpeed=6 end elseif score >=100 and score < 150 then if self.blockSpeed < 6 then self:test("+7") self.blockSpeed=7 end elseif score >=150 and score < 180 then if self.blockSpeed < 7 then self:test("+8") self.blockSpeed=8 end elseif score >=180 and score < 250 then if self.blockSpeed < 8 then self:test("+10") self.blockSpeed=10 end elseif score >= 250 and score < 320 then if self.blockSpeed < 10 then self:test("+12") self.blockSpeed=12 end elseif score >= 320 and score < 400 then if self.blockSpeed < 12 then self:test("+15") self.blockSpeed=15 end elseif score >= 400 then if self.blockSpeed < 15 then self:test("+18") self.blockSpeed=18 end end --取整0、2 math.randomseed(os.time()) local index1=math.floor(math.random(0,1)) local positionX1=self.size.wIDth local positionY1=math.random(self.positionY+120+10,self.size.height-35) if index1 >= 1 then for i=0,index1 do local gem=Gem:cretateGem() gem:setposition(positionX1,positionY1) self.layer:addChild(gem) gem:setGemSpeed(1) positionX1=positionX1-25 end end --取整0、2 math.randomseed(os.time()) local index2=math.floor(math.random(0,2)) local positionX2=self.size.wIDth; if index2 >= 1 then for i=0,index2 do local gem=Gem:cretateGem() gem:setposition(positionX2,self.positionY+gem:getContentSize().height / 5) self.layer:addChild(gem) gem:setGemSpeed(self.blockSpeed) positionX2=positionX2+25 end end blockSprite:setposition(positionX2+10,self.positionY+blockSprite:getContentSize().height / 2) self.layer:addChild(blockSprite) --重新计数 self:reset() endendfunction Control:test(effectType) self.effectLabel:setString(effectType) self.effectLabel:setVisible(true) print("effectLabel") self.effectLabel:runAction(cc.Sequence:create(cc.Scaleto:create(1,2),cc.CallFunc:create(function(sender) sender:setVisible(false) end))) endfunction Control:setBlockSpeed(speed) self.blockSpeed=speedendfunction Control:getBlockSpeed() return self.blockSpeedendreturn Control
7、编写游戏层GameLayer.lua
GameLayer=class("GameLayer",function () return cc.Layercolor:create(cc.c4b(255,255)) end)function GameLayer:ctor()--控制类self.control=nil self.score=0self.gem=0 endfunction GameLayer:createLayer() local layer=GameLayer.new() layer:bg() return layerend--游戏背景图function GameLayer:bg() local size=cc.Director:getInstance():getWinSize() --创建一个围绕屏幕四周的物理边界 local node=cc.Node:create() node:setPhysicsBody(cc.PhysicsBody:createEdgeBox(cc.size(size.wIDth,size.height),cc.PHYSICSBODY_MATERIAL_DEFAulT,5)) node:setposition(size.wIDth/2,size.height/2+50) self:addChild(node) -- 地面(一条线) local edgeSprite=cc.Sprite:create() edgeSprite:setTextureRect(cc.rect(0,size.wIDth,2)) edgeSprite:setcolor(cc.c3b(125,125,0)) edgeSprite:setposition(size.wIDth/2,50) self:addChild(edgeSprite) --分数 local labelscore=cc.Label:createWithTTF("",20) labelscore:setcolor(cc.c3b(0,0)) labelscore:setString(self.score) labelscore:setposition(size.wIDth-80,size.height-35) self:addChild(labelscore) --宝石个数 local labelGem=cc.Label:createWithTTF("",28) labelGem:setcolor(cc.c3b(0,0)) labelGem:setString(self.gem) labelGem:setposition(size.wIDth-180,size.height-35) self:addChild(labelGem) --宝石 local cache=cc.SpriteFrameCache:getInstance() cache:addSpriteFrames(Res.gemPList,Res.gemPng) self.control=Control:create(self,50) local spGem=cc.Sprite:createWithSpriteFramename("green.png") spGem:setposition(size.wIDth-220,size.height-35) spGem:setScale(0.5) self:addChild(spGem) self:scheduleUpdateWithPriorityLua(function(dt) --分数 self.score = self.score + dt labelscore:setString(string.format("%#.2f",self.score)) self.control:updateBlock(self.score) end,0) --一个body的categoryBitmask和另一个body的ContactTestBitmask的逻辑与的结果不等于0时,接触事件将被发出,否则不发送。 --一个body的categoryBitmask和另一个body的CollisionBitmask的逻辑与结果不等于0时,他们将碰撞,否则不碰撞 --需要两个body相互位与运算的值都是大于0时才会发生碰撞检测和发送接触事件通知 -- 碰撞监听 local conListener=cc.EventListenerPhysicsContact:create(); conListener:registerScriptHandler(function(contact) print("---contact-碰撞了--") -- 处理游戏中精灵碰撞逻辑 local node1=contact:getShapeA():getbody():getNode() local name1=node1:getname() local tag1=node1:getTag() print("name1:",name1) local node2=contact:getShapeB():getbody():getNode() local name2=node2:getname() local tag2=node2:getTag() print("name2:",name2) --英雄碰到宝石 if name1 == "gem" then local x,y=node1:getposition() self.gem=self.gem+1 labelGem:setString(string.format("%s",self.gem)) labelGem:runAction(cc.Sequence:create(cc.Scaleto:create(0.2,1.5),cc.CallFunc:create( function (sender) sender:runAction(cc.Scaleto:create(0.1,1)) end))) if nil ~= node1 then self:removeChild(node1,true) end -- node1:runAction(cc.Sequence:create(cc.Spawn:create(cc.Moveto:create(0.1,cc.p(node1:getpositionX(),node1:getpositionY()+50)),cc.Scaleto:create(0.1,0.5),cc.FadeOut:create(0.1)),-- cc.CallFunc:create(function(sender)-- self:removeChild(sender,true)-- end))) --英雄碰到障碍物死亡 elseif name1 == "hero" then local x,y=node2:getposition() cc.Director:getInstance():replaceScene(StartGame:createScene()) elseif name2 == "hero" then local x,y=node2:getposition() cc.Director:getInstance():replaceScene(StartGame:createScene()) end return true end,cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN) cc.Director:getInstance():getEventdispatcher():addEventListenerWithSceneGraPHPriority(conListener,self) endreturn GameLayer
8、编写游戏场景GameScene.lua
--游戏场景GameScene=class("GameScene",function () return cc.Scene:createWithPhysics() end)function GameScene:createScene() local scene=GameScene.new() -- 设置调试-- scene:getPhysicsWorld():setDeBUGDrawMask(cc.PhysicsWorld.DEBUGDRAW_ALL) scene:getPhysicsWorld():setGravity(cc.p(0,-1000)) local layer=GameLayer:createLayer() scene:addChild(layer) return sceneendreturn GameScene
9、这里我用类把图片和加载的lua文件封装了
Require.lua 游戏加载的lua文件
--引入lua类require("Cocos2d")require("Cocos2dConstants")require("bitExtend")require("src/game/res/Res")require("src/game/start/StartGame")require("src/game/scene/GameScene")require("src/game/scene/GameLayer")require("src/game/sprite/Block")require("src/game/sprite/Hero")require("src/game/sprite/Control")require("src/game/sprite/Gem")
Res.lua 游戏用到的图片资源
--图片资源类Res={}--开始按钮Res.start_n="qq_n.png"Res.start_p="qq_p.png"Res.heroPng="hero.png"Res.heroPList="hero.pList"Res.control_n="control_n.png"Res.control_p="control_p.png"Res.gemPList="gem.pList"Res.gemPng="gem.png"
10、修改main.lua
--引入lua文件require "src/game/res/Require"-- ccloglocal cclog = function(...) print(string.format(...))end-- for ccluaEngine tracebackfunction __G__TRACKBACK__(msg) cclog("----------------------------------------") cclog("LUA ERROR: " .. tostring(msg) .. "\n") cclog(deBUG.traceback()) cclog("----------------------------------------") return msgendlocal function main() collectgarbage("collect") -- avoID memory leak collectgarbage("setpause",100) collectgarbage("setstepmul",5000) cc.fileUtils:getInstance():addSearchPath("src") cc.fileUtils:getInstance():addSearchPath("res") cc.fileUtils:getInstance():addSearchPath("src/game/res") cc.fileUtils:getInstance():addSearchPath("src/game/start") cc.fileUtils:getInstance():addSearchPath("src/game/scene") cc.fileUtils:getInstance():addSearchPath("src/game/sprite") cc.fileUtils:getInstance():addSearchPath("res/game") cc.fileUtils:getInstance():addSearchPath("res/game/hero") cc.fileUtils:getInstance():addSearchPath("res/game/gem") cc.Director:getInstance():getopenGLVIEw():setDesignResolutionSize(480,320,0) cc.Director:getInstance():setdisplayStats(false) --进入游戏场景 local scene = require("StartGame") local gameScene =scene:createScene() if cc.Director:getInstance():getRunningScene() then cc.Director:getInstance():replaceScene(gameScene) else cc.Director:getInstance():runWithScene(gameScene) endendlocal status,msg = xpcall(main,__G__TRACKBACK__)if not status then error(msg)end
11、这里发布到androID上,IDe提供了一键发布,非常的好用,需要设置下环境
然后选择项目打包
等待几分钟就会看到打包成功了
呵呵,是不是很方便? 小弟也是新手,很多地方写的可能不好,我也是刚学lua不久,学习学习了
黑人小心了 源码
总结以上是内存溢出为你收集整理的cocos2d-x lua 黑人小心了 项目实践全部内容,希望文章能够帮你解决cocos2d-x lua 黑人小心了 项目实践所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)