QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码
查看: 7925|回复: 319

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

[复制链接]

190

主题

0

好友

213

积分

赞助会员

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

积分
213
QQ
发表于 2016-6-15 11:21:05 | 显示全部楼层 |阅读模式
cocos2d-x课程大纲(基础部分)I. 第一章 基础1.1 前言
大概了解下cocos先
9 @0 h% ^) K) Q1 @8 `& o
1.1.1 cocos2d-x介绍
  • cocos2d-x是一个手机游戏开发引擎,使用C++开发,可以很方便的移植到各个平台,目前cocos2d-x支持AndroidIOS,windows,mac,linux等系统。
    % y0 W; F9 R: y; ?早先由阿根廷人开发Python版本,后来苹果手机流行之后,阿根廷人又用OC改写了cocos2d,并称之为cocos2d-iphone。
    6 x; M. G& D/ W后来由国人将cocos2d-iphone用C++改写,并称之为cocos2d-x,这样使用cocos2d-x开发的游戏很容易被移植到各个平台。
    : _2 }5 a; P% p+ g" ?2 K" I! p9 O

- v4 {( O7 P4 O/ v9 _7 V- Z
  • cocos2d-x框架图
    ! u% f/ x- a5 C# w. E

# r- e: L# }  P( Y" C" R& m1.1.2 基础阶段学习目标和作品演示
  • 了解cocos2dx
  • 实现飞机大战
    " u( w+ ^. t: A# q# E: Y4 h
1.1.3 环境搭建
  • 安装python2.7和配置python路径
  • 安装vs2013
  • 解压cocos2dx到某目录,比如d:\cocos\cocos2d-x
  • 命令行进入cocos2d-x目录,执行setup.py. D6 J$ F" m) v6 w: v
1.1.4 介绍cocos2dx开发包目录
  • build 工程目录
  • cmake makefile目录
  • cocos cocos2dx核心源代码目录
  • docs 文档目录
  • extensions 拓展代码目录,主要是GUI部分
  • external 外部开源库
  • licenses 外部开源库licenses
  • plugin 插件
  • templates 创建工程模板,创建工程使用的模板工程
  • tests 测试项目cpp-test代码在这里
  • tools 工具,创建工程的脚本就在这里
    $ q& U: o5 ]  O- M3 L# |
1.2 第一个工程
万丈高楼平地起( }2 ~) }% @6 M- u/ p+ X3 g8 ]
1.2.1 创建工程
  • cocos new ProjectName -l cpp
    $ J5 i4 e1 Y, I5 u) ~2 o/ Z在当前目录下创建一个工程名字为ProjectName
  • cocos new ProjectName -l cpp -d d:\cocos
    " w0 q# s' ]- j在d:\cocos目录下创建一个名字为ProjectName的工程
  • cocos new ProjectName -l cpp -d d:\cocos -p com.Orgnization.ProjectName2 t/ r$ ~9 ~; U% A6 a
    在d:\cocos目录下创建一个工程名为ProjectName,包名为com.Orgnization.ProjectName的工程
  • cocos new
    + @& q6 m) D2 F  @' c' z/ H/ Q# m查看cocos new命令的帮助
  • 使用vs2013打开工程目录中的解决方案文件,对第一个工程进行编译和运行, R9 P+ k8 f+ U
1.2.2 介绍工程目录
  • Classes 跨平台游戏逻辑代码
  • cocos2d cocos引擎代码
  • proj.xxxx 平台相关的代码和工程文件
  • Resources 资源文件(图片、声音、脚本)
    . a; c" |: E: u: L0 p
1.2.3 介绍详细代码
  • 程序入口和AppDelegate
    ) G& s' D# C+ m+ s3 S8 n, n6 O) dmain函数通过虚函数调用到AppDelegate::applicationDidFinishLaunching
  • AppDelegate::applicationDidFinishLaunching()
    * l6 _6 a6 O, W这个是真正的入口函数,负责游戏的初始化,包括创建第一个场景
  • HelloWorld::init()# ?% p/ Y; N! C2 N& o
    场景层的初始化,负责显示场景的信息
  • HelloWorld::menuCloseCallback(Ref*)
    7 r; U# t$ Y" O6 x, T& [7 F2 }! r退出菜单的回调函数,负责程序退出
  • 头文件和命名空间
    * G4 g- p$ ?2 t  Z/ R8 ecocos引擎定义cocos2d.h头文件中,并且使用了命名空间cocos2d,因此我们写的程序都应该包含cocos2d头文件,并且需要使用cocos2d命名空间,2 ]% q. E3 X. d8 f
#include "cocos2d.h"USING_NS_CC;// #define USING_NS_CC using namespace cocos2d
e USING_NS_CC using namespace cocos2d
  • 初始化的调用过程& v9 T# O- T; D" u2 k/ v! S) Y
1.2.4 cocos设计理念
cocos2dx的设计者将游戏划分为一个个片段组成:每个片段由Scene负责组织;片段内部的模块划分由Layer负责组织;Scene和Layer虽然是游戏组织的一部分,但是它们一般并不可见、可见的部分如英雄、怪物、道具由精灵负责抽象。# l% F4 [6 X, p& v9 D3 W8 O9 ?
Director负责推动游戏进程的发展,切换场景是由导演来负责的' h$ D5 {. q0 w4 Q& B" b  H" R
  h4 \# D7 D* G  T1 d" Y- B- Z
1.3 精灵
Sprite,游戏的灵魂
3 q' W) f1 n6 v( l) ^+ A
1.3.1 精灵的创建
精灵可以通过图片、纹理或者精灵帧作为参数来创建( O, e5 }* @0 O8 j
  • Sprite::create()
  • Sprite::createWithTexture()
  • Sprite::createWithSpriteFrame()( L. J5 p$ ]  J  [$ O+ G2 h/ W
cocos2dx使用create函数来创建对象,create函数调用了new,init,autorelease等方法,对对象管理: c' A( z/ d& Y* X" B
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, setGlobalZOrder6 H2 x& q: s# N( d; U: J! d! m
1.3.3 自定义精灵类(派生)
为什么要派生精灵的子类?因为不同的精灵有不同的额外的属性和动作,从面向对象角度来说,额外的属性需要通过派生子类来加入。派生子类需要注意,在子类的init函数中,调用父类的init函数,Sprite提供了一些列init函数,供我们在子类中调用,我们可以选择一个合适的init函数使用。
. c' e0 ?1 G8 X: l6 W
  • 初始化空精灵 Sprite::init()
  • 通过文件初始化精灵 Sprite::initWithFile()
  • 通过纹理初始化精灵 Sprite::initWithTexture()
  • 通过精灵帧初始化精灵 Sprite::initWithSpriteFrame()
    % N- s6 I( |9 d( l# x6 J
1.3.4 纹理和精灵帧
  • 纹理
    / n! N$ ?. t0 A# D" S2 g  H# S0 G对应的类叫做Texture2D,在2D的概念中,纹理其实就是指图片了。图片在加载到内存之后,做进一步的处理,将数据格式转换成适合opengl渲染的格式,这个格式的数据我们称之为纹理。
    2 }$ X* b' A/ ~& v6 ^; ]" Z0 B. P3 i
    • 加载纹理方法:Director::getInstance()->getTextureCache()->loadImage("test.png");/ d: v+ _# j5 S8 Z9 Q, O+ f0 |# a6 {
  • 精灵帧
    6 ]8 ~$ X( F! p, }对应的类叫做SpriteFrame,有时候一张大的纹理包括很多小图,我们只需要纹理的一部分来创建精灵,我们可以理解精灵帧是纹理的一部分。: z/ Q# s/ @+ P. u" Z
    • SpriteFrame* frame = SpriteFrame::create(filename, rect);
    • SPriteFrame* frame = SpriteFrame::createWithTexture(texture, rect);
    • SpriteFrameCache::getInstance()->addSpriteFramesWithFile(plistFile)' c# U$ `* [9 j6 u' H/ ~
      通过plist文件加载一些列精灵帧,这个将来在缓存时细说8 y8 [4 O: ]% O" x) ~
1.4 坐标体系和锚点
要做到胸有成竹,必须要清楚坐标体系# i/ x( V( j5 @9 D: V5 \( h8 B; L
1.4.1 坐标体系概念
  • cocos2dx坐标体系
    & [$ R7 ]! F3 b' P: @4 n8 ^
* ~# y7 P2 I9 [6 `
游戏中使用的是cocos2dx坐标体系,也叫GL坐标体系
1.4.2 精灵的锚点
  • setAnchorPoint
  • 调用精灵的setPosition时的对齐点
  • 锚点范围为(0, 0) ~ (1, 1)
  • 使用相对坐标,非绝对坐标
  • 是setRotation的中心点& P; [9 _  v! @& y5 S2 }
1.5 单点触摸处理
触摸处理是游戏控制的基础3 N* ?7 t3 X& n- T, _5 U
1.5.1 设置触摸监听
  • 创建EventListenerTouchOneByOne对象
  • 设置回调函数
    & P: j. ~" R  S' x9 E8 T, I
    • onTouchBegan
      9 A$ q8 P! k) {/ V返回值true表示该监听器接受并处理这次触摸,并且后续函数会得到调用,否则返回false
    • onTouchMoved+ d/ E' P6 r1 U, i2 m
      触摸移动时被调用
    • onTouchEnded
      - k- L. }( p) K触摸结束时(松手时)被调用
    • onTouchCancelled
      ' i" \0 ]' b4 X取消触摸(比如来电导致游戏切入后台)时被调用
      ( {6 [; m0 Y4 C0 f1 O
  • 将监听对象加入到事件分发器$ |5 F/ F5 `/ |+ a" T7 a- _
    • _eventDispatcher
    • addEventListenerWithSceneGraphPriority
    • addEventListenerWithFixedPriority/ C3 C( n7 o" _" Y% {6 R. K
  • 将监听对象删除8 M, u# ^2 h% Z
    • removeEventListener
    • removeAllEventListeners
      ( F8 Z" w7 K  t  T6 I6 e$ f  Z
1.5.2 Touch对象
每个触摸函数都有两个参数,Touch和Event,其中Event可以忽略,Touch对象中带着一些触摸信息需要我们了解
  • Touch::getLocation8 Z+ v. B$ E; c. E% c
    返回触摸当前坐标,该坐标是世界体系的坐标,不论监听的对象是精灵还是层,返回坐标都是世界坐标,该函数可以在began、moved、ended、cancelled函数中调用获取当前触摸的位置
  • Touch::getDelta
    1 c1 j4 N: Z4 p- H返回触摸偏移量,该函数一般在moved中调用才有意义
  • Touch::getStartLocation: h% {  _' f! k- S: D5 Z3 s8 W$ P9 `
    返回触摸开始时位置,该函数在began时和getLocation一样,在moved和ended时,可以调用该函数返回当初触摸开始时位置
    # j; D6 s/ m7 n5 A: B8 i
1.5.3 lambada表达式和应用
  • Lambada表达式: e+ s, R. ^5 D; D0 E9 [
    • 基本语法:' D' K5 t3 K  O
      • [capture list](parameter list)->return type{function body}
      • [capture list]和{function body}是必须的,其他是可选的
        % J+ z" Y$ p; V9 \
    • 捕获列表 capture list
      2 g1 R" ]+ ?# m5 Y; Z* [$ D
      • [] 不捕获
      • [=] 捕获外部所有常量,以传值方式
      • [&] 捕获外部所有变量,以引用方式
      • [&a, b] 以引用方式捕获a,以传值方式捕获b
      • [&a, =] 以引用方式捕获a,其他变量传值捕获
      • 捕获列表一般使用[&],即可
      • 捕获列表可以捕获的参数范围为lambada表达式可见的变量,包括之前定义的局部变量,this指针,全局变量,但是捕获局部变量是一个危险的行为,因为lambada表达式被调用时,局部变量可能已经不存在了.
        2 w+ D: N1 S4 r: T8 u
    • 参数列表 parameter list8 _+ p* @) w: f; j0 |, E+ ?
      • 与普通参数列表相同
        $ `) H1 y4 x$ J; T. l
    • 返回类型 return type
      $ A5 a3 i" s; i+ u7 c
      • 一般省略,lambada表达式的返回值代表了返回类型5 |' z2 d" p) Q. T
    • 代码块 function body
      5 n$ ]! z6 f3 ]2 C
      • 与普通函数代码块相同& a  R/ K# t+ w% l6 z8 Q9 A
Lambada表达式是一个匿名函数,由捕获列表,参数列表和代码块组成。捕获列表的存在使得我们可以在定义函数时,给函数传递参数,使得函数定义和调用更加灵活。
0 r" S( f( T9 X9 ^# N" x' d  D1 ?
  • 使用lambada表达式作为触摸处理的回调函数
    - T+ R1 ~  M5 U4 F) K* u) v. s
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移动精灵" m3 t' H, p5 ?4 l/ ^1 ]# [+ J
1.6 定时器
定时器是自动控制(AI)的基础
7 s, y$ V' }0 ~
1.6.1 帧定时器
  • Node::scheduleUpdate- b9 ~0 t6 }& M3 a
1.6.2 自定义定时器
  • Node::schedule
    3 R" l  Y. K: a
1.6.3 定时器回调函数的参数
  • void Node::update(float dt)
    ) u- _% J' C! z* `+ `7 l参数dt表示超时时间间隔,以秒为单位,一般这个值是有误差的,而且一般大于设定的值,比如设置超时时间为1秒,那么dt可能是1.000111秒8 [9 j* r$ y' F. ?- t
1.6.4 取消和干预定时器
  • 节点释放时,它自动会取消该节点拥有的定时器。
  • 节点未释放时,可以调用Node::unschedule取消某个定时器
  • 通过重新调用schedule可以改变定时器时间间隔- v7 k9 h: e* J# W
1.6.5 练习:通过定时器实现动画
  • 创建精灵
  • 启动定时器
  • 在定时器里切换精灵的精灵帧
    . y: Q  O+ Z8 r4 D+ y! q
    • setSpriteFrame0 ]$ T  N* \1 X+ K7 y
1.6.6 练习:通过定时器实现精灵运动
  • 创建精灵
  • 启动定时器
  • 在定时器里设置精灵的位置3 z) H( v& t0 s; k* i  Y
1.7 内存管理
cocos使用了引用计数器自动管理内存,不理解它,等着程序跑飞吧
( C; W, G. ^: _0 `
1.7.1 Ref类
Ref类几乎是所有cocos类的父类,在2.2.3版本里,这个类叫做CCObject,该类有一个主要的功能,就是实现了对象的引用计数器
1.7.2 管理引用计数器
  • 构造函数:构造函数将引用计数器初始化为1
  • retain:将计数器加1
  • release:将计数器减1,如果减去1之后等于0,则执行delete this,自己删除自己* i* m: P* w; T3 O; G1 q* Z" z
1.7.3 静态的create方法
  • cocos采用静态的create函数来创建对象,在静态的create函数里,除了创建对象之外,还调用该对象的init函数来对对象进行初始化,最后调用了autorelease将该对象加入内存管理池,纳入自动管理。
  • cocos的这种创建对象的方法,参考了ObjectC,从C++设计角度来说,这样创建对象也是合理的,构造函数负责数值初始化,而init负责逻辑初始化。
    ) M( P6 N% z8 O
1.7.4 内存管理池
  • 当对象调用autorelease时,它将自己加入内存管理池,该内存管理池会在一次帧循环结束时,调用池子里所有对象的release,这样如果对象在这个帧循环内,没有被其他对象引用的话,该对象会被自动销毁。
  • 如果该对象被别的对象引用了,那么别的对象要不再引用该对象时,要调用该对象的release函数。% M  j$ d3 a& D2 T3 F% I" R' e3 _
大部分时候,我们只需要create对象,然后将它加入到父节点即可,Ref的release、retain、autorelease函数,其实是内部调用的。但是理解机制很重要,某些场合下,需要我们自己去release对象
1.8 数组容器Vector
敌人很多,得拿个东西装起来
5 g0 R- ^$ w5 x8 V- ]  K
1.8.1 Vector
  • Vector是cocos里定义的容器类,它只能将Ref或者Ref的子类对象加入到该数组中。
  • 当一个Ref对象被加入到该数组时,Ref对象的引用计数器会自动增加1
  • 当Ref对象从数组中移除时,Ref对象的引用计数器会自动减少1
  • 数组访问- C/ s* x8 N, s2 z: ^' ^- @
    • 增加对象 Vector::pushBack
    • 删除对象 Vector::erase, Vector::eraSEObject
    • 遍历对象+ n0 j' h! S* V- ?( j& ~
1.8.2 与std::vector的区别
  • std::vector是标准C++库提供的容器,它可以将任何类型数据加入到数组,但是它不会自动给元素增加引用计数器1 _) ^( h8 R6 {
1.9 碰撞检测
战斗要打响了,麻烦也来了- k8 ]& U1 D. W; \
1.9.1 矩形碰撞检测
  • 矩形和矩形:Rect::intersectsRect(Rect)
  • 矩形和圆:Rect::intersectsCircle(Vec2, float)
  • 矩形和点:Rect::containsPoint(Vec2)2 F  @, P' V( Y' ]4 P! H
1.9.2 圆形碰撞检测
  • 转化为圆心距离是否超过两个圆半径之和/ l( ?% L7 ?) T+ {1 d0 g
1.9.3 点与圆碰撞检测
  • 转化为圆心到点的距离是否小于半径9 ~: ~. ]. I. E3 _
1.9.4 线段碰撞检测
  • ccpSegmentIntersect$ b: h9 D2 a/ F; ~2 H' h
1.10 文本显示
在不显眼的角落,它们扮演着很重要的角色0 W$ v1 n5 I% ]+ J" P4 T- I
1.10.1 systemFont
  • Label::createWithSystemFont()
    ; n$ s3 p3 S# L1 `2 J
