Cocos2d-x 引擎概要

游戏开发技术

  • 游戏原理与机制
  • 游戏开发技术
  • 认识Cocos2D-X

游戏原理与机制

  • 渲染驱动
  • 事件驱动

渲染驱动游戏

例如:愤怒的小鸟
游戏的实现原理:在不同时间片段中绘制不同画面

愤怒的小鸟

代码片段

// 绘制画面
drawMenu(); // 绘制游戏主菜单画面
drawGame(); // 绘制游戏中画面
drawOver(); // 绘制游戏结束画面

// 不同状态渲染不同画面
draw(){
  while(isExit){
    if(isState==MENU){
      drawMenu();  
    }else if(isState==GAME){
      drawGame();
    }else if(isState==OVER){
      drawOver();
    }
  }
}

// 游戏事件处理函数
event(){
  isState==MENU;
}

游戏归根到底是绘制渲染

渲染驱动游戏重要指标,帧率(FPS, Frame Per Second)。

  • 每秒刷新(绘制/渲染)次数
  • 延时机制

事件驱动游戏

例如:象棋游戏或者是棋牌类游戏

drawMenu();
drawGame();
drawOver();

// 事件处理函数
event(){
  if(isState==MENU){
    drawMenu();
  }else if(isState==GAME){
    drawGame();
  }else if(isState==OVER){
    drawOver();
  }
}

游戏开发技术

  • 各平台游戏开发技术
  • 跨平台游戏开发方案

游戏开发技术平台差异

  • Win32游戏开发技术:例如CS,常见图形渲染方式
    • Software 软件加速
    • DirectX(DX、D3D),硬件加速,微软产品
    • OpenGL,硬件加速,开源产品
  • Android游戏开发技术:例如贪吃蛇,常见图形渲染方式
    • Skia/Canvas
    • OpenGL ES,适用于嵌入式设备,对OpenGL进行了简化。
    • NDK,Android中使用C或C++开发模块,即在Java中调用C/C++接口。
  • MAC/iOS游戏开发技术:例如国际象棋,常见图形渲染方式
    • Quartz2D
    • OpenGL ES
  • Linux游戏开发技术
    • OpenGL
  • WP7游戏开发技术: Window Phone是微软Windows Mobile过渡而来
    • DirectX
  • Win8/WP8游戏开发
    • DirectX

跨平台游戏开发技术方案

  • HTML5: Canvas/WebGL
  • Unity3D: OpenGL,商业游戏引擎,不能跨Microsoft平台。
  • Cocos2d-x: OpenGL ES/DirectX/Canvas

认识Cocos2D-X引擎

  • Cocos2D-X跨平台解决方案
  • Cocos2D-X版本选择
  • Cocos2D-X功能模块
  • Cocos2D-X数据结构

Cocos2D-X跨平台解决方案

  • app:Android、iOS、Win8
  • view、event:OpenGL 渲染视图
  • screen、layer、touch/key: Cocos2d-x 场景、图层、触屏/按键

Cocos2D-X 版本选择

  • Cocos2d python
  • Cocos2d iphone
  • SherryCocos、CocosNet、cocos2d-android、cocosCore、cocos2d-x(cocos2d-lua、cocos2d-html5)、cocos2d-javascript

根据图形标准划分

  • OpenGL ES 1.x
  • OpenGL ES 2.x
  • DirectX 11.1
  • DirectX 10

Cocos2D-X功能模块

  • Cocos2D-X主体: OpenGL ES、DirectX、Canvas、pthread(多线程)
  • 开源二维物理引擎:Box2D、Chipmunk
  • 网络通信(非实时libcurl、实时BSD Socket)、声音引擎(SimpleAudioEngine)

Cocos2D-X数据结构

  • CCCopying 复制对象类(接口)
  • CCObject 对象类
  • CCZone 空间类
  • CCData 数据类
  • CCGeometry 几何类
  • CCSet 集合类
  • CCArray 数组类
  • CCString 字符串类
  • ccTypes.h 类型
  • STL
    • vector
    • list
    • stack
    • queue
    • map
cocos2d-x 数据结构

Cocos2D-X 跨平台环境搭建

Cocos2D-X 跨平台环境搭建

软件需求

  • Win /Linux/MAC
  • JDK
  • Eclipse
  • ADT
  • CDT
  • Android SDK
  • Andriod NDK
$ python -V
Python 2.7.13

Win10安装VS2015

image.png
image.png

win32环境搭建

实例软件:Cocos2d-x 3.10 Lua

