搜索

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

[复制链接]
楼主: 百度云论坛

13

主题

0

好友

135

积分

赞助会员

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

积分
135
发表于 2016-6-16 22:13:27 | 显示全部楼层

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

回复 支持 反对

使用道具 举报

7

主题

0

好友

255

积分

赞助会员

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

积分
255
发表于 2016-6-16 22:24:42 | 显示全部楼层
既然你诚信诚意的推荐了,那我就勉为其难的看看吧!龙天论坛不走平凡路。
回复 支持 反对

使用道具 举报

1

主题

1

好友

145

积分

赞助会员

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

积分
145
发表于 2016-6-16 22:31:40 | 显示全部楼层
失效了 失效了 失效了 失效了 失效了 失效了 失效了 失效了 失效了 失效了 失效了 失效了
回复 支持 反对

使用道具 举报

6

主题

1

好友

580

积分

赞助会员

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

积分
580
发表于 2016-6-16 23:08:12 | 显示全部楼层
楼主发贴辛苦了,谢谢楼主分享!我觉得龙天论坛是注册对了!
回复 支持 反对

使用道具 举报

2

主题

3

好友

187

积分

赞助会员

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

积分
187
发表于 2016-6-17 00:43:46 | 显示全部楼层
薛老师cocos2d游戏开发34天视频教程. u+ }- `1 H/ n4 k2 }
薛老师cocos2d游戏开发34天视频教程0 }" i8 h9 u+ p1 d0 V
薛老师cocos2d游戏开发34天视频教程
& ~. ^& y9 |, X2 j% p薛老师cocos2d游戏开发34天视频教程
. r% h0 J: c" n  o薛老师cocos2d游戏开发34天视频教程
回复 支持 反对

使用道具 举报

2

主题

1

好友

112

积分

赞助会员

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

积分
112
发表于 2016-6-17 00:50:40 | 显示全部楼层

- n- V  b& W" B9 m+ v感谢楼主的无私分享!要想龙天论坛好 就靠你我他[STUDY]
回复 支持 反对

使用道具 举报

1

主题

5

好友

154

积分

赞助会员

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

积分
154
发表于 2016-6-17 08:27:37 | 显示全部楼层
薛老师cocos2d游戏开发34天视频教程..............................................................................................xiexie楼主
回复 支持 反对

使用道具 举报

1

主题

0

好友

152

积分

赞助会员

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

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

使用道具 举报

6

主题

0

好友

198

积分

赞助会员

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

积分
198
发表于 2016-6-17 09:21:34 | 显示全部楼层
崇拜ing。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
回复

使用道具 举报

6

主题

0

好友

198

积分

赞助会员

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

积分
198
发表于 2016-6-17 09:25:49 | 显示全部楼层
资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了资源不见了
回复 支持 反对

使用道具 举报

0

主题

0

好友

2

积分

初学乍练

Rank: 1

积分
2
发表于 2016-6-17 10:10:06 | 显示全部楼层

& n6 D9 j* r3 J: z' A, b2 o感谢楼主的无私分享!要想龙天论坛好 就靠你我他[STUDY]
回复 支持 反对

使用道具 举报

6

主题

8

好友

174

积分

赞助会员

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

积分
174
发表于 2016-6-17 10:19:12 | 显示全部楼层
这东西我收了!谢谢楼主!龙天论坛真好!
回复 支持 反对

使用道具 举报

1

主题

0

好友

168

积分

赞助会员

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

积分
168
发表于 2016-6-17 11:48:10 | 显示全部楼层
1.15.4 碰撞检测+ |4 [( X0 e) p. t* h; g) o$ T3 f
敌机和子弹的碰撞检测. V. ~3 I$ ^1 g' k
敌机和英雄战机的碰撞检测- h8 E  B1 Y* @# |+ X. ?2 z# f3 T% ^5 Z/ M7 x
1.15.5 记分实现$ W; w) j8 l6 I. v) o
创建Label
8 Z$ O+ [( T) T8 R8 B* F敌军飞机死掉时,给Label更新分数
1 n, G- i( T) I9 w: ?0 n1.15.6 实现游戏暂停0 U8 ]0 {8 k- \! e  |; n+ s) E
添加暂停按钮
4 A5 q% e9 |8 Q6 o" Y# M) ]在暂停按钮的处理程序中: o) Q% S) D! p: C: o1 l" P5 a
* i0 \( h$ k& m; x2 ]4 i9 P+ `+ p截取屏幕) Z) {8 T# Q9 D- V# q6 t. E" H0 k
压入暂停场景" d/ k' x, V* N% q, t( ]. E+ ^) M
" n% y; D3 F  _6 P在暂停场景中- e3 l- o& i& a1 Z. H% ?' M3 I& t6 U* D
将游戏截图显示在场景中8 e5 a3 k' \$ K7 D% e
弹出继续游戏界面+ o( e& [( b" i# y( ~; B% A5 I/ s
1.15.7 进入分数场景1 W5 U' `  O9 o" [
切换场景,传递最高分到新场景
回复 支持 反对

使用道具 举报

2

主题

0

好友

145

积分

赞助会员

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

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

使用道具 举报

7

主题

0

好友

197

积分

赞助会员

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

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

使用道具 举报

0

主题

0

好友

7

积分

初学乍练

Rank: 1

积分
7
发表于 2016-6-17 13:12:09 | 显示全部楼层
感谢楼主的无私分享!要想龙天论坛好 就靠你我他[STUDY]- y* e# j1 W+ {0 t. M
回复 支持 反对

使用道具 举报

0

主题

0

好友

7

积分

初学乍练

Rank: 1

积分
7
发表于 2016-6-17 13:18:57 | 显示全部楼层
链接失效!!!!!!!!!!链接失效!!!!!!!!!!链接失效!!!!!!!!!!
回复 支持 反对

使用道具 举报

4

主题

1

好友

112

积分

赞助会员

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

积分
112
发表于 2016-6-17 13:24:07 | 显示全部楼层
薛老师cocos2d游戏开发34天视频教程薛老师cocos2d游戏开发34天视频教程
回复 支持 反对

使用道具 举报

1

主题

1

好友

50

积分

赞助会员

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

积分
50
发表于 2016-6-17 15:34:28 | 显示全部楼层

$ I8 d, L% G3 O* W* b* f! ?6 gcocos2d-x课程大纲(基础部分)I. 第一章 基础1.1 前言" n* Q% t2 `$ Z7 f6 U1 }
大概了解下cocos先
7 P* M( M6 E' G' O1.1.1 cocos2d-x介绍( a' i( s" z6 {  L1 x
cocos2d-x是一个手机游戏开发引擎,使用C++开发,可以很方便的移植到各个平台,目前cocos2d-x支持Android,IOS,windows,mac,linux等系统。7 t: M0 O  o5 p
早先由阿根廷人开发Python版本,后来苹果手机流行之后,阿根廷人又用OC改写了cocos2d,并称之为cocos2d-iphone。; o# a; p8 t5 a0 \: l3 ~! ^% z
后来由国人将cocos2d-iphone用C++改写,并称之为cocos2d-x,这样使用cocos2d-x开发的游戏很容易被移植到各个平台。# }* R# C0 x7 ~3 N( B1 E
/ B3 a7 l  }* q2 U& J2 Z+ f& D% x. b
1 @6 l: |2 ~! K* acocos2d-x框架图7 c3 X- U; c7 ?& B" Z% W" U9 _/ F- T9 i& B+ _* |( u# c
) d' ]9 D. b! {' D+ _
1.1.2 基础阶段学习目标和作品演示
" k# ^4 [" H+ C1 [6 X) Z9 U了解cocos2dx
! c! B$ y8 ]5 K, W2 e9 ~: C实现飞机大战7 K; J$ l+ e) z6 V/ o" m
0 j& Y9 D* S+ G, h/ |+ O' u1.1.3 环境搭建
+ E  ?- Q7 t+ G3 f( S1 s! y/ B安装python2.7和配置python路径2 y  Y+ e- A0 P& }, N6 i
安装vs2013
- u, y8 z7 e  F' Z* K解压cocos2dx到某目录,比如d:\cocos\cocos2d-x
: t- }- P0 N8 `4 v7 a8 _: `命令行进入cocos2d-x目录,执行setup.py6 R. t$ I; i7 {& O8 U7 a6 S
1.1.4 介绍cocos2dx开发包目录
7 F- ~; ]1 f! N2 [build 工程目录
+ ~$ \' z, v7 L$ V! I  b7 T+ P8 ?cmake makefile目录) ]/ l2 P2 k! Y$ E) Z+ L- ~8 _; Z
cocos cocos2dx核心源代码目录
0 ?0 E" z) U- udocs 文档目录
% y7 `; X- ^% f: a( b$ ^* xextensions 拓展代码目录,主要是GUI部分9 c* u' Y) z% _! _2 d% U
external 外部开源库3 \/ L  k& i; x) A
licenses 外部开源库licenses
. w5 l+ ]5 c- k+ r& d" \plugin 插件
& i. d1 W5 v. @3 h3 D; A9 }templates 创建工程模板,创建工程使用的模板工程  U3 |; B  T" K4 b9 y
tests 测试项目cpp-test代码在这里4 b7 A* j( e' W2 f- i# u
tools 工具,创建工程的脚本就在这里2 C5 @5 P+ V3 J# x6 I
1.2 第一个工程0 _+ G! v) j4 y6 I* B1 \
万丈高楼平地起
6 [5 t+ u( q- u# N/ O1.2.1 创建工程' f/ g/ b1 w8 \  C' v7 Y
cocos new ProjectName -l cpp# b/ r  Q6 y( z$ C! R6 Q6 {& `  Y- X4 a+ W( v) _1 k
在当前目录下创建一个工程名字为ProjectName
& l4 M7 q) T& s( Y; S. Zcocos new ProjectName -l cpp -d d:\cocos
8 s" W4 i" K5 q在d:\cocos目录下创建一个名字为ProjectName的工程4 {+ d2 W5 I4 Q. K/ [
cocos new ProjectName -l cpp -d d:\cocos -p com.Orgnization.ProjectName
- ^. X1 u$ i5 N: K) i在d:\cocos目录下创建一个工程名为ProjectName,包名为com.Orgnization.ProjectName的工程+ m$ ~: g) u* m# N: x
cocos new+ j0 U" w" p! f5 b0 c  g
查看cocos new命令的帮助
+ F  B! v5 ?$ b3 a' s6 |: Y使用vs2013打开工程目录中的解决方案文件,对第一个工程进行编译和运行
$ B$ c. u7 }( u( @2 T1.2.2 介绍工程目录
! b. ~: L% y; l1 y" KClasses 跨平台游戏逻辑代码1 N% z; w+ G+ o3 S! A. C; P
cocos2d cocos引擎代码6 f, a- i  D0 n: ^1 g% l
proj.xxxx 平台相关的代码和工程文件
7 N# }: X1 Q4 E' ]Resources 资源文件(图片、声音、脚本)7 Y, ]) `: [6 A) [* @% |2 ?5 y) [2 |+ |! l, R9 t+ C
1.2.3 介绍详细代码! \# H9 i9 h/ `, Z
程序入口和AppDelegate, K5 _7 u" `+ l$ @) i3 ^+ P6 k( i4 }8 R( e8 a. v0 \& |/ k/ G
main函数通过虚函数调用到AppDelegate::applicationDidFinishLaunching1 R3 f7 j% s: x" A( g( U% g
AppDelegate::applicationDidFinishLaunching()
3 S9 x5 j# ?( I8 w) ~这个是真正的入口函数,负责游戏的初始化,包括创建第一个场景
$ a2 a1 v% q# r. L+ t  @HelloWorld::init()4 ~) c! e) G4 Y" ]; l4 k7 Y
场景层的初始化,负责显示场景的信息9 M# Z$ g$ o. \' `2 R
HelloWorld::menuCloseCallback(Ref*)" R- p! g% F9 x7 w" J
退出菜单的回调函数,负责程序退出% U$ w( @$ R, D+ E3 S$ U
头文件和命名空间
% f! r" ~  l: W0 k) o4 p' h  M5 b/ Ycocos引擎定义cocos2d.h头文件中,并且使用了命名空间cocos2d,因此我们写的程序都应该包含cocos2d头文件,并且需要使用cocos2d命名空间,
8 r0 Q8 d# h2 A& r( @: i! `$ G: b#include "cocos2d.h"USING_NS_CC;// #define USING_NS_CC using namespace cocos2d
; i9 Z/ N& K3 _$ [( N* O; de USING_NS_CC using namespace cocos2d+ Z0 u9 U4 I* ^9 j
初始化的调用过程
, c4 n# g5 q' Y1 W' u9 p1.2.4 cocos设计理念6 G, ^0 T* j2 A. U. T9 D0 z
cocos2dx的设计者将游戏划分为一个个片段组成:每个片段由Scene负责组织;片段内部的模块划分由Layer负责组织;Scene和Layer虽然是游戏组织的一部分,但是它们一般并不可见、可见的部分如英雄、怪物、道具由精灵负责抽象。" N5 r' B* p* [, F' ~. s1 }6 P
5 P9 N6 W5 H* p' kDirector负责推动游戏进程的发展,切换场景是由导演来负责的& g! f  l- X/ D' w
* [: U* j' Y1 {$ c& i1 M
1.3 精灵
6 `8 H" q2 r6 @' O! e$ LSprite,游戏的灵魂! d2 N; B4 ]0 ~/ Z' d  w
; d5 c  O) O7 H; ~- |+ q3 ^' K0 G1.3.1 精灵的创建; U) U. f2 y7 b7 p) F( n
精灵可以通过图片、纹理或者精灵帧作为参数来创建% N( o) \% G7 r9 l  ~7 U4 o/ \6 O8 |7 v$ \) B+ W) e& Y, [2 T6 @
Sprite::create()' _" X, m# G' l2 i
Sprite::createWithTexture()+ k! w& v) U! s6 p, u2 x8 {9 X
Sprite::createWithSpriteFrame()
! X. L# n/ b2 u0 q# h5 ^' bcocos2dx使用create函数来创建对象,create函数调用了new,init,autorelease等方法,对对象管理  t! G* j( {; h5 n4 F3 S' b. [4 j4 a1 z( O+ Y
1.3.2 精灵的属性2 j1 T2 n* g. f9 F  E
位置 Sprite::setPosition()
; r5 A% _; Q1 e+ f5 w( [: T锚点 Sprite::setAnchorPoint(); A# \  Q" k8 K% N/ o8 i% t& n( o
旋转 Sprite::setRotation()
8 p" L7 o( n) z+ f缩放 Sprite::setScale()
( p* Q+ g. {. Y8 @# ?& v颜色 Sprite::setColor()
1 i2 N5 t9 E$ P0 t, E- s& G可见 Sprite::setVisible(), b- V% Q4 R; B& |9 j2 z7 T- @& B
透明度 Sprite::setOpacity()
7 }& L2 G: b* t4 aX翻转Sprite::setFlippedX()1 W/ x% [+ y/ O* w# y
Y翻转 Sprite::setFlippedY()) t: A$ A* G% a# U( Y8 t- j
X扭曲 Sprite::setRotationSkewX()# S- W/ W! S" `6 q+ ~; \$ |
Y扭曲 Sprite::setRotationSkewY()
: W# V6 s7 L- G名字 Sprite::setName()
1 C7 O5 D8 z8 g标签 Sprite::setTag()# Y9 a. P% Z0 b- G
精灵帧 Sprite::setSpriteFrame()1 i5 W" _! A* M" N! O" F& a6 t9 `4 w
纹理 Sprite::setTexture()$ B, h8 i" z% a+ w
纹理矩形 Sprite::setTextureRect()# |$ q; w4 R9 r. @9 v) ?5 }
用户数据 Sprite::setUserData()
6 [- A- k- @4 l( f; T2 J6 \. r* m9 i用户对象 Sprite::setUserObject()
8 E3 ]1 k; |) Q0 u获取包含精灵的矩形 Sprite::getBoundingBox()/ F7 J% }5 ?8 e
ZOrder setLocalZOrder, setGlobalZOrder
& j% I& W$ c* _- d1 E% ^1.3.3 自定义精灵类(派生)
0 E' ~* H5 [9 C3 h5 ~为什么要派生精灵的子类?因为不同的精灵有不同的额外的属性和动作,从面向对象角度来说,额外的属性需要通过派生子类来加入。派生子类需要注意,在子类的init函数中,调用父类的init函数,Sprite提供了一些列init函数,供我们在子类中调用,我们可以选择一个合适的init函数使用。
* H( u3 N" ?& N0 C5 A: G初始化空精灵 Sprite::init()
2 I/ l0 P7 r# z  s1 O: a通过文件初始化精灵 Sprite::initWithFile()) u- C5 p3 P) g( G. w3 E  H
通过纹理初始化精灵 Sprite::initWithTexture()3 b/ Q9 I8 L( i
通过精灵帧初始化精灵 Sprite::initWithSpriteFrame()
3 v" c9 H4 Q; O* m1.3.4 纹理和精灵帧! Q% e; G/ ~, T1 a1 h
纹理: A8 \9 @/ i$ C+ f5 _5 O' n9 {4 Z4 i! A0 Z
对应的类叫做Texture2D,在2D的概念中,纹理其实就是指图片了。图片在加载到内存之后,做进一步的处理,将数据格式转换成适合opengl渲染的格式,这个格式的数据我们称之为纹理。' J. i* P' U$ Z; E6 z; l; J4 O  M- h' r& f+ N, G
加载纹理方法:Director::getInstance()->getTextureCache()->loadImage("test.png");( R6 P' c, f3 u7 s$ J' i8 P* g4 Z! ]* P1 P0 b: j6 j
精灵帧$ L! Z/ B+ }. [/ M; T6 B5 V# Y9 r- U, G" {" h* |5 D
对应的类叫做SpriteFrame,有时候一张大的纹理包括很多小图,我们只需要纹理的一部分来创建精灵,我们可以理解精灵帧是纹理的一部分。" Y' T9 R+ n& |7 r# |
SpriteFrame* frame = SpriteFrame::create(filename, rect);9 s% d1 H' H3 S, ^* J/ S% J' P
SPriteFrame* frame = SpriteFrame::createWithTexture(texture, rect);& c( u: m& \: `# g# x" }% B
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(plistFile). i5 s3 _% Y  e5 N) {6 b6 E# l. Q2 T, ^
通过plist文件加载一些列精灵帧,这个将来在缓存时细说; k" k* b, m' d- m$ p8 R2 X! p  h! j* O& n! @
1.4 坐标体系和锚点" a6 S) T4 k  |* n( G" [4 U1 P
要做到胸有成竹,必须要清楚坐标体系6 A) h! u( x4 W) @* @4 r/ e' B# v4 v8 W# `1 }* E' k4 B
1.4.1 坐标体系概念& y  |6 |3 e% Y6 ?+ T
cocos2dx坐标体系
2 D8 v" I  @. G% k$ U/ b5 t1 ^+ ^# v; O2 L+ ^8 Q& `$ v
游戏中使用的是cocos2dx坐标体系,也叫GL坐标体系" Q9 r3 D  h% k: S2 ^5 [
1.4.2 精灵的锚点
7 E# v* C: C$ U+ q& V5 WsetAnchorPoint6 _" Z9 o1 P+ e" \% v' _
调用精灵的setPosition时的对齐点
9 M' X2 q& l# K% C; `3 W/ B4 Z' `锚点范围为(0, 0) ~ (1, 1)) d, O+ k" @2 Y6 m2 r: y0 w4 @3 k
使用相对坐标,非绝对坐标! c/ V% Z0 ]# N& x) {& a
是setRotation的中心点
& r, N) ]  @# l2 E6 u) ?, D1.5 单点触摸处理4 l0 Q4 @/ ~, J7 v3 L
触摸处理是游戏控制的基础4 ?. i: v& Q6 |6 q, w; }' H: [1 \& K! I" P8 f
1.5.1 设置触摸监听2 g* B% o; C9 q# N9 D4 Z* r2 n
创建EventListenerTouchOneByOne对象: Z  x$ ]0 [( z
设置回调函数- {  i. [5 z. J6 C0 {' R. F& N2 o" A) _5 c
onTouchBegan
) b# I+ p3 t: P/ n* H+ o/ x返回值true表示该监听器接受并处理这次触摸,并且后续函数会得到调用,否则返回false7 G; V) Q+ W% P7 |7 U2 q3 m' e
onTouchMoved
4 N+ R$ H0 w: \* `触摸移动时被调用) i$ ^- k3 s) O' A
onTouchEnded; }' ~3 |2 ]; q
: F. I' m( _' Q, D& q/ o2 E触摸结束时(松手时)被调用4 q$ ?# [+ G" I3 U7 X, {/ K
onTouchCancelled0 B0 A2 M% c8 I8 P9 ]
取消触摸(比如来电导致游戏切入后台)时被调用! Y) h, _: d" J; ^* Q
将监听对象加入到事件分发器
4 C1 @8 n+ R' ]4 b; @. M_eventDispatcher
! u- m1 s: u& I, ~addEventListenerWithSceneGraphPriority
5 i" ~! d5 H' taddEventListenerWithFixedPriority) a( N4 T* n! x. D4 L5 x2 n8 r  D8 \7 }. X7 a" O1 O* x  B: U' H
将监听对象删除
, T% S; n3 \+ |+ N- \5 A0 m# ?3 OremoveEventListener
: L( K- q. ^4 F( v1 p: YremoveAllEventListeners2 S5 C0 Q1 L! E+ O1 u1 c- P, N8 T% ?3 {2 a& z
1.5.2 Touch对象
. t6 C3 k2 P! g/ e4 }- C1 Y每个触摸函数都有两个参数,Touch和Event,其中Event可以忽略,Touch对象中带着一些触摸信息需要我们了解
% N! P7 k; z+ A0 |) ?0 z3 _: E9 DTouch::getLocation- k- N4 R/ \% p/ E6 u  b6 F  m+ q
返回触摸当前坐标,该坐标是世界体系的坐标,不论监听的对象是精灵还是层,返回坐标都是世界坐标,该函数可以在began、moved、ended、cancelled函数中调用获取当前触摸的位置3 N' M; u5 m6 o9 l
Touch::getDelta% y; t4 f5 o  ?% n
# R2 X- F+ D7 ^7 ?* j返回触摸偏移量,该函数一般在moved中调用才有意义4 u% y! \9 q  U2 u6 I. p- v9 ~4 v6 M
Touch::getStartLocation9 ^- A2 q( V! S+ Q' e& j" b
返回触摸开始时位置,该函数在began时和getLocation一样,在moved和ended时,可以调用该函数返回当初触摸开始时位置# z' f+ k+ r0 z! _5 |( r3 e8 J0 H* c
1.5.3 lambada表达式和应用/ k7 y. m4 h+ }" s
Lambada表达式; w$ X8 k9 N& e1 P4 W
基本语法:4 d/ ?) N. X+ Q! V* t! a$ N& ]$ ~8 o5 N1 b& y
[capture list](parameter list)->return type{function body}
8 f0 p% F0 C1 b$ f0 W[capture list]和{function body}是必须的,其他是可选的
% ]) c3 M) h, @( Z, @" o捕获列表 capture list$ |6 ?  [  S4 f# N
3 [$ Z9 ]) s( h( X[] 不捕获+ N4 z& w  c, J1 w* a
[=] 捕获外部所有常量,以传值方式
1 a/ @" j; n! g0 X( [6 g. g" z% i# {[&] 捕获外部所有变量,以引用方式
, D4 y, Q* g( ?# M[&a, b] 以引用方式捕获a,以传值方式捕获b
! m- b2 Z7 f; T0 X2 \/ j6 A" g[&a, =] 以引用方式捕获a,其他变量传值捕获1 V% P3 L2 U. i
捕获列表一般使用[&],即可
( a* R% M! ]  I7 L5 z+ u$ n6 U6 j) o捕获列表可以捕获的参数范围为lambada表达式可见的变量,包括之前定义的局部变量,this指针,全局变量,但是捕获局部变量是一个危险的行为,因为lambada表达式被调用时,局部变量可能已经不存在了.0 ?* r: O* d7 R' f1 l
参数列表 parameter list" `! u8 ~% w/ O  ~
& |' p# j2 N. D. e& Z) i与普通参数列表相同6 K7 |1 r' V2 M/ u; C3 f7 [8 M+ X; S$ E4 ^6 ~: B
返回类型 return type; W0 O4 C; c4 b6 a- x) s  T' c3 K1 y$ J1 F: @  P1 A+ ~3 z
一般省略,lambada表达式的返回值代表了返回类型, `- W4 K9 X; n9 o8 I
代码块 function body0 I+ l" R* N& C, h6 H5 x3 e  ]5 ~
与普通函数代码块相同% _* n$ a8 a2 x  y/ _" o
; ^* H4 J3 o6 e, l  xLambada表达式是一个匿名函数,由捕获列表,参数列表和代码块组成。捕获列表的存在使得我们可以在定义函数时,给函数传递参数,使得函数定义和调用更加灵活。" k6 K9 m2 d# g5 X% ]7 Q% v4 ^) {3 F
使用lambada表达式作为触摸处理的回调函数! p& u% I' Z6 Q; d/ \) j" Y* [2 v: f+ E6 n; ]0 E4 B4 `# h  O$ r. F
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 练习:使用触摸移动精灵7 e0 W- F" T2 z: D) s0 h
创建精灵
" W9 Y; y& l, y8 ~- C$ g设置触摸1 h* A+ r" A+ u* X. c
在moved函数中,使用setPosition移动精灵
3 e4 P% N8 S: z) x' D1.6 定时器
: K  \0 R/ u/ Q2 `2 l& A" P% R定时器是自动控制(AI)的基础
: p4 l* _% A2 e1.6.1 帧定时器
* a2 K) A  C9 E. Y* S3 w4 HNode::scheduleUpdate0 w3 D3 S# e# v* K& ^- ^. V" ^# N9 U9 [7 P8 N( o) g
1.6.2 自定义定时器
4 K1 F7 u1 U" sNode::schedule' i9 y; `, i8 }8 O; H& F) `) ~% H7 a  M0 H8 k
1.6.3 定时器回调函数的参数9 c$ ]9 t6 y6 \+ w# E
void Node::update(float dt)- z. c% `, O7 Q; F7 Z8 m
; q; `3 f1 e+ P: Z$ p' s参数dt表示超时时间间隔,以秒为单位,一般这个值是有误差的,而且一般大于设定的值,比如设置超时时间为1秒,那么dt可能是1.000111秒" z1 ]3 q( B' U- P7 @
1.6.4 取消和干预定时器& l) r" X  m* r+ u7 f
节点释放时,它自动会取消该节点拥有的定时器。
. s7 m' O/ e  U, v4 Q节点未释放时,可以调用Node::unschedule取消某个定时器
4 W* T0 e- }; X" H7 \0 ^8 ~! {0 T0 P通过重新调用schedule可以改变定时器时间间隔$ z, D. ?- M$ N1 j* H) F/ @5 R' y" t3 G$ D1 x) i1 I& h
1.6.5 练习:通过定时器实现动画
; [6 O) j; F- F创建精灵& i/ I- w7 C2 B6 t8 g2 l
启动定时器
# J& z7 ]8 e$ C. U在定时器里切换精灵的精灵帧: \6 D1 j, \# r# @) H( [  \
setSpriteFrame
8 |0 ]9 \/ [" h1.6.6 练习:通过定时器实现精灵运动9 e9 S+ p4 W* F4 Y6 U7 W
创建精灵; c5 j4 V/ J2 h( S- e/ ^8 \& X- h
启动定时器: M0 y' I) j4 C8 Z2 ~0 H" i
在定时器里设置精灵的位置. c1 e9 y% W" q/ i& S6 }( c* V; [/ _
1.7 内存管理
" j5 k3 r3 r9 P- C3 G* J1 ^cocos使用了引用计数器自动管理内存,不理解它,等着程序跑飞吧
+ I* u* n/ [5 X, n3 E2 d1.7.1 Ref类, u  L, y! P3 t7 w% w( A
Ref类几乎是所有cocos类的父类,在2.2.3版本里,这个类叫做CCObject,该类有一个主要的功能,就是实现了对象的引用计数器/ Q0 A9 B6 E4 B2 R' {6 A
1.7.2 管理引用计数器9 r3 G- ]: V: ^8 J
构造函数:构造函数将引用计数器初始化为11 N5 @! U+ x$ I' a' y% z
retain:将计数器加1
4 l( ]8 B8 V* B9 irelease:将计数器减1,如果减去1之后等于0,则执行delete this,自己删除自己
- v3 l( J& A: f. V  R' ]1.7.3 静态的create方法5 T) E8 Z' F" S9 J5 e9 \. @
cocos采用静态的create函数来创建对象,在静态的create函数里,除了创建对象之外,还调用该对象的init函数来对对象进行初始化,最后调用了autorelease将该对象加入内存管理池,纳入自动管理。
% y" r+ ^4 N8 v4 ^" R, Fcocos的这种创建对象的方法,参考了ObjectC,从C++设计角度来说,这样创建对象也是合理的,构造函数负责数值初始化,而init负责逻辑初始化。& h2 W1 U6 ?$ q& O
9 `4 A, u* }/ G0 ]: c$ ]. W! `1.7.4 内存管理池) u: v! W* y+ J+ N" k8 Z
当对象调用autorelease时,它将自己加入内存管理池,该内存管理池会在一次帧循环结束时,调用池子里所有对象的release,这样如果对象在这个帧循环内,没有被其他对象引用的话,该对象会被自动销毁。8 Q7 v8 `3 {& s- P# j' b  i
如果该对象被别的对象引用了,那么别的对象要不再引用该对象时,要调用该对象的release函数。
! w3 n4 `8 f. m" s: o1 v大部分时候,我们只需要create对象,然后将它加入到父节点即可,Ref的release、retain、autorelease函数,其实是内部调用的。但是理解机制很重要,某些场合下,需要我们自己去release对象
- y, B$ V0 b3 T' y0 O1.8 数组容器Vector
1 \7 m0 j. U/ \4 m+ {9 k敌人很多,得拿个东西装起来: t; x8 P" s9 B# i  K" I
1.8.1 Vector
4 Z' v5 H$ ~& E( k4 ^; ?: CVector是cocos里定义的容器类,它只能将Ref或者Ref的子类对象加入到该数组中。+ t& G7 l& R+ c9 s
当一个Ref对象被加入到该数组时,Ref对象的引用计数器会自动增加1# M% b( g# S# x! {7 M
当Ref对象从数组中移除时,Ref对象的引用计数器会自动减少1
$ j- z# ]6 L; X$ i8 T% I数组访问
' o5 F: l, T1 s: B" ^  D增加对象 Vector::pushBack
5 m! z( Q1 ~3 L删除对象 Vector::erase, Vector::eraSEObject
6 X/ ]0 l. K" X# T1 l" c遍历对象7 ]1 \/ j4 Q$ V$ y# A& `7 I% D
! ~% q8 m. q5 k: p' i) u4 v+ y" N1.8.2 与std::vector的区别9 Y3 _. @1 I3 v' Q( Z1 C/ C2 q
std::vector是标准C++库提供的容器,它可以将任何类型数据加入到数组,但是它不会自动给元素增加引用计数器/ [- P! O/ h" x3 Q* T: Q& g- N+ U. `7 \/ J" P7 a
1.9 碰撞检测% I, f% F2 I3 T8 f6 J- ?- ]
战斗要打响了,麻烦也来了4 }; x6 {8 E& i6 ]8 {% q/ w9 \! Q5 M# {1 ^$ B, V6 O% C
1.9.1 矩形碰撞检测
; b% v' v- s8 ?, @2 b矩形和矩形:Rect::intersectsRect(Rect)0 l9 e0 }; p) g" q2 ?
矩形和圆:Rect::intersectsCircle(Vec2, float)
5 ?, ?+ ]1 S) D- u% h矩形和点:Rect::containsPoint(Vec2)4 N% W  c7 u& ]8 v# _
) T, y, [4 C9 {9 l# M. ~& D; |1.9.2 圆形碰撞检测+ }# A! w9 V" G$ y
转化为圆心距离是否超过两个圆半径之和
" _4 U2 j1 O4 P- r1.9.3 点与圆碰撞检测
6 L' q: V# v" s$ T5 F  o转化为圆心到点的距离是否小于半径1 x* J1 u4 M2 O: m+ `6 @: o& l4 e. q% l, q" K" x3 }
1.9.4 线段碰撞检测
; B0 p. `9 w8 ~5 _( ~ccpSegmentIntersect! K: P& |# ~2 m! F
8 [) K$ M0 T) k# \. I1.10 文本显示& D5 U- f4 D  f5 C) ~8 ?% E
在不显眼的角落,它们扮演着很重要的角色0 b* `* P5 H) F* ^+ ~6 k! v& U2 B/ j* ]$ p: h5 p1 W
1.10.1 systemFont4 D' C4 m1 G. S' a' f6 [: |
Label::createWithSystemFont()& _" N" y" [; Z! B
1.10.2 altas
$ E& L  _; Q  d; ULabel::createWithCharMap()1 `3 e+ W2 N5 b: r
5 }5 F' P6 }+ U. h0 S1.10.3 BMFont
+ ?: W3 r: r& L) L4 ~Label::createWithBMFont()9 j+ k( b2 `% t) Y# H0 i( k) [4 q. f, z0 b, A0 z
1.10.4 TTF(TrueTypeFont) Label9 j$ w! {, s8 q* n5 \* O1 Q) m+ w
Label::createWithTTF()
& X9 u' F! N! o( @# L& [3 Y1.10.5 Label的锚点也是Label文字的对齐方式1.11 菜单
: m# G0 e5 n0 J' h  f菜单,其实是触摸封装
  T  ]; @9 O! v& {1.11.1 菜单实现
$ C$ ?  r: c5 z! CMenu类和MenuItem类
" h- \; t9 H7 d3 [2 BMenu类,负责响应触摸,是Layer的派生类; c/ }3 l* `0 N  l
MenuItem类,负责展示菜单项目- K8 w! Q$ W# M$ T6 o6 P7 R5 U+ o% Q" Q' d! i0 S( l" S
为菜单项设置回调函数 MenuItem::setCallback
: E* O! G2 T6 J% G% y2 s自动排列菜单项 Menu::alignItemsVertically
' y9 V7 L" w0 w2 Z9 k) Q" [8 B4 u移动菜单项位置,菜单的坐标体系原点在屏幕中间+ w8 b3 {9 c" l! T$ C. i
8 i5 x$ {7 _+ p6 q6 w% Y1.11.2 菜单项介绍
0 p# P) B; ~& t* c5 TMenuItemFont
# X. y& [' R1 @MenuItemLabel
5 n3 p4 y& t, H  I" _6 U6 qMenuItemSprite
: P" ?( f' t7 h) d+ ]5 z* QMenuItemImage
0 N% G, w) b# _" NMenuItemToggle1 ^1 l1 }- g' o, D* v. K
; Y% c" T! F- \8 O7 C( z补充知识:设计分辨率,getFrameSize,getWinSize,getVisibleSize
! ~9 s! |' {, V- D* K, P' t  ~) v0 \1.12 场景切换" M# L% P0 J5 L
战斗结束了...) {. j% x1 q% l! d
7 u: B# I% g+ ~6 x+ U! z* P1.12.1 场景介绍% f: [2 S7 Y. t6 k9 Q
场景是独立的游戏逻辑% N/ m" H! q$ G6 ^  v
场景是导演调度单位, \; r: s5 z# j! [4 Q
场景是组织游戏元素的根节点/ b$ g" U) x2 i, @
显示在游戏界面上的元素,都是以场景为根节点的节点树的节点- J% U9 d: P* d
8 y* `- b# f, k7 P1.12.2 场景替换 replaceScene
, p& G: u& r0 \替换场景接口+ h* ?& f/ ~% `  h7 q- V+ F4 ?
Scene* scene = Scene::create();Director::getInstance()->replaceScene(scene);% r8 V" O/ v) N5 m( F
替换场景行为7 P; [; A& o5 T
删除原来活动的场景1 A# q4 F) {2 v
新场景为活动场景
% T  J/ ^6 e% Z6 g7 L& x1 k5 y! A1.12.3 场景入栈和出栈 pushScene8 G0 W5 z% R9 U& j
场景压栈6 B# _; H! W5 N
Scene* scene = Scene::create();Director::getInstance()->pushScene(scene);, D# Z) Q, R# h0 I5 N
场景压栈行为
" D6 J* z( s! \原来的活动场景保存在栈中* h: X, x8 t( g" Q1 A) V
新场景为活动场景& ^! G: W& g) b, x) Q# W
场景出栈! l- i0 ?( j- l: K" z6 b4 k. Y: {! ^: \
Director::getInstance()->popScene();' h$ c$ D& \+ V4 p1 [; R- s
场景出栈行为4 E8 U& z, g; I# L' }9 a& f0 f3 T# B9 d2 {* V
当前活动场景出栈并删除  k% N5 @& T9 ^8 O8 P
出栈之后当前栈定场景为活动场景4 d/ j$ g' v7 e  T: i7 P
1 @5 ^" X- S- a8 L1.12.4 总结
/ Y7 k& y- i+ a* k在cocos中,导演对象有一个场景栈来保存所有的场景,栈顶的场景为当前活动的场景,非栈顶的场景为暂停的场景。5 e6 X* Z5 ?& t# R4 a. Q# N9 G
runWithScene是第一次往栈中增加场景
& f5 A! m$ `" l; ?/ m2 YreplaceScene是替换栈顶的场景: V! ~8 q; t3 a8 J
pushScene是往栈中增加场景
. ~9 S* q7 Y( W. MpopScene是从栈中删除一个场景,如果popScene后,栈为空,也就是说pop最后一个场景后,程序将退出( ^$ H2 |# _4 w$ ~& r: h, E
在游戏中,慎用pushScene,因为会导致内存暴增,除非自己很清楚必须这样做。
' l$ Q7 W0 d! F& U8 m. i; N场景切换效果0 I- k, r& X6 r3 f( \5 E3 u
3 w9 v8 Q) K- T! c* @只有replace可以有切换效果6 {+ K: A6 ~- A: {
1.13 截取屏幕
  @9 z  ~6 P8 Y; f, F( G8 K拍照留念可以不: _: i7 _% _+ f8 w0 ~  L9 a3 F$ r+ q* M
1.13.1 使用RenderTexture抓屏' _9 K- r, M( g! i# k
流程# w3 o0 f* N1 g) v, t: U' O4 }9 P  g6 R  |
RenderTexture::begin
! p' T* Y  ?& l9 L# A6 `被抓取对象::visit
. @3 w( t) \  U! w; q/ FRenderTexture::end: {. p) l) {) N5 P1 c1 ^3 H2 c6 [3 P9 A" F& P/ G- ^0 H
1.13.2 使用utils::captureScreen抓屏
( N+ k( ~' [% g* O在3.2中引入
7 U0 b; G4 H. o+ }1.14 声音
/ C: W# R" q; ?6 \+ ?没声音,再好的戏也出不来6 H' j* s3 Y; ]( f4 j# `
1.14.1 cocos2dx跨平台音频引擎cocosdension( M' N7 x* }/ r+ B# I1 Z
cocos2dx的音频引擎为各个平台提供统一的接口. b+ N! M' E/ N5 c/ ^$ y# c
头文件 #include "SimpleAudioEngine.h"
3 p; ^, H  S* i2 |3 q需要使用命名空间 CocosDenshion5 M/ x8 _  o8 a& m2 x
1.14.2 背景音乐
& q+ J* t; f" k, q5 E$ k4 p播放背景音乐* x$ |' q8 y& f. X4 _$ I) m3 @9 ~& d+ n6 @% \# \. ~
循环播放  v, N; C7 S! {- b5 A6 X- [; \% f  p# w
停止背景音乐3 k" r6 B: C4 U, m% O& F
2 M7 E2 [! w$ j& c$ R9 ]  ?+ v- y1.14.3 音效0 V* y" L& ~8 @& P1 r' W" s
播放音效
6 O4 K. o6 A( R2 J5 n- F5 o4 T停止音效9 F/ b" E' ?! e9 G  O6 u
/ [: J5 l2 J3 O8 @  J, U1.14.4 干预2 f' M/ L  m. g+ s: c4 m
设置音量8 m0 q: O' u3 Z- o: Y
暂停. {% `$ p0 `+ {; \8 z/ c$ z
继续8 p% _0 F8 F! \+ Q" P4 C* J, z6 d' I
) v$ ?; V$ e- q) j1.14.5 提高效率:预加载音乐1.14.6 背景音乐的生命周期1.14.7 程序进入后台的处理
' q0 x" d4 P# n; _+ \* g补充:学习cppTest代码,从cppTest代码获得知识/ t: z- P& t+ I
1.15 实现飞机大战案例
! B. [# r$ G$ _9 J; e一切准备就绪,让我们来设计游戏吧6 M! i" k+ y* ~0 _# h
, _& K: i8 ^, l* |) t& {7 k1.15.1 设计目标
" ^, C6 F' \; g+ ^划分模块,简化模块逻辑,逐步实现; D# m1 P4 O* a5 t- F+ {2 ~
1.15.2 控制层实现4 ^+ L+ V) f3 R( D; I% m
英雄战机的移动控制
4 J& g. n  r) o发射子弹
: L' p, d9 B4 [: B0 Y0 L  k引爆炸弹( [) A5 C2 _2 @$ S" q* X% N5 Q4 F6 Z. M
1.15.3 AI层实现* \: y  q. Y) C
敌机产生
- S1 c' s! h, z敌机自动移动控制) G# M$ y  f2 [6 G
子弹自动移动控制
6 |. g/ k$ E' o' i8 z0 R炸弹道具产生7 ~8 s( H8 l$ I
1.15.4 碰撞检测# x0 p/ V. u& y# J3 R; J% \
敌机和子弹的碰撞检测0 Z/ L" V2 V, R% J- g
敌机和英雄战机的碰撞检测
回复 支持 反对

使用道具 举报

6

主题

0

好友

252

积分

赞助会员

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

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

使用道具 举报

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

本版积分规则

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