1.10.2 altas
  • Label::createWithCharMap()
    6 R1 Q/ B0 [/ W# x8 z, A; b
1.10.3 BMFont
  • Label::createWithBMFont()/ H. N2 u3 y! {6 U: Q
1.10.4 TTF(TrueTypeFont) Label
  • Label::createWithTTF()2 Q  J, e) V! _: t# m4 @: B' C" v
1.10.5 Label的锚点也是Label文字的对齐方式1.11 菜单
菜单,其实是触摸封装
+ C2 i, l6 J7 I( K) `, T  p2 V
1.11.1 菜单实现
  • Menu类和MenuItem类1 O" w  s* g1 D2 _
    • Menu类,负责响应触摸,是Layer的派生类
    • MenuItem类,负责展示菜单项目
      * P- [- l7 S1 Y4 k3 p8 L6 ^( @! b
  • 为菜单项设置回调函数 MenuItem::setCallback
  • 自动排列菜单项 Menu::alignItemsVertically
  • 移动菜单项位置,菜单的坐标体系原点在屏幕中间
    : m( {9 J$ m0 k/ Y
1.11.2 菜单项介绍
  • MenuItemFont
  • MenuItemLabel
  • MenuItemSprite
  • MenuItemImage
  • MenuItemToggle/ J; g4 k0 |) }6 p( V
补充知识:设计分辨率,getFrameSize,getWinSize,getVisibleSize& w" b- ]- |0 t5 f$ V
1.12 场景切换
战斗结束了...  z- U* A2 Y* T
1.12.1 场景介绍
  • 场景是独立的游戏逻辑
  • 场景是导演调度单位
  • 场景是组织游戏元素的根节点
  • 显示在游戏界面上的元素,都是以场景为根节点的节点树的节点
    3 t2 S" Z' e. H  Z( B
1.12.2 场景替换 replaceScene
  • 替换场景接口
    7 Z2 |' o# t* S% d
Scene* scene = Scene::create();Director::getInstance()->replaceScene(scene);
  • 替换场景行为
    5 D: O4 {: d" ^
    • 删除原来活动的场景
    • 新场景为活动场景( `6 U" A- Z4 r; G# s
1.12.3 场景入栈和出栈 pushScene
  • 场景压栈) A& b5 [' m* D
Scene* scene = Scene::create();Director::getInstance()->pushScene(scene);
  • 场景压栈行为
    ' b; d3 ]8 D- Y2 [% @
    • 原来的活动场景保存在栈中
    • 新场景为活动场景
        G  ~- q1 W$ j- ~$ A9 b# k
  • 场景出栈
    4 _# t1 q7 y/ x% i9 ]  q3 r6 D( \
Director::getInstance()->popScene();
  • 场景出栈行为
    . h, G# e- |/ ^" L$ w
    • 当前活动场景出栈并删除
    • 出栈之后当前栈定场景为活动场景
      8 w/ |) k, w/ ~: c