-- 下载安装并更新
$ git clone https://github.com/cocos2d/cocos2d-x.git
$ cd cocos2d-x && python download-deps.py
$ git submodule update --init
git克隆
-- 创建项目
$ ./setup.py
$ source FILE_TO_SAVE_SYSTEM_VARIABLE
$ cocos new ProjectName -p com.company.game -l lua -d NEW_PROJECTS_DIR
$ cd NEW_PROJECTS_DIR/ProjectName

快速入门

  • 游戏生命周期
  • 编译运行调试

应用程序生命周期

一个游戏对应一个Application对象,Application职责是管理游戏生命周期并设置默认游戏窗口,获取平台及本地化信息。Cocos2D-X通常不直接创建Application对象,Cocos2d-x脚本创建应用程序时会实现一个Application的子类供程序员自行定义生命周期的各个阶段的处理,这个子类即AppDelegate

#ifndef  _APP_DELEGATE_H_
#define  _APP_DELEGATE_H_

#include "cocos2d.h"

/**AppDelegate是一个应用程序委托对象,作用是程序启动时调用它。*/
class  AppDelegate : private cocos2d::Application
{
public:
    AppDelegate();
    virtual ~AppDelegate();

    virtual void initGLContextAttrs();
    /**
    游戏启动后触发,一般进行游戏初始化。
    */
    virtual bool applicationDidFinishLaunching();
    /**
    游戏退出到后台
    */
    virtual void applicationDidEnterBackground();
    /**
    游戏从后台进入前台
    */
    virtual void applicationWillEnterForeground();
};

#endif

引擎框架

设计思想

设计思想

导演

  • shared CCDirector
  • runWithScene
  • replaceScene
  • pushScene
  • popScene
  • pause
  • resume

场景

场景

图层

Layer图层是处理玩家事件响应的Node子类,包含的是直接在屏幕上呈现的内容, 它实现了触屏事件代理协议(TouchEventsDelegate)。

Layer图层的作用

  • 接收用户的输入事件,包括触摸、加速度传感器、键盘输入等。
  • 显示精灵、文本等游戏元素,并设置游戏元素的属性。

Layer类主要函数

  • init() 初始化图层
  • onEnter() 进入布景层时被调用
  • onExit() 离开布景层被调用
  • onEnterTransitionDidFinish() 过程动画结束时调用

节点

节点树

每个节点中都有一个摄像机

摄像机

显示对象

显示对象
-- 预加载图片
local img = cc.Director:getInstance():getTextureCache():addImage("logo.jpg")
-- 获取文件尺寸
local size = img:getContentSize()
print(size.width, size.height)

-- 创建精灵并添加至当前场景中
display.newSprite(img):addTo(self):move(display.center)

-- 创建图层
local layer = display.newLayer():addTo(self):move(100, 100)
local image = display.newSprite("head/head_1.png"):addTo(layer)
image:setAnchorPoint(cc.p(0, 0))

示例:显示隐藏节点

-- MainScene.lua
local MainScene = class("MainScene", cc.load("mvc").ViewBase)

function MainScene:onCreate()
    --  场景中添加背景图
    local bg = display.newSprite("bg.jpg"):move(display.center):addTo(self)

    -- 3秒后场景切换
    self:getScheduler():scheduleScriptFunc(function()
        local newScene = require("app.views.GameScene"):new()
        cc.Director:getInstance():replaceScene(newScene)
    end, 3, false)

end

return MainScene
-- GameScene.lua
local GameScene = class("GameScene", function()
    return display.newScene("GameScene")
end)

function GameScene:ctor()
    local logoNode = require("app.views.LogoNode"):new():addTo(self):move(display.center)
end

return GameScene
-- LogoNode.lua
local LogoNode = class("LogoNode", cc.load("mvc").ViewBase)

function LogoNode:ctor()
    local logo1 = display.newSprite("logo1.png"):addTo(self)
    local logo2 = display.newSprite("logo2.png"):addTo(self)
    logo2:setVisible(false)
    
    -- invalid 'cobj' in function 'lua_cocos2dx_Node_isVisible'
    -- lua保存的node值相当于一个弱引用
    -- 在创建 Node节点后 调用父节点 retain() 方法 手动增加引用
    logo1:retain()
    logo2:retain()

    -- print(not logo1:isVisible(), not logo2:isVisible())
    self:getScheduler():scheduleScriptFunc(function()   
        -- invalid 'cobj' in function 'lua_cocos2dx_Node_isVisible'
        logo1:setVisible(not logo1:isVisible());
        logo2:setVisible(not logo2:isVisible());
    end, 1, false)
end

return LogoNode

动作

  • Action基本使用
  • Action特效
  • 场景切换特效

