QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码
查看: 7471|回复: 316

[软件编程] 薛老师cocos2d游戏开发34天视频教程

[复制链接]

191

主题

0

好友

213

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
213
QQ
发表于 2016-6-15 11:21:05 | 显示全部楼层 |阅读模式
cocos2d-x课程大纲(基础部分)I. 第一章 基础1.1 前言
大概了解下cocos先
+ ^2 |$ x7 m- |% ?
1.1.1 cocos2d-x介绍
  • cocos2d-x是一个手机游戏开发引擎,使用C++开发,可以很方便的移植到各个平台,目前cocos2d-x支持AndroidIOS,windows,mac,linux等系统。) G* }0 n# G7 L0 w
    早先由阿根廷人开发Python版本,后来苹果手机流行之后,阿根廷人又用OC改写了cocos2d,并称之为cocos2d-iphone。/ e8 e: E/ C8 H; \1 L; N' w% S
    后来由国人将cocos2d-iphone用C++改写,并称之为cocos2d-x,这样使用cocos2d-x开发的游戏很容易被移植到各个平台。
    2 I) J1 j1 g: i' y9 @

& d* C' P1 O. a7 m
  • cocos2d-x框架图
    / I8 S8 Q7 x! f) B3 S
! g& j% \2 d/ S6 w9 _
1.1.2 基础阶段学习目标和作品演示
  • 了解cocos2dx
  • 实现飞机大战
    + S4 y7 L" ]4 h5 D
1.1.3 环境搭建
  • 安装python2.7和配置python路径
  • 安装vs2013
  • 解压cocos2dx到某目录,比如d:\cocos\cocos2d-x
  • 命令行进入cocos2d-x目录,执行setup.py
    1 M2 y, [5 ^7 c, m
1.1.4 介绍cocos2dx开发包目录
  • build 工程目录
  • cmake makefile目录
  • cocos cocos2dx核心源代码目录
  • docs 文档目录
  • extensions 拓展代码目录,主要是GUI部分
  • external 外部开源库
  • licenses 外部开源库licenses
  • plugin 插件
  • templates 创建工程模板,创建工程使用的模板工程
  • tests 测试项目cpp-test代码在这里
  • tools 工具,创建工程的脚本就在这里% i" d# f: k; ^  H/ Z
1.2 第一个工程
万丈高楼平地起
& L+ \6 r% g5 a- |
1.2.1 创建工程
  • cocos new ProjectName -l cpp
    5 {8 j9 J$ e% n: M, C) J在当前目录下创建一个工程名字为ProjectName
  • cocos new ProjectName -l cpp -d d:\cocos" w8 S5 R: j7 e: H! x5 d/ f
    在d:\cocos目录下创建一个名字为ProjectName的工程
  • cocos new ProjectName -l cpp -d d:\cocos -p com.Orgnization.ProjectName* Y" l( g8 y! Q7 ~
    在d:\cocos目录下创建一个工程名为ProjectName,包名为com.Orgnization.ProjectName的工程
  • cocos new
    " n4 z. P: W" x2 M  J8 F2 I, Q0 L查看cocos new命令的帮助
  • 使用vs2013打开工程目录中的解决方案文件,对第一个工程进行编译和运行2 w1 V2 S$ S, w/ A3 Y* V
1.2.2 介绍工程目录
  • Classes 跨平台游戏逻辑代码
  • cocos2d cocos引擎代码
  • proj.xxxx 平台相关的代码和工程文件
  • Resources 资源文件(图片、声音、脚本)
    4 n) X# Y# T+ H" M+ q5 b. H