1.12.4 总结
  • 在cocos中,导演对象有一个场景栈来保存所有的场景,栈顶的场景为当前活动的场景,非栈顶的场景为暂停的场景。
  • runWithScene是第一次往栈中增加场景
  • replaceScene是替换栈顶的场景
  • pushScene是往栈中增加场景
  • popScene是从栈中删除一个场景,如果popScene后,栈为空,也就是说pop最后一个场景后,程序将退出
  • 在游戏中,慎用pushScene,因为会导致内存暴增,除非自己很清楚必须这样做。
  • 场景切换效果
    3 E* W0 K" J7 W' c: g9 |
    • 只有replace可以有切换效果  b1 \  @' {  n: c4 Y
1.13 截取屏幕
拍照留念可以不
, I, k6 p/ K0 H
1.13.1 使用RenderTexture抓屏
  • 流程
    3 R5 L! B, Z/ a, x
    • RenderTexture::begin
    • 被抓取对象::visit
    • RenderTexture::end
      + z4 i& \% }. E9 A
1.13.2 使用utils::captureScreen抓屏
  • 在3.2中引入5 B8 w! u7 R. a& ^" m
1.14 声音
没声音,再好的戏也出不来
% ]7 u4 F7 |9 W9 n8 Y0 M: A6 {
1.14.1 cocos2dx跨平台音频引擎cocosdension
  • cocos2dx的音频引擎为各个平台提供统一的接口
  • 头文件 #include "SimpleAudioEngine.h"
  • 需要使用命名空间 CocosDenshion1 M# C, T' @$ ?) i0 m4 J+ s
1.14.2 背景音乐
  • 播放背景音乐
    # _! _6 {+ y6 P  e7 U
    • 循环播放' k7 R* \' {& H% ~& D
  • 停止背景音乐; E% l  n! P" [( R  A
1.14.3 音效
  • 播放音效
  • 停止音效
    / i- g! h) D- T4 `9 p7 P. c0 }
1.14.4 干预
  • 设置音量
  • 暂停
  • 继续
    / \3 i) J2 C* o* g, a: \5 @* z
1.14.5 提高效率:预加载音乐1.14.6 背景音乐的生命周期1.14.7 程序进入后台的处理
补充:学习cppTest代码,从cppTest代码获得知识
. t# m( R9 w0 Q3 }7 x2 \  m" ]+ ^
1.15 实现飞机大战案例
一切准备就绪,让我们来设计游戏吧' [9 e6 ]; D4 S: [' N# l/ I
1.15.1 设计目标
  • 划分模块,简化模块逻辑,逐步实现
    ) j4 G. `: o. W0 m  c5 g4 Q
