Qiuck_Cocos基础(二)
来源:互联网 发布:找不到网络共享文件夹 编辑:程序博客网 时间:2024/05/28 14:57
前言
上一篇文章我们讲了一点无聊的东西,今天我们来讲easy的东西,关于cocos的常用类,为了配合这一点,我们讲一个实际项目:飞机大战
此项目已经在github上开源https://github.com/YoungForLong/WXDFJ
场景
场景是一个游戏的基本结构,所有的内容都附着于场景
local StartScene=class("StartScene",function() return display.newScene("StartScene") end)function StartScene:ctor() -- init list self.count=1 -- init funcs self:init() self:setStyle()end
创建一个空的层,我们在构造函数ctor里面添加了初始化的函数init(添加缓存)和setStyle(设置UI样式)
function StartScene:init() if self then -- 加入缓存 -- img display.addSpriteFrames("shoot.plist","shoot.png") display.addSpriteFrames("shoot_background.plist","shoot_background.png") -- audio audio.preloadMusic("sound/bgmusic.mp3") audio.preloadMusic("sound/hero_down.mp3") audio.preloadMusic("sound/enermy1_down.wav") audio.preloadMusic("sound/enermy2_down.wav") audio.preloadMusic("sound/enermy3_down.wav") audio.preloadMusic("sound/shoot.wav") -- data if cc.UserDefault:getInstance() then cc.UserDefault:getInstance():setStringForKey("initTag", "initialized") cc.UserDefault:getInstance():flush() print("RunTime : Data Initialized") end endend
我们先判断self是否为空,为空的话那就是之前出问题了。
然后加载所有的缓存工作,包括图片,声音和数据储存
图片缓存是从一个plist表单里面添加一个合成图片,plist是一个json文件,里面主要储存了图片在合成图的位置和图片的名字,使用plist,能大大减少opengl的渲染开销,因为渲染一张大图效率远远大于很多张小图,有兴趣的童鞋可以去看看关于opengl渲染批次,节点的资料
声音的预加载很简单,格式固定
UserDefault是继承于cocos-2dx的类,它是一个xml文件读写的封装,xml节点的名字保存为key,值保存为vlaue,后面我们做数据存储的时候会讲到,这里不细谈
function StartScene:setStyle() -- bg local bgSp=cc.DrawNode:create() -- 画一个四边形,display.cx是屏幕的半宽,display里面有很多常值用来调用 bgSp:drawPolygon({cc.p(0,0), cc.p(2*display.cx,0), cc.p(2*display.cx,2*display.cy), cc.p(0,2*display.cy)}) --把这个四方形添加到这个场景上,默认的z坐标为0 self:addChild(bgSp) -- btn local startBtn=cc.Sprite:createWithSpriteFrameName("game_resume_nor.png") startBtn:setPosition(display.cx,display.cy)-- 设置坐标,该坐标基于他的父节点,是一个相对坐标 startBtn:setScale(2) -- 设置缩放倍数,默认为1 self:addChild(startBtn,10) startBtn:setTouchEnabled(true) -- 添加触摸属性 startBtn:setTouchMode(cc.TOUCH_MODE_ONE_BY_ONE) -- 设置触摸方式,单点还是多点 startBtn:addNodeEventListener(cc.NODE_TOUCH_EVENT,function(event) -- 添加执行函数 if event.name=="began" then -- 切换图片,表示手指按下去了 startBtn:setSpriteFrame("game_resume_pressed.png") return true elseif event.name=="ended" then startBtn:setSpriteFrame("game_resume_nor.png") -- 场景转换 display.replaceScene(require("app.scenes.MainScene").new()) end end)end
此处我们的背景图片使用了绘图方法,用drawPolygon方法可以画一个多边形,参数是一个table,里面存的是一系列点,绘图方法会根据点的顺序来绘图。
关于addChild,cocos引擎使用了Node,一种链式结构,addChild会向当前Node添加子链,然后在游戏主循环和更新(如果你不了解主循环的概念,可以参考我之前写的文章http://blog.csdn.net/qq_22984991/article/details/51069571)中,会遍历最高的场景Node的所有子链的draw函数,draw函数里面有render方法,会执行opengl的渲染,这样,就把整条场景链渲染出来了。
触摸
我们来注重讲一下设置触摸的方法,我们利用setTouchEnable方法为Node节点添加触摸属性后,游戏的更新逻辑中会把该节点的碰撞检测放入更新检查列表中。具体的说,就是添加了触摸点(这是由硬件系统来提供的)是否在Node的包装方格中的判断
图片的包装方格为图片的大小和位置组成的矩形,可以用getBoundingBox来获取
发生触摸的执行函数我们大概讲一下,我们先死记硬背它的实现方法,格式固定如下:
startBtn:addNodeEventListener(cc.NODE_TOUCH_EVENT,function(event) -- 添加执行函数 if event.name=="began" then -- 手指按下时触发的函数 return true-- 必须要这句 elseif event.name=="ended" then -- 手指离开时执行的函数 end end)
至于这个函数为什么叫addNodeEventListener,这涉及到事件分发机制,我们后面遇到了再详细地讲
实现效果
关于代码风格
如果你是成熟的开发者,可以忽略我下面说的话。
有的人可能说,你实现这么一个简单的场景,就写了这么多代码。
我希望大家在写代码的时候能将逻辑封装好,因为游戏的复杂性,逻辑有区别时,尽量封装成不同的函数,这样才能应付更复杂的项目(我实在不喜欢菜鸟们不写类,不写函数,面向过程的思维逻辑)
其他的类
其他的类我们这里没遇到,暂时不表(太多了根本说不完),有兴趣的可以去查看API文档,cocos关于UI的层面还是很成熟的,基本的效果都能实现。
- Qiuck_Cocos基础(二)
- Qiuck_Cocos基础(一)
- Qiuck_Cocos实战(一)
- Servlet基础(二)
- 半导体基础(二)
- Ajax基础(二)
- CodeSmith基础(二)
- 基础练习题(二)
- 游戏基础(二)
- CodeSmith基础(二)
- CodeSmith基础(二)
- CodeSmith基础(二)
- C++基础(二)
- JDBC基础(二)
- C++基础(二)
- jquery基础(二)
- JDBC基础(二)
- 基础加强(二)
- 2016夏季练习——数论
- Procmon.exe —— 强大的系统监视工具
- 9个令人震惊的WebGL示例
- 怎样读"好"书和读"好"书
- 2016.7.12 做题汇总! 打卡!
- Qiuck_Cocos基础(二)
- Three.js学习笔记 – “我和小伙伴都惊呆了”的特效和Three.js初探
- 第一次申请去美国面签,需要注意哪些事项提高成功率?
- PCHunter —— 很强大的系统信息查看工具
- [error] Can't load IA 32-bit .dll on a AMD 64-bit plat
- 01背包详解
- 如何把穿丝袜的女人拍的很好看?
- 白色丝袜女生怎么搭配好看,以及,有哪些漂亮/有趣的白色丝袜?
- 简论select()的接口设计与内核实现的得失(3)——The C10M Problem