Action的基本使用

  • CCMoveTo 移动到
  • CCMoveBy 移动
  • CCJumpTo 跳跃到
  • CCJumpBy 跳跃
  • CCBezierBy 贝塞尔
  • CCScaleTo 放大到
  • CCScaleBy 放大
  • CCRotateTo 旋转到
  • CCRotateBy 旋转
  • CCBlink 闪烁
  • CCTintTo 色调变化到
  • CCFadeTo 变暗到
  • CCFadeIn 由无变亮
  • CCFadeOut 由亮变无
-- MainScene.lua
local MainScene = class("MainScene", cc.load("mvc").ViewBase)

function MainScene:onCreate()

    local img = display.newSprite("role.png"):addTo(self)
    img:move(display.center)
    img:setScale(1)
    img:setPositionX(100)
    -- 2秒,从左到右移动到
    -- img:runAction(cc.MoveTo:create(2, cc.p(display.width-100, display.cy)))

    -- 2秒,从左向右移动300像素
    -- img:runAction(cc.MoveBy:create(2, cc.p(-300, 0)))

    -- 执行顺序序列
    -- local fn1 = cc.MoveTo:create(2, cc.p(display.width-100, display.cy))
    -- local fn2 = cc.MoveBy:create(2, cc.p(-300, 0))
    -- img:runAction(cc.Sequence:create(fn1, fn2))

    -- 来回移动
    -- local fn1 = cc.MoveBy:create(2, cc.p(300, 0))
    -- error in function 'lua_cocos2dx_Action_reverse' argument #1 is '[no object]'; 'cc.Action' expected.
    -- local fn2 = fn1.reverse() --反转
    -- img:runAction(cc.Sequence:create(fn1, fn2))

    -- 并列执行
    -- local fn1 = cc.MoveBy:create(2, cc.p(400, 0))
    -- local fn2 = cc.ScaleTo:create(2, 2)
    -- img:runAction(cc.Spawn:create(fn1, fn2))

    -- 动画播放完的回调
    local fn1 = cc.MoveBy:create(2, cc.p(400, 0))
    local fn2 = cc.ScaleTo:create(2, 2)
    local fn3 = cc.Spawn:create(fn1, fn2)
    img:runAction(cc.Sequence:create(fn3, cc.CallFunc:create(function()
        print("play complete")
    end)))
end

return MainScene

Action特效

  • Shaky3D 抖动效果
  • Waves3D 波浪效果
  • FlipX3D 翻转效果
  • Lens3D 凸镜效果
  • Ripple3D 水波效果
  • Liquid 液体效果
  • Twirl 扭转效果
  • ShatteredTiles3D 破碎效果
  • ShuffleTiles 瓷砖效果
  • FadeOutTRTiles 淡入淡出
  • TurnOffTiles 方块消失
  • SplitRows 分页消失
  • PageTurn3D 翻页效果
素材
-- MainScene.lua
local MainScene = class("MainScene", cc.load("mvc").ViewBase)

function MainScene:onCreate()
    local nodeGrid = cc.NodeGrid:create()
    nodeGrid:addChild(display.newSprite("role.png"))
    nodeGrid:move(display.center)
    nodeGrid:setScale(1, 1)
    nodeGrid:addTo(self)
    -- 震动效果
    -- nodeGrid:runAction(cc.Shaky3D:create(10, cc.size(50, 50), 5, false))

    -- 瓦片式抖动
    -- nodeGrid:runAction(cc.ShakyTiles3D:create(10, cc.size(50, 50), 5, false))

    -- 爆炸碎片效果
    -- nodeGrid:runAction(cc.ShuffleTiles:create(1, cc.size(50, 50), 5))

    -- 碎片消失
    -- nodeGrid:runAction(cc.TurnOffTiles:create(1, cc.size(100, 100)))

    -- 波浪效果
    -- nodeGrid:runAction(cc.Waves3D:create(2, cc.size(15, 10), 5, 40))

    -- 波浪效果后回到初始状态
    local waveRun = cc.Waves3D:create(2, cc.size(15, 10), 5, 40)
    local waveInit = cc.Waves3D:create(2, cc.size(15, 10), 0, 0)
    nodeGrid:runAction(cc.Sequence:create(waveRun, waveInit))

    -- 先抖动后爆炸
--    local shaky = cc.ShakyTiles3D:create(1, cc.size(50, 50), 5, false)
--    local shuffle = cc.ShuffleTiles:create(0.5, cc.size(50, 50), 25)
--    nodeGrid:runAction(cc.Sequence:create(shaky, shuffle))
end

return MainScene

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容