1.15.2 控制层实现
  • 英雄战机的移动控制
  • 发射子弹
  • 引爆炸弹
    % k; @* [/ c0 F1 R2 b& o
1.15.3 AI层实现
  • 敌机产生
  • 敌机自动移动控制
  • 子弹自动移动控制
  • 炸弹道具产生' \, J; v" m& y1 h* a+ L7 H4 x. J0 r% Q
1.15.4 碰撞检测
  • 敌机和子弹的碰撞检测
  • 敌机和英雄战机的碰撞检测
    5 o$ x: I$ b( l( _! ]
1.15.5 记分实现
  • 创建Label
  • 敌军飞机死掉时,给Label更新分数& l7 _7 i3 k6 i5 e; _: U
1.15.6 实现游戏暂停
  • 添加暂停按钮
  • 在暂停按钮的处理程序中# j- l& W9 J- \4 o* x
    • 截取屏幕
    • 压入暂停场景0 r2 e0 m( x  X8 `8 G0 ]
  • 在暂停场景中- f( _6 c6 A. k7 U: |! E
    • 将游戏截图显示在场景中
    • 弹出继续游戏界面' j2 h) g7 ~, q5 P
1.15.7 进入分数场景
  • 切换场景,传递最高分到新场景
    ) m: p! w" \$ Y6 P' a
/ i. x- b" @8 m# k
+ r, o0 A# G0 V0 _( G

5 y+ l- Y1 i, r& `
; F( \% M! j  a
! @  Z- B% R+ t# q' |
游客,如果您要查看本帖隐藏内容请回复
) E, i/ U: l6 b& |/ W& o) j

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

回复

使用道具 举报

0

主题

0

好友

189

积分

初学乍练

Rank: 1

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

使用道具 举报

0

主题

0

好友

161

积分

初学乍练

Rank: 1

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

使用道具 举报

0

主题

0

好友

224

积分

登堂入室

Rank: 2

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

使用道具 举报

0

主题

0

好友

178

积分

初学乍练

Rank: 1

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

使用道具 举报

91

主题

1

好友

384

积分

赞助会员

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

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

点评

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

使用道具 举报

0

主题

0

好友

199

积分

初学乍练

Rank: 1

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

使用道具 举报

2

主题

0

好友

171

积分

赞助会员

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

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

使用道具 举报

14

主题

8

好友

155

积分

赞助会员

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

积分
155
发表于 2016-6-15 13:34:08 | 显示全部楼层
) |, S9 ~) k7 h$ D) n. f: e# Z+ |& N- J
这个帖子不回对不起自己!我想我是一天也不能离开龙天论坛