1.2.3 介绍详细代码
  • 程序入口和AppDelegate: h1 K, S$ R1 z+ j' u5 ?
    main函数通过虚函数调用到AppDelegate::applicationDidFinishLaunching
  • AppDelegate::applicationDidFinishLaunching()8 p7 Q# |8 Z9 z
    这个是真正的入口函数,负责游戏的初始化,包括创建第一个场景
  • HelloWorld::init()8 \% F$ ]' S# ?/ j8 I( q! i$ m
    场景层的初始化,负责显示场景的信息
  • HelloWorld::menuCloseCallback(Ref*)) ^2 d/ o4 o& U# C1 s7 E9 m
    退出菜单的回调函数,负责程序退出
  • 头文件和命名空间+ L1 H8 w8 K- G+ C
    cocos引擎定义cocos2d.h头文件中,并且使用了命名空间cocos2d,因此我们写的程序都应该包含cocos2d头文件,并且需要使用cocos2d命名空间,! M7 \/ p! Q( V3 u( u
#include "cocos2d.h"USING_NS_CC;// #define USING_NS_CC using namespace cocos2d
e USING_NS_CC using namespace cocos2d
  • 初始化的调用过程  [. @* g; E' N+ }* Q% V+ i
1.2.4 cocos设计理念
cocos2dx的设计者将游戏划分为一个个片段组成:每个片段由Scene负责组织;片段内部的模块划分由Layer负责组织;Scene和Layer虽然是游戏组织的一部分,但是它们一般并不可见、可见的部分如英雄、怪物、道具由精灵负责抽象。
+ a0 f! R8 U% F4 }0 [9 ~# {Director负责推动游戏进程的发展,切换场景是由导演来负责的8 t% G' R- {, M

; W1 U5 V+ @* ?% A5 u: L" B1.3 精灵
Sprite,游戏的灵魂
. Y7 m2 U2 D$ U. E' d* t
1.3.1 精灵的创建
精灵可以通过图片、纹理或者精灵帧作为参数来创建. h" L9 C) y! s8 |
  • Sprite::create()
  • Sprite::createWithTexture()
  • Sprite::createWithSpriteFrame(): p0 u0 c" R9 _, I4 x. o9 ]
cocos2dx使用create函数来创建对象,create函数调用了new,init,autorelease等方法,对对象管理; B- o  C5 o, W9 h
1.3.2 精灵的属性
  • 位置 Sprite::setPosition()
  • 锚点 Sprite::setAnchorPoint()
  • 旋转 Sprite::setRotation()
  • 缩放 Sprite::setScale()
  • 颜色 Sprite::setColor()
  • 可见 Sprite::setVisible()
  • 透明度 Sprite::setOpacity()
  • X翻转Sprite::setFlippedX()
  • Y翻转 Sprite::setFlippedY()
  • X扭曲 Sprite::setRotationSkewX()
  • Y扭曲 Sprite::setRotationSkewY()
  • 名字 Sprite::setName()
  • 标签 Sprite::setTag()
  • 精灵帧 Sprite::setSpriteFrame()
  • 纹理 Sprite::setTexture()
  • 纹理矩形 Sprite::setTextureRect()
  • 用户数据 Sprite::setUserData()
  • 用户对象 Sprite::setUserObject()
  • 获取包含精灵的矩形 Sprite::getBoundingBox()
  • ZOrder setLocalZOrder, setGlobalZOrder
    * F9 ], j2 T. z) a; l" ^
1.3.3 自定义精灵类(派生)
为什么要派生精灵的子类?因为不同的精灵有不同的额外的属性和动作,从面向对象角度来说,额外的属性需要通过派生子类来加入。派生子类需要注意,在子类的init函数中,调用父类的init函数,Sprite提供了一些列init函数,供我们在子类中调用,我们可以选择一个合适的init函数使用。
5 W" P% [4 e! }; E6 j
  • 初始化空精灵 Sprite::init()
  • 通过文件初始化精灵 Sprite::initWithFile()
  • 通过纹理初始化精灵 Sprite::initWithTexture()
  • 通过精灵帧初始化精灵 Sprite::initWithSpriteFrame()
    3 D2 P7 L5 F, P
1.3.4 纹理和精灵帧
  • 纹理4 b; T- D$ D6 `9 Y
    对应的类叫做Texture2D,在2D的概念中,纹理其实就是指图片了。图片在加载到内存之后,做进一步的处理,将数据格式转换成适合opengl渲染的格式,这个格式的数据我们称之为纹理。
    / F: G: H: B1 ~1 p, z1 @! u
    • 加载纹理方法:Director::getInstance()->getTextureCache()->loadImage("test.png");, H4 O9 w# _2 i7 f
  • 精灵帧
    * ?0 L, t  b/ E, E9 g对应的类叫做SpriteFrame,有时候一张大的纹理包括很多小图,我们只需要纹理的一部分来创建精灵,我们可以理解精灵帧是纹理的一部分。  h) N; Q4 t4 a6 @
    • SpriteFrame* frame = SpriteFrame::create(filename, rect);
    • SPriteFrame* frame = SpriteFrame::createWithTexture(texture, rect);
    • SpriteFrameCache::getInstance()->addSpriteFramesWithFile(plistFile)* Z, m6 ]" c$ }+ ^$ x+ \
      通过plist文件加载一些列精灵帧,这个将来在缓存时细说
      $ _% a# |  H' ]
1.4 坐标体系和锚点
要做到胸有成竹,必须要清楚坐标体系
) b7 M$ L6 W6 q! E
1.4.1 坐标体系概念
  • cocos2dx坐标体系
    7 k. h: o( i2 ]  m3 @2 }1 x

2 v: E- _; p/ Y8 E/ @1 g游戏中使用的是cocos2dx坐标体系,也叫GL坐标体系
1.4.2 精灵的锚点
  • setAnchorPoint
  • 调用精灵的setPosition时的对齐点
  • 锚点范围为(0, 0) ~ (1, 1)
  • 使用相对坐标,非绝对坐标
  • 是setRotation的中心点
    5 V  ^) a) X" F* ^, z7 m+ M
1.5 单点触摸处理
触摸处理是游戏控制的基础
+ U: q# ?* R& O* z: a) C4 y+ ?
1.5.1 设置触摸监听
  • 创建EventListenerTouchOneByOne对象
  • 设置回调函数
    - n5 u  b6 \2 I+ Q
    • onTouchBegan% r, u9 r8 h( N! T! L+ O5 W
      返回值true表示该监听器接受并处理这次触摸,并且后续函数会得到调用,否则返回false
    • onTouchMoved- y0 K/ N" a0 P; B+ I
      触摸移动时被调用
    • onTouchEnded
      + z# V& ~3 ~. I3 q触摸结束时(松手时)被调用
    • onTouchCancelled2 O8 P) d7 k! k( M
      取消触摸(比如来电导致游戏切入后台)时被调用* g' P5 g4 O' Q
  • 将监听对象加入到事件分发器
    - m  g: T% K- e: v3 l- E
    • _eventDispatcher
    • addEventListenerWithSceneGraphPriority
    • addEventListenerWithFixedPriority$ K  ~7 l2 D  p# a: Y6 u
  • 将监听对象删除! e2 D! [) o( |# o. B
    • removeEventListener
    • removeAllEventListeners
      " i( L' r' G+ ^3 @$ r
1.5.2 Touch对象
每个触摸函数都有两个参数,Touch和Event,其中Event可以忽略,Touch对象中带着一些触摸信息需要我们了解
  • Touch::getLocation& j$ D) M& M- b4 D
    返回触摸当前坐标,该坐标是世界体系的坐标,不论监听的对象是精灵还是层,返回坐标都是世界坐标,该函数可以在began、moved、ended、cancelled函数中调用获取当前触摸的位置
  • Touch::getDelta  M& ~( w9 q7 V" Q/ s) _9 O
    返回触摸偏移量,该函数一般在moved中调用才有意义
  • Touch::getStartLocation
    : D4 ^" W4 ]- ^% w% H# X返回触摸开始时位置,该函数在began时和getLocation一样,在moved和ended时,可以调用该函数返回当初触摸开始时位置3 `' l6 Q, c  a0 c7 \9 ?
1.5.3 lambada表达式和应用
  • Lambada表达式0 Q" P2 o2 \$ u0 J. T
    • 基本语法:: [: A3 K/ a9 A
      • [capture list](parameter list)->return type{function body}
      • [capture list]和{function body}是必须的,其他是可选的- B, C: p9 l( K  \* i$ o: d
    • 捕获列表 capture list5 |1 ~2 W6 k1 e  P
      • [] 不捕获
      • [=] 捕获外部所有常量,以传值方式
      • [&] 捕获外部所有变量,以引用方式
      • [&a, b] 以引用方式捕获a,以传值方式捕获b
      • [&a, =] 以引用方式捕获a,其他变量传值捕获
      • 捕获列表一般使用[&],即可
      • 捕获列表可以捕获的参数范围为lambada表达式可见的变量,包括之前定义的局部变量,this指针,全局变量,但是捕获局部变量是一个危险的行为,因为lambada表达式被调用时,局部变量可能已经不存在了.
        - A2 B" N; V) I$ z1 ?) y) N3 x& A! p2 J
    • 参数列表 parameter list
      + s$ A2 g+ i2 \. d% Q0 R
      • 与普通参数列表相同
        " G5 o( M7 {( P0 z* D
    • 返回类型 return type: x: w' x- h3 O2 w, o! T
      • 一般省略,lambada表达式的返回值代表了返回类型, C& [; p$ W& U  P
    • 代码块 function body
      5 y$ U$ O  |6 t1 q% Y
      • 与普通函数代码块相同
        : V0 N9 H$ t. |3 {; {8 q
Lambada表达式是一个匿名函数,由捕获列表,参数列表和代码块组成。捕获列表的存在使得我们可以在定义函数时,给函数传递参数,使得函数定义和调用更加灵活。$ r  I' x/ }, L
  • 使用lambada表达式作为触摸处理的回调函数# A# N5 m  n( \7 K7 j/ W, b2 C' p* U
EventListenerTouchOneByOne* ev = EventListenerTouchOneByOne::create();ev->onTouchBegan = [](Touch* touch, Event* ev){return true; };ev->onTouchMoved = [&](Touch* touch, Event* ev){    streak->setPosition(touch->getLocation());    sprite->setPosition(touch->getLocation());};_eventDispatcher->addEventListenerWithSceneGraphPriority(ev, this);1.5.4 练习:使用触摸移动精灵
  • 创建精灵
  • 设置触摸
  • 在moved函数中,使用setPosition移动精灵# ]; ~4 L, X; W! u  t" @$ v
1.6 定时器
定时器是自动控制(AI)的基础
1 i. h9 Q* X" g) k7 k
1.6.1 帧定时器
  • Node::scheduleUpdate
    / L. l- @. G: o2 D0 r9 i
1.6.2 自定义定时器
  • Node::schedule
    # |. b0 ^& _  A# m# N+ h
1.6.3 定时器回调函数的参数
  • void Node::update(float dt)$ w9 u1 u+ a: q8 c1 b5 Y
    参数dt表示超时时间间隔,以秒为单位,一般这个值是有误差的,而且一般大于设定的值,比如设置超时时间为1秒,那么dt可能是1.000111秒; t$ X+ {% V0 W& z/ E2 D- e
1.6.4 取消和干预定时器
  • 节点释放时,它自动会取消该节点拥有的定时器。
  • 节点未释放时,可以调用Node::unschedule取消某个定时器
  • 通过重新调用schedule可以改变定时器时间间隔
    0 `9 P) y7 m) x" z" u# V
1.6.5 练习:通过定时器实现动画
  • 创建精灵
  • 启动定时器
  • 在定时器里切换精灵的精灵帧5 E7 s0 R* W2 i& C2 b: G8 x
    • setSpriteFrame1 e% T5 G6 v/ k7 d6 ]
1.6.6 练习:通过定时器实现精灵运动
  • 创建精灵
  • 启动定时器
  • 在定时器里设置精灵的位置
    # G, h/ @3 \0 ?. d
1.7 内存管理
cocos使用了引用计数器自动管理内存,不理解它,等着程序跑飞吧
1 U( D/ {; w, Z) }
1.7.1 Ref类
Ref类几乎是所有cocos类的父类,在2.2.3版本里,这个类叫做CCObject,该类有一个主要的功能,就是实现了对象的引用计数器
1.7.2 管理引用计数器
  • 构造函数:构造函数将引用计数器初始化为1
  • retain:将计数器加1
  • release:将计数器减1,如果减去1之后等于0,则执行delete this,自己删除自己
    " d8 d- y' ~; }! \0 x
1.7.3 静态的create方法
  • cocos采用静态的create函数来创建对象,在静态的create函数里,除了创建对象之外,还调用该对象的init函数来对对象进行初始化,最后调用了autorelease将该对象加入内存管理池,纳入自动管理。
  • cocos的这种创建对象的方法,参考了ObjectC,从C++设计角度来说,这样创建对象也是合理的,构造函数负责数值初始化,而init负责逻辑初始化。$ c5 e! T; O+ R, G# a
1.7.4 内存管理池
  • 当对象调用autorelease时,它将自己加入内存管理池,该内存管理池会在一次帧循环结束时,调用池子里所有对象的release,这样如果对象在这个帧循环内,没有被其他对象引用的话,该对象会被自动销毁。
  • 如果该对象被别的对象引用了,那么别的对象要不再引用该对象时,要调用该对象的release函数。; Y# n3 [7 X7 p+ A: t
大部分时候,我们只需要create对象,然后将它加入到父节点即可,Ref的release、retain、autorelease函数,其实是内部调用的。但是理解机制很重要,某些场合下,需要我们自己去release对象
1.8 数组容器Vector
敌人很多,得拿个东西装起来" F! \& O: p7 r* a1 D3 [: q- Y
1.8.1 Vector
  • Vector是cocos里定义的容器类,它只能将Ref或者Ref的子类对象加入到该数组中。
  • 当一个Ref对象被加入到该数组时,Ref对象的引用计数器会自动增加1
  • 当Ref对象从数组中移除时,Ref对象的引用计数器会自动减少1
  • 数组访问# Y( j( J8 o( B! i' ?* M+ r5 U1 r
    • 增加对象 Vector::pushBack
    • 删除对象 Vector::erase, Vector::eraSEObject
    • 遍历对象1 D$ B1 a7 r/ I; G( B; A
1.8.2 与std::vector的区别
  • std::vector是标准C++库提供的容器,它可以将任何类型数据加入到数组,但是它不会自动给元素增加引用计数器/ J. N* \4 `! e) u9 K( I
1.9 碰撞检测
战斗要打响了,麻烦也来了3 o& i6 q6 J) E/ L
1.9.1 矩形碰撞检测
  • 矩形和矩形:Rect::intersectsRect(Rect)
  • 矩形和圆:Rect::intersectsCircle(Vec2, float)
  • 矩形和点:Rect::containsPoint(Vec2)1 C3 R3 t2 J4 w6 O
1.9.2 圆形碰撞检测
  • 转化为圆心距离是否超过两个圆半径之和, N2 k. `7 m, e7 d
1.9.3 点与圆碰撞检测
  • 转化为圆心到点的距离是否小于半径/ U8 K5 Q3 k2 s
1.9.4 线段碰撞检测
  • ccpSegmentIntersect
    " _. @- {& Q5 Z# x, J) M& ~
1.10 文本显示
在不显眼的角落,它们扮演着很重要的角色* ]6 T- o! e7 W( R0 U) \( g6 q
1.10.1 systemFont
  • Label::createWithSystemFont()0 g9 B5 @; a3 i3 B
1.10.2 altas
  • Label::createWithCharMap()
    : P4 ~# D( l* o9 g, V9 _8 i! q
1.10.3 BMFont
  • Label::createWithBMFont()5 x/ x3 B" D9 D/ }
1.10.4 TTF(TrueTypeFont) Label
  • Label::createWithTTF()0 v# g3 |  a7 K+ z( w  N0 ?$ V* i
1.10.5 Label的锚点也是Label文字的对齐方式1.11 菜单
菜单,其实是触摸封装
' M' a( R* k5 K$ P/ S
1.11.1 菜单实现
  • Menu类和MenuItem类4 s% l" D/ |/ e5 q* |
    • Menu类,负责响应触摸,是Layer的派生类
    • MenuItem类,负责展示菜单项目
      0 Q% `8 d! A9 Q/ |( h9 k
  • 为菜单项设置回调函数 MenuItem::setCallback
  • 自动排列菜单项 Menu::alignItemsVertically
  • 移动菜单项位置,菜单的坐标体系原点在屏幕中间6 m8 I# g$ k6 H; j" l
1.11.2 菜单项介绍
  • MenuItemFont
  • MenuItemLabel
  • MenuItemSprite
  • MenuItemImage
  • MenuItemToggle0 D, z; E, w8 t; f" J
补充知识:设计分辨率,getFrameSize,getWinSize,getVisibleSize
8 m* y/ W- _) B
1.12 场景切换
战斗结束了...8 _- m. Q/ ~2 P2 t9 P8 `+ w
1.12.1 场景介绍
  • 场景是独立的游戏逻辑
  • 场景是导演调度单位
  • 场景是组织游戏元素的根节点
  • 显示在游戏界面上的元素,都是以场景为根节点的节点树的节点4 R' n) _( r- U8 u' u
1.12.2 场景替换 replaceScene
  • 替换场景接口5 p/ u% u$ |5 B( U6 \+ N
Scene* scene = Scene::create();Director::getInstance()->replaceScene(scene);
  • 替换场景行为
    # F, E' A, s. E; O. I
    • 删除原来活动的场景
    • 新场景为活动场景7 z' M  l  N' K+ [0 T
1.12.3 场景入栈和出栈 pushScene
  • 场景压栈
    , H( p+ X( H+ D2 g  |
Scene* scene = Scene::create();Director::getInstance()->pushScene(scene);
  • 场景压栈行为8 b4 L/ M# V' Q* Q0 L
    • 原来的活动场景保存在栈中
    • 新场景为活动场景3 ~# ~% E/ F) ^7 A- V% g+ i: @) K
  • 场景出栈
    $ N# r& t9 e" v$ q0 A3 v
Director::getInstance()->popScene();
  • 场景出栈行为8 x2 T- E  `9 h: F6 V( \, b% ?
    • 当前活动场景出栈并删除
    • 出栈之后当前栈定场景为活动场景, h. [+ b6 B9 D; W4 J
1.12.4 总结
  • 在cocos中,导演对象有一个场景栈来保存所有的场景,栈顶的场景为当前活动的场景,非栈顶的场景为暂停的场景。
  • runWithScene是第一次往栈中增加场景
  • replaceScene是替换栈顶的场景
  • pushScene是往栈中增加场景
  • popScene是从栈中删除一个场景,如果popScene后,栈为空,也就是说pop最后一个场景后,程序将退出
  • 在游戏中,慎用pushScene,因为会导致内存暴增,除非自己很清楚必须这样做。
  • 场景切换效果
    $ r0 N+ N. ?( ?, m
    • 只有replace可以有切换效果
      - d4 [/ ~) S) J7 c) u
1.13 截取屏幕
拍照留念可以不
8 Z/ j& U) {- x& X& M4 F$ N
1.13.1 使用RenderTexture抓屏
  • 流程
    0 P: l  W4 E( K. A
    • RenderTexture::begin
    • 被抓取对象::visit
    • RenderTexture::end
      3 R$ T6 j$ [: W& D- N) y6 N
1.13.2 使用utils::captureScreen抓屏
  • 在3.2中引入
    5 y: G  b0 N- ]. q* [$ a
1.14 声音
没声音,再好的戏也出不来
+ K' v! ?+ O6 M% D
1.14.1 cocos2dx跨平台音频引擎cocosdension
  • cocos2dx的音频引擎为各个平台提供统一的接口
  • 头文件 #include "SimpleAudioEngine.h"
  • 需要使用命名空间 CocosDenshion( c5 ?9 u5 Q. B, i/ e1 {$ ]1 }/ [
1.14.2 背景音乐
  • 播放背景音乐- V- \8 d! T3 v* e4 N
    • 循环播放( k: V5 I. p. R( `9 e
  • 停止背景音乐
    7 }6 {* p  w5 I0 N) b
1.14.3 音效
  • 播放音效
  • 停止音效
    5 D/ O" C* S% H! A% H& T& K
1.14.4 干预
  • 设置音量
  • 暂停
  • 继续
    ' j% ~2 s5 |) @5 E9 ^$ I
1.14.5 提高效率:预加载音乐1.14.6 背景音乐的生命周期1.14.7 程序进入后台的处理
补充:学习cppTest代码,从cppTest代码获得知识
) Q1 G3 ^" K6 k) X' K5 f+ ^3 ]
1.15 实现飞机大战案例
一切准备就绪,让我们来设计游戏吧& b7 m0 j  `( i0 e
1.15.1 设计目标
  • 划分模块,简化模块逻辑,逐步实现
    $ f3 i3 K9 U% J, B) E, X% o
1.15.2 控制层实现
  • 英雄战机的移动控制
  • 发射子弹
  • 引爆炸弹
    ; i4 f9 h' w5 n  i8 K
1.15.3 AI层实现
  • 敌机产生
  • 敌机自动移动控制
  • 子弹自动移动控制
  • 炸弹道具产生9 f0 z" W+ F( u* a4 V2 W4 z2 S
1.15.4 碰撞检测
  • 敌机和子弹的碰撞检测
  • 敌机和英雄战机的碰撞检测
    / f- J0 c/ f6 E: T6 f5 Y
1.15.5 记分实现
  • 创建Label
  • 敌军飞机死掉时,给Label更新分数
    8 j6 z6 I  E, u" W
1.15.6 实现游戏暂停
  • 添加暂停按钮
  • 在暂停按钮的处理程序中3 Y/ _' X3 r+ ]! F+ m) q8 m
    • 截取屏幕
    • 压入暂停场景
      ) e( g1 U2 g: w8 A0 G
  • 在暂停场景中
    ( S' H! X* Y4 Y1 K
    • 将游戏截图显示在场景中
    • 弹出继续游戏界面+ _+ W. V4 @* {- A8 R" }0 o
1.15.7 进入分数场景
  • 切换场景,传递最高分到新场景
    ( [* i3 J, T- k' _9 K! T% W
$ b2 W1 c1 w8 O5 q
% J8 M# u9 d. q; a6 M

; y- t) x' W0 f5 O# F' G/ a4 ?! n- Y+ j$ O; ~, s) |& L( B/ I9 p
  {$ ~9 S7 P8 P7 n+ k' R5 m
游客,如果您要查看本帖隐藏内容请回复

0 ^4 f1 q  @# L0 p  N. z

输入你的邮箱订阅论坛最新动态,还有机会免费获得VIP会员的机会哦~

回复

使用道具 举报

0

主题

0

好友

189

积分

初学乍练

Rank: 1

积分
189
发表于 2016-6-15 11:21:30 | 显示全部楼层
感谢楼主的无私分享!要想龙天论坛好 就靠你我他[STUDY]
回复 支持 反对

使用道具 举报

0

主题

0

好友

163

积分

初学乍练

Rank: 1

积分
163
发表于 2016-6-15 11:24:32 | 显示全部楼层
感谢楼主的无私分享!要想龙天论坛好 就靠你我他[STUDY]
回复 支持 反对

使用道具 举报

0

主题

0

好友

224

积分

登堂入室

Rank: 2

积分
224
发表于 2016-6-15 11:25:18 | 显示全部楼层
楼主,我太崇拜你了!我想我是一天也不能离开龙天论坛。[STUDY]
回复 支持 反对

使用道具 举报

0

主题

0

好友

177

积分

初学乍练

Rank: 1

积分
177
发表于 2016-6-15 11:26:21 | 显示全部楼层
论坛不能没有像楼主这样的人才啊!我会一直支持龙天论坛
回复 支持 反对

使用道具 举报

91

主题

1

好友

385

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
385
发表于 2016-6-15 11:27:31 | 显示全部楼层
这东西我收了!谢谢楼主!龙天论坛真好![STUDY]

点评

OKM
你好,我想问下你下载后可以看吗  发表于 2016-7-14 18:54
回复 支持 反对

使用道具 举报

0

主题

0

好友

197

积分

初学乍练

Rank: 1

积分
197
发表于 2016-6-15 11:28:35 | 显示全部楼层
楼主,我太崇拜你了!我想我是一天也不能离开龙天论坛。[STUDY]
回复 支持 反对

使用道具 举报

2

主题

0

好友

173

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
173
发表于 2016-6-15 13:06:36 | 显示全部楼层
这个帖子不回对不起自己!我想我是一天也不能离开龙天论坛
回复 支持 反对

使用道具 举报

14

主题

8

好友

156

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
156
发表于 2016-6-15 13:34:08 | 显示全部楼层

! b3 A% ]. J* {% n  z. U' K这个帖子不回对不起自己!我想我是一天也不能离开龙天论坛

点评

你这个屌丝盗用我的头像~~你这个屌丝盗用我的头像~~你这个屌丝盗用我的头像~~  详情 回复 发表于 2016-6-15 13:52
回复 支持 反对

使用道具 举报

8

主题

4

好友

139

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
139
发表于 2016-6-15 13:51:44 | 显示全部楼层
上面的屌丝盗用我的头像~~上面的屌丝盗用我的头像~~上面的屌丝盗用我的头像~~
回复 支持 反对

使用道具 举报

8

主题

4

好友

139

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
139
发表于 2016-6-15 13:52:54 | 显示全部楼层
meng_philip 发表于 2016-6-15 13:34
5 x! C, l. M+ F  i4 L这个帖子不回对不起自己!我想我是一天也不能离开龙天论坛

" ], A) \7 y. h/ p9 r
1 D) `4 i" I( q: d/ @你这个屌丝盗用我的头像~~你这个屌丝盗用我的头像~~你这个屌丝盗用我的头像~~
回复 支持 反对

使用道具 举报

3

主题

0

好友

391

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
391
发表于 2016-6-15 14:01:12 | 显示全部楼层
# O; b- d0 q+ x* e* w8 e
感谢楼主的无私分享!要想龙天论坛好 就靠你我他[STUDY]+ G0 o5 k1 X. l! {, D8 m# ^
回复 支持 反对

使用道具 举报

3

主题

0

好友

629

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
629
发表于 2016-6-15 15:24:42 | 显示全部楼层
这个帖子不回对不起自己!我想我是一天也不能离开龙天论坛
回复 支持 反对

使用道具 举报

0

主题

0

好友

1

积分

初学乍练

Rank: 1

积分
1
发表于 2016-6-15 16:04:14 | 显示全部楼层
这个帖子不回对不起自己!我想我是一天也不能离开龙天论坛。
回复 支持 反对

使用道具 举报

5

主题

6

好友

58

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
58
发表于 2016-6-15 19:05:19 | 显示全部楼层
帖子要回     资源呢?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

2

主题

0

好友

151

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
151
发表于 2016-6-15 21:56:01 | 显示全部楼层
楼主太厉害了!楼主,I*老*虎*U!我觉得龙天论坛真是个好地方!
回复 支持 反对

使用道具 举报

1

主题

0

好友

800

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
800
发表于 2016-6-15 22:47:21 | 显示全部楼层
这东西我收了!谢谢楼主!龙天论坛真好!
回复 支持 反对

使用道具 举报

8

主题

1

好友

227

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
227
发表于 2016-6-15 23:19:48 | 显示全部楼层
其实我一直觉得楼主的品味不错!呵呵!龙天论坛太棒了!
回复 支持 反对

使用道具 举报

4

主题

0

好友

167

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
167
发表于 2016-6-16 00:05:55 | 显示全部楼层

8 n7 J( V" Y5 a: H帖子要回     资源呢?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

4

主题

0

好友

104

积分

赞助会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
104
发表于 2016-6-16 04:03:49 | 显示全部楼层
终于找到这个课件了,楼主真厉害,赶紧保存下来好好学习,争取学完用于实践
回复 支持 反对

使用道具 举报

 懒得打字嘛,点击右侧快捷回复【左侧自定义内容】 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ| 小黑屋| 龙天论坛-提供IT行业免费资源学习交流的平台-好好学习,做更好的自己! ( 沪ICP备16001425号-1 )

Copyright 2013 最新最精彩-龙天论坛 版权所有 All Rights Reserved.

Powered by 龙天论坛! X3.2 LicensedCopyright
© 2013-2017 Comsenz Inc.

QQ| 小黑屋| 龙天论坛-提供IT行业免费资源学习交流的平台-好好学习,做更好的自己! ( 沪ICP备16001425号-1 )

GMT+8, 2017-5-1 02:36, Processed in 0.091779 second(s), 28 queries , Gzip On.

快速回复 返回顶部 返回列表