点评

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

使用道具 举报

8

主题

4

好友

137

积分

赞助会员

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

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

使用道具 举报

8

主题

4

好友

137

积分

赞助会员

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

积分
137
发表于 2016-6-15 13:52:54 | 显示全部楼层
meng_philip 发表于 2016-6-15 13:34* w6 S' Z+ x. v
这个帖子不回对不起自己!我想我是一天也不能离开龙天论坛
" X" L' [+ V7 V2 Q
' w7 b1 X" r1 O6 {
你这个屌丝盗用我的头像~~你这个屌丝盗用我的头像~~你这个屌丝盗用我的头像~~
回复 支持 反对

使用道具 举报

3

主题

0

好友

388

积分

赞助会员

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

积分
388
发表于 2016-6-15 14:01:12 | 显示全部楼层

, R: r* B" l( |9 W6 t; m; C5 N" A感谢楼主的无私分享!要想龙天论坛好 就靠你我他[STUDY]
. T3 f" |2 K) s! ?' o) j6 @  W
回复 支持 反对

使用道具 举报

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

好友

57

积分

赞助会员

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

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

使用道具 举报

2

主题

0

好友

148

积分

赞助会员

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

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

使用道具 举报

1

主题

0

好友

796

积分

赞助会员

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

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

使用道具 举报

8

主题

1

好友

226

积分

赞助会员

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

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

使用道具 举报

4

主题

0

好友

164

积分

赞助会员

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

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

. X. H+ V7 M& w6 r4 ~帖子要回     资源呢?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

4

主题

0

好友

103

积分

赞助会员

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

积分
103
发表于 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-28 08:55, Processed in 1.181351 second(s), 28 queries , Gzip On.

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