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

[复制链接]
itissue 发表于 2016-6-16 22:13:27 | 显示全部楼层
薛老师cocos2d游戏开发34天视频教程 薛老师cocos2d游戏开发34天视频教程 薛老师cocos2d游戏开发34天视频教程 薛老师cocos2d游戏开发34天视频教程

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

回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

taoyinyu 发表于 2016-6-17 00:43:46 | 显示全部楼层
薛老师cocos2d游戏开发34天视频教程
( h- k0 U/ M. n* J/ V- \薛老师cocos2d游戏开发34天视频教程: N8 C3 v3 g  o& n' ?3 V" Y' {
薛老师cocos2d游戏开发34天视频教程
- D! S( D' p  K薛老师cocos2d游戏开发34天视频教程
2 b% g% L& G3 i# Y  p: b1 [薛老师cocos2d游戏开发34天视频教程
回复 支持 反对

使用道具 举报

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

% \# X2 }, h! |+ C. O; E. E感谢楼主的无私分享!要想龙天论坛好 就靠你我他[STUDY]
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

% \9 q5 }1 o8 a0 b6 O. e感谢楼主的无私分享!要想龙天论坛好 就靠你我他[STUDY]
回复 支持 反对

使用道具 举报

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

使用道具 举报

重新做自己 发表于 2016-6-17 11:48:10 | 显示全部楼层
1.15.4 碰撞检测: g2 |% G* C9 t( \# l: f- C
敌机和子弹的碰撞检测/ r& Y$ \+ ]5 k6 }1 L
敌机和英雄战机的碰撞检测
& E7 j  B, S, K1.15.5 记分实现
( {+ r3 H% R) ?. i4 A- @' [创建Label
3 a7 k3 S3 j- E敌军飞机死掉时,给Label更新分数0 @$ b: E9 `: @$ }# s
1.15.6 实现游戏暂停% x! X3 v: V# f2 K; Q3 r
添加暂停按钮
8 J9 n) m9 I/ z4 g: v' t! T在暂停按钮的处理程序中: o) Q% S) D! p: C: o1 l" P5 a! M+ F8 N+ W# S
截取屏幕5 n: V0 b$ b9 E3 m) F6 ]2 d( F8 L
压入暂停场景" d/ k' x, V* N% q, t( ]. E+ ^) M7 v, B  c8 c! u' h) u
在暂停场景中- e3 l- o& i& a1 Z: |2 N/ S7 N' W4 |
将游戏截图显示在场景中3 \6 o7 j# P! @- u, z5 t
弹出继续游戏界面
. ~( f' V2 Z* O  f! w$ l7 Z) G1.15.7 进入分数场景
2 B9 R+ o; E$ I4 V切换场景,传递最高分到新场景
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

Colin225 发表于 2016-6-17 13:12:09 | 显示全部楼层
感谢楼主的无私分享!要想龙天论坛好 就靠你我他[STUDY]9 d3 v9 d0 s% c
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

; X$ C# r' z. J) `8 z; pcocos2d-x课程大纲(基础部分)I. 第一章 基础1.1 前言
& P7 r2 D  Y, o. i' K9 M. Q大概了解下cocos先- V" ?9 `/ R3 Q, a% ^, W
1.1.1 cocos2d-x介绍
( V% Y* k4 d* W; o1 b4 @cocos2d-x是一个手机游戏开发引擎,使用C++开发,可以很方便的移植到各个平台,目前cocos2d-x支持Android,IOS,windows,mac,linux等系统。
; t9 F/ N! j$ z" l) f( B; y* g早先由阿根廷人开发Python版本,后来苹果手机流行之后,阿根廷人又用OC改写了cocos2d,并称之为cocos2d-iphone。+ j2 E( v; p2 r9 {! X
后来由国人将cocos2d-iphone用C++改写,并称之为cocos2d-x,这样使用cocos2d-x开发的游戏很容易被移植到各个平台。# }* R# C0 x7 ~3 N( B1 E
0 X- }1 K8 K; a$ G' d" \& J2 Z+ f& D% x. b) _7 t2 V, |0 f* L: L. @
cocos2d-x框架图7 c3 X- U; c7 ?& B" Z% W" U" F+ o5 T6 u! h/ D- u+ o
/ i+ m- t$ f6 R& y; O
1.1.2 基础阶段学习目标和作品演示1 X0 V( d, z* E! M* }3 }3 m: Z
了解cocos2dx
2 ?0 c+ Q' n4 D" F- w8 L实现飞机大战7 K; J$ l+ e) z6 V/ o" m  ]/ w" m: c; ~$ ?( v# B
1.1.3 环境搭建- w9 L  b" ~, S7 w' [6 i5 F% ^% b- @  r
安装python2.7和配置python路径  e! M* `9 p6 R. p# X
安装vs2013* h; Q' N1 f& @  r/ H
解压cocos2dx到某目录,比如d:\cocos\cocos2d-x
! l+ P! i5 m9 ^' P命令行进入cocos2d-x目录,执行setup.py, H9 r& ~3 Z- [0 o8 J% x
1.1.4 介绍cocos2dx开发包目录) j' h# G+ b0 j4 _8 v
build 工程目录
4 n/ I7 _; p" y7 l5 Q  ecmake makefile目录
1 k! Q" o6 l4 I9 R. pcocos cocos2dx核心源代码目录
# b. ?- m" I, s- I* Z+ [+ {docs 文档目录: C  R- U" g4 l6 H- T8 S) @
extensions 拓展代码目录,主要是GUI部分
& v& y" j/ C' D+ }1 O' n* lexternal 外部开源库
* X' y8 {. S2 j0 |# H  ilicenses 外部开源库licenses
( ^7 D% v" O( Y  J5 jplugin 插件# }: `6 b) j# q* w6 Y! t
templates 创建工程模板,创建工程使用的模板工程$ R2 [/ d5 s. y/ X; `
tests 测试项目cpp-test代码在这里
! c  t6 l2 P4 m$ R- g- T. Ltools 工具,创建工程的脚本就在这里
* R7 q5 `5 X6 {( n0 _+ b8 V1.2 第一个工程1 R1 @% Q: B5 I0 @. P/ x1 v9 E
万丈高楼平地起( C  p7 K4 Z. l' o0 F9 T( a* u9 H3 u7 }
1.2.1 创建工程
$ k, Q1 ?" h/ U& Z, ccocos new ProjectName -l cpp# b/ r  Q6 y( z$ C! R6 Q6 {
5 U( p, \& d9 m/ V& H在当前目录下创建一个工程名字为ProjectName
4 F: F+ ]; P+ h# d3 q% tcocos new ProjectName -l cpp -d d:\cocos4 s7 x$ s9 p# A9 b7 f8 Y' Z
在d:\cocos目录下创建一个名字为ProjectName的工程
  b1 O: R# g: I. }( k) G  C: Ncocos new ProjectName -l cpp -d d:\cocos -p com.Orgnization.ProjectName
/ E$ h  P. ~" F0 ^3 O在d:\cocos目录下创建一个工程名为ProjectName,包名为com.Orgnization.ProjectName的工程
: E: g' u1 f5 Q9 R8 Hcocos new
) n0 B. J: o, q查看cocos new命令的帮助/ O# l( \0 ^' f# j
使用vs2013打开工程目录中的解决方案文件,对第一个工程进行编译和运行& a$ r  C4 M9 d+ d8 G; M
1.2.2 介绍工程目录
* \1 k( C- H& ]4 {. DClasses 跨平台游戏逻辑代码
# O9 v3 K* m; |4 i$ L6 icocos2d cocos引擎代码
: a$ M- l$ j3 q) }3 Z& l" z0 C7 zproj.xxxx 平台相关的代码和工程文件
( R5 r2 Y7 N' ?, \+ fResources 资源文件(图片、声音、脚本)7 Y, ]) `: [6 A) [* @% |2 ?5 y) [; b0 S+ M9 w/ H* C  M6 G2 k' [
1.2.3 介绍详细代码2 V7 z, `0 K$ a
程序入口和AppDelegate, K5 _7 u" `+ l$ @) i3 ^+ P6 k' N# q: i3 X% v( i$ {# y
main函数通过虚函数调用到AppDelegate::applicationDidFinishLaunching/ I4 C' f/ Q1 A, e
AppDelegate::applicationDidFinishLaunching()6 I3 e2 ?4 S, C) b6 D% l
这个是真正的入口函数,负责游戏的初始化,包括创建第一个场景9 x& O8 }, \' F
HelloWorld::init(); U8 B* r, t" d- h: @: k6 ]  j  o+ z" J
场景层的初始化,负责显示场景的信息
" P$ \. j& m8 N: PHelloWorld::menuCloseCallback(Ref*)
# l" P4 ?- b$ s9 h' _7 U退出菜单的回调函数,负责程序退出
! n( q; \* U( e头文件和命名空间' i  ]& s2 |; U/ t1 x
cocos引擎定义cocos2d.h头文件中,并且使用了命名空间cocos2d,因此我们写的程序都应该包含cocos2d头文件,并且需要使用cocos2d命名空间,
. I7 t. w) s, o1 p' v: c#include "cocos2d.h"USING_NS_CC;// #define USING_NS_CC using namespace cocos2d6 p* c2 _( b* d
e USING_NS_CC using namespace cocos2d$ l& i6 ^4 Y2 d- \
初始化的调用过程( e& {# Z9 H) e2 y& {: [. L' ?
1.2.4 cocos设计理念
- s% I& N6 v1 S( R: W9 ]: fcocos2dx的设计者将游戏划分为一个个片段组成:每个片段由Scene负责组织;片段内部的模块划分由Layer负责组织;Scene和Layer虽然是游戏组织的一部分,但是它们一般并不可见、可见的部分如英雄、怪物、道具由精灵负责抽象。" N5 r' B* p* [, F' ~. s1 }6 P: T. _+ K) g, O0 V: Q' Y
Director负责推动游戏进程的发展,切换场景是由导演来负责的+ m2 c' a, F1 K+ o; ^1 G
' y4 s$ ~2 k" y) k' K, ]9 k
1.3 精灵) T5 c5 c* ~7 o+ \8 ^
Sprite,游戏的灵魂! d2 N; B4 ]0 ~/ Z' d  w
2 J3 h% ?5 P: P) L  {8 q( J3 o3 L$ I1.3.1 精灵的创建  t+ S1 K7 T% r# V: {
精灵可以通过图片、纹理或者精灵帧作为参数来创建% N( o) \% G7 r9 l  ~7 U4 o/ \6 O8 |7 v; `  q& H, J* L: a9 [5 ^
Sprite::create()
# g! T0 g8 i/ k" Y6 dSprite::createWithTexture()
: s9 f  g9 G0 F2 ?1 f! D: {Sprite::createWithSpriteFrame()
+ t* F+ R( ~$ y# I  K1 ~: zcocos2dx使用create函数来创建对象,create函数调用了new,init,autorelease等方法,对对象管理  t! G* j( {; h5 n4 F3 S' b
2 x8 t( g6 ^, c1.3.2 精灵的属性
; b% X; H* c8 X位置 Sprite::setPosition()9 R( W6 _) v7 @2 y& s+ `
锚点 Sprite::setAnchorPoint()% {' G! g" M! N; U4 t, w
旋转 Sprite::setRotation()
: r( S' n: ?5 l3 A/ L  w# w缩放 Sprite::setScale()
9 m2 X: w1 Q- p& I& d3 j& \颜色 Sprite::setColor()$ ]% a  Z. G/ U" ^! H9 S
可见 Sprite::setVisible()* f9 T- _0 q2 y8 q1 D
透明度 Sprite::setOpacity()
8 m2 {$ \# `. u( FX翻转Sprite::setFlippedX()
2 a2 j1 F( r- D" M( p3 lY翻转 Sprite::setFlippedY()# |; N8 Z$ e( Z( X
X扭曲 Sprite::setRotationSkewX()
: p& M4 [) w$ ^+ i( g; AY扭曲 Sprite::setRotationSkewY()
/ v4 F. C% L3 A1 e( r名字 Sprite::setName()
) B7 J* {& C$ G0 l标签 Sprite::setTag()
7 D+ P# u% P9 f/ d9 H/ K精灵帧 Sprite::setSpriteFrame()
/ G) P# B1 B$ w/ X$ q8 [+ g纹理 Sprite::setTexture()
/ u' ~7 }! h+ G纹理矩形 Sprite::setTextureRect(), u- H- ]0 K) _3 E+ h
用户数据 Sprite::setUserData(); K& l" {- T& i2 Q7 F8 U; e$ s
用户对象 Sprite::setUserObject()7 t, y2 g$ b- N5 V
获取包含精灵的矩形 Sprite::getBoundingBox()2 s: t3 c! Z; b# P9 C
ZOrder setLocalZOrder, setGlobalZOrder& V. |7 a# O1 `7 ^$ Q
1.3.3 自定义精灵类(派生)* y! g3 F& G2 W
为什么要派生精灵的子类?因为不同的精灵有不同的额外的属性和动作,从面向对象角度来说,额外的属性需要通过派生子类来加入。派生子类需要注意,在子类的init函数中,调用父类的init函数,Sprite提供了一些列init函数,供我们在子类中调用,我们可以选择一个合适的init函数使用。+ }" h* {3 C( O2 u
初始化空精灵 Sprite::init()
2 w. f: n% w( U. e. C0 ^' `' I' R通过文件初始化精灵 Sprite::initWithFile()  N4 W: j! t+ W0 v* V* t4 v) S* A4 u
通过纹理初始化精灵 Sprite::initWithTexture()) D8 C# V+ r7 K( ]2 y; @4 a
通过精灵帧初始化精灵 Sprite::initWithSpriteFrame()
  ~) ]$ [3 I3 h6 n0 ?& C1.3.4 纹理和精灵帧
! a- E: g7 H9 e纹理: A8 \9 @/ i$ C+ f
; ]0 c6 I# @% S# ?# I* ?3 ?对应的类叫做Texture2D,在2D的概念中,纹理其实就是指图片了。图片在加载到内存之后,做进一步的处理,将数据格式转换成适合opengl渲染的格式,这个格式的数据我们称之为纹理。' J. i* P' U$ Z9 N- S& h& x" l, x3 |
加载纹理方法:Director::getInstance()->getTextureCache()->loadImage("test.png");( R6 P' c, f3 u7 s$ J' i8 P* g4 Z
! g& O7 B' D! W4 P精灵帧$ L! Z/ B+ }. [/ M; T6 B' \8 [7 ]6 C9 o! ~
对应的类叫做SpriteFrame,有时候一张大的纹理包括很多小图,我们只需要纹理的一部分来创建精灵,我们可以理解精灵帧是纹理的一部分。
# W- m  D. p. i5 B. [! GSpriteFrame* frame = SpriteFrame::create(filename, rect);+ j4 V2 d# t. I6 [9 i  W
SPriteFrame* frame = SpriteFrame::createWithTexture(texture, rect);. e& m( \% g( y: ?
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(plistFile). i5 s3 _% Y  e5 N) {
/ ?! |6 J' c4 ]* t/ L通过plist文件加载一些列精灵帧,这个将来在缓存时细说; k" k* b, m' d- m$ p8 R# M# \' d! {  ]/ B0 X8 A
1.4 坐标体系和锚点
, b; {6 G- y* N要做到胸有成竹,必须要清楚坐标体系6 A) h! u( x4 W) @* @4 r
% L' e( d* X2 ?5 u1.4.1 坐标体系概念
$ A& c. B. R+ u0 u: }) O7 \  ^8 dcocos2dx坐标体系
  t1 N8 h4 J4 @; p( \/ b5 t1 ^+ ^# v; O# z' p2 x0 e" ~0 L" J
游戏中使用的是cocos2dx坐标体系,也叫GL坐标体系: J  x0 P( ?8 z  ]  L1 r) r* M* G
1.4.2 精灵的锚点
2 v! b9 m0 ]- J; ]setAnchorPoint8 l2 K% F1 i9 L
调用精灵的setPosition时的对齐点/ F. A/ L/ T8 ^' y: m3 D! d3 t& C
锚点范围为(0, 0) ~ (1, 1)- u! ~4 h  k( g5 J. z1 z) k
使用相对坐标,非绝对坐标
% A" w* o- @% s7 j是setRotation的中心点3 B# t8 w1 Y; O3 {; b' D* x, G! q
1.5 单点触摸处理9 M7 a: ]' t# C. F
触摸处理是游戏控制的基础4 ?. i: v& Q6 |6 q, w; }
! d1 `8 k: f: o2 p, U, s: S* `7 Q1.5.1 设置触摸监听9 |+ e1 s/ d1 w7 G1 X
创建EventListenerTouchOneByOne对象
  ]  W: H; z+ C! F5 x' P) z设置回调函数- {  i. [5 z. J6 C, W) R$ y4 \$ f4 y, w& z; K
onTouchBegan
8 K9 ~2 g) s; r( G) p: F返回值true表示该监听器接受并处理这次触摸,并且后续函数会得到调用,否则返回false$ K! N: X* l% ?% F+ j9 P
onTouchMoved" G" {) m7 [7 o/ s( D
触摸移动时被调用, o: `$ O8 X" x) s3 D/ T
onTouchEnded; }' ~3 |2 ]; q
* ^  g4 y3 a: J9 M" f# _触摸结束时(松手时)被调用
* |- \7 g4 `. y; yonTouchCancelled
  g$ n* ?2 i6 r! ^2 q取消触摸(比如来电导致游戏切入后台)时被调用
  q1 j0 K& n8 q6 f6 [$ ~将监听对象加入到事件分发器: }0 h1 ~7 g# C+ b
_eventDispatcher
8 E7 F( b  L9 `; Z% V6 jaddEventListenerWithSceneGraphPriority; S# Y; c4 G. ?0 T$ t0 v$ c& H
addEventListenerWithFixedPriority) a( N4 T* n! x. D4 L5 x2 n8 r  D8 \
  p" [4 R4 L7 h' j/ e3 A( [将监听对象删除3 m1 t0 R0 v: Y1 Y; y$ P
removeEventListener" g+ A  `1 P1 S
removeAllEventListeners2 S5 C0 Q1 L! E+ O1 u
* |1 D; X7 m/ Z# o/ v; U' J1.5.2 Touch对象
+ }2 `9 ]0 g9 Z* V; u/ R* u( b每个触摸函数都有两个参数,Touch和Event,其中Event可以忽略,Touch对象中带着一些触摸信息需要我们了解6 w" _% H: y" A/ i1 ~! `4 V
Touch::getLocation
6 Z; t* J4 d5 h0 j返回触摸当前坐标,该坐标是世界体系的坐标,不论监听的对象是精灵还是层,返回坐标都是世界坐标,该函数可以在began、moved、ended、cancelled函数中调用获取当前触摸的位置
- E" v, i' _  ?  n9 P9 f5 hTouch::getDelta% y; t4 f5 o  ?% n& h1 [" s1 ^2 c8 p
返回触摸偏移量,该函数一般在moved中调用才有意义# ]& {3 k2 a$ @# N8 u
Touch::getStartLocation
* F. l& F$ c) B4 P/ m% x1 O; }+ g. T返回触摸开始时位置,该函数在began时和getLocation一样,在moved和ended时,可以调用该函数返回当初触摸开始时位置# z' f+ k+ r0 z! _8 T2 Y. v+ b  _# `
1.5.3 lambada表达式和应用
' y5 C9 Z( ~7 \  o$ BLambada表达式$ v* u9 n& n! k
基本语法:4 d/ ?) N. X+ Q! V* t! a$ N& ]0 F4 C8 P3 y) e; f4 H8 W4 d& P
[capture list](parameter list)->return type{function body}# s0 u) ~5 R6 }3 |0 S
[capture list]和{function body}是必须的,其他是可选的" e( V  k5 ?& e6 G% v3 w
捕获列表 capture list$ |6 ?  [  S4 f# N& _8 d# W+ y6 S* x! n
[] 不捕获
% k: v! @+ B5 x[=] 捕获外部所有常量,以传值方式8 ^2 d/ }. h2 r1 c1 ?
[&] 捕获外部所有变量,以引用方式1 [* x4 B/ y# f9 m
[&a, b] 以引用方式捕获a,以传值方式捕获b% U$ e; S% l- Y6 ~
[&a, =] 以引用方式捕获a,其他变量传值捕获
( b4 Z) C& J  K  z  [$ `捕获列表一般使用[&],即可
  ~& ]3 \& N( U' D- Y- P% @6 h捕获列表可以捕获的参数范围为lambada表达式可见的变量,包括之前定义的局部变量,this指针,全局变量,但是捕获局部变量是一个危险的行为,因为lambada表达式被调用时,局部变量可能已经不存在了.
1 d9 G, @( E3 v& i参数列表 parameter list" `! u8 ~% w/ O  ~+ s, K( R: v, a* |6 U
与普通参数列表相同6 K7 |1 r' V2 M/ u; C3 f& g5 L- L8 j5 f% j1 Q6 l' R
返回类型 return type; W0 O4 C; c4 b6 a- x) s  T' c
5 m, S1 t7 [1 i! K. N" O  @1 E一般省略,lambada表达式的返回值代表了返回类型8 Q, ?) p7 f6 d) O6 x! Q0 f  K; t
代码块 function body6 c4 |) i( n' T- `* |1 d
与普通函数代码块相同% _* n$ a8 a2 x  y/ _" o. T2 Z; K. Z0 c' O3 f
Lambada表达式是一个匿名函数,由捕获列表,参数列表和代码块组成。捕获列表的存在使得我们可以在定义函数时,给函数传递参数,使得函数定义和调用更加灵活。" k6 K9 m2 d# g5 X
8 i7 F4 u: i5 i/ ~. O" q. D* _使用lambada表达式作为触摸处理的回调函数! p& u% I' Z6 Q; d/ \) j" Y* [2 v: f
9 q' l% C7 [( L  Q4 Y  K2 I+ IEventListenerTouchOneByOne* 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 练习:使用触摸移动精灵5 N1 G0 X+ h4 S" e# L. Z
创建精灵
  Y5 J7 w7 j) t/ q8 w. Z! V5 r设置触摸
. d8 t+ b: J: K  _, O在moved函数中,使用setPosition移动精灵
, \1 B1 f# w" b6 D1.6 定时器
6 i% \  n7 T3 [& C& i定时器是自动控制(AI)的基础
& j( W* H2 a) ]. }, `( S3 B1.6.1 帧定时器& O( [# u$ W5 c
Node::scheduleUpdate0 w3 D3 S# e# v* K& ^- ^. V0 t0 K; R5 Y! ^6 T' q
1.6.2 自定义定时器
: a1 [  U" ?# K8 `+ Y" N1 c! u1 ~: H8 [: RNode::schedule' i9 y; `, i8 }8 O; H& F
3 S' Y! Y% k- w* N2 U1.6.3 定时器回调函数的参数
3 c) z, }" ^" T2 C% w( q, wvoid Node::update(float dt)- z. c% `, O7 Q; F7 Z8 m
. o+ S" b9 D4 v参数dt表示超时时间间隔,以秒为单位,一般这个值是有误差的,而且一般大于设定的值,比如设置超时时间为1秒,那么dt可能是1.000111秒
/ Y0 |& L+ b( C) A6 ]1.6.4 取消和干预定时器8 Z; @5 _0 l) V$ }9 A
节点释放时,它自动会取消该节点拥有的定时器。
! S$ j! R/ F, y" ^% K) a8 ^; d节点未释放时,可以调用Node::unschedule取消某个定时器2 w3 w; S# y9 _- S. O- i
通过重新调用schedule可以改变定时器时间间隔$ z, D. ?- M$ N1 j* H) F$ K. v+ n: P( \, v- D* Q3 \/ @
1.6.5 练习:通过定时器实现动画; [, L% r+ V5 w3 ]* X% }3 `! P
创建精灵
: y" R- V! q  f1 q" I启动定时器9 L- |, s+ U; Y2 [
在定时器里切换精灵的精灵帧
- u1 F4 Z& U" `5 G6 esetSpriteFrame2 j: ?( G9 G/ l' L  m
1.6.6 练习:通过定时器实现精灵运动5 ^0 o3 a3 ~& N' F
创建精灵
  s8 J1 S% c! l% N启动定时器* n$ \6 i/ r  F, C  m
在定时器里设置精灵的位置5 ?- o! }1 Q" o
1.7 内存管理# S6 @/ G3 L- I; h* ?
cocos使用了引用计数器自动管理内存,不理解它,等着程序跑飞吧
$ q$ K: w* ]! F5 U: W5 w0 t1.7.1 Ref类" K: H9 A& n* o9 }) f6 y5 E4 m
Ref类几乎是所有cocos类的父类,在2.2.3版本里,这个类叫做CCObject,该类有一个主要的功能,就是实现了对象的引用计数器, d( W2 b; F7 ~! O0 a
1.7.2 管理引用计数器
: [7 R- b; Q' i: t9 g( ?构造函数:构造函数将引用计数器初始化为18 `9 _9 S7 j2 _: A" M3 V
retain:将计数器加1
/ {. s, @( @  A  a8 Z+ Mrelease:将计数器减1,如果减去1之后等于0,则执行delete this,自己删除自己. s# E7 c6 ]' S: ?" K
1.7.3 静态的create方法
9 e6 l; @1 |  {( d) w: scocos采用静态的create函数来创建对象,在静态的create函数里,除了创建对象之外,还调用该对象的init函数来对对象进行初始化,最后调用了autorelease将该对象加入内存管理池,纳入自动管理。% k, [5 |7 a/ V4 @: g: \
cocos的这种创建对象的方法,参考了ObjectC,从C++设计角度来说,这样创建对象也是合理的,构造函数负责数值初始化,而init负责逻辑初始化。& h2 W1 U6 ?$ q& O
5 C4 g6 U3 ]! e; I8 v4 f; y4 C1.7.4 内存管理池' b* f( y0 d5 ^, {
当对象调用autorelease时,它将自己加入内存管理池,该内存管理池会在一次帧循环结束时,调用池子里所有对象的release,这样如果对象在这个帧循环内,没有被其他对象引用的话,该对象会被自动销毁。
7 F& i* E. ]( Z如果该对象被别的对象引用了,那么别的对象要不再引用该对象时,要调用该对象的release函数。
3 [/ J" L, N( C+ J3 t大部分时候,我们只需要create对象,然后将它加入到父节点即可,Ref的release、retain、autorelease函数,其实是内部调用的。但是理解机制很重要,某些场合下,需要我们自己去release对象% B/ W/ G" y' ?2 v# {  C5 }
1.8 数组容器Vector
4 c! \5 L& e2 y- g! R敌人很多,得拿个东西装起来
. a3 ~- r! p* m# M1.8.1 Vector, ?- H9 {6 g% F; O& ?
Vector是cocos里定义的容器类,它只能将Ref或者Ref的子类对象加入到该数组中。
1 q  }% r( N  ^% O7 D当一个Ref对象被加入到该数组时,Ref对象的引用计数器会自动增加1
, j7 Y$ W* R3 l! ^当Ref对象从数组中移除时,Ref对象的引用计数器会自动减少1
6 H& L; }- n' [数组访问
. W& w1 M" s* m增加对象 Vector::pushBack* M! j; v# l3 a
删除对象 Vector::erase, Vector::eraSEObject
- _7 v+ `/ ^/ v: b; z6 g遍历对象7 ]1 \/ j4 Q$ V$ y# A& `7 I% D
: _9 c2 D- A( B( x( C2 S1.8.2 与std::vector的区别: b; j8 @5 X6 i
std::vector是标准C++库提供的容器,它可以将任何类型数据加入到数组,但是它不会自动给元素增加引用计数器/ [- P! O/ h" x3 Q: p8 ~0 N# b7 J( y9 T* w1 I. Z
1.9 碰撞检测0 g# l+ ^2 w+ z# ^! S
战斗要打响了,麻烦也来了4 }; x6 {8 E& i6 ]8 {2 D8 g) R) I! \' L/ Y
1.9.1 矩形碰撞检测" ~6 t2 r5 u, g8 |! t7 K8 m& u
矩形和矩形:Rect::intersectsRect(Rect)
& Z3 P$ Q7 {2 \1 X矩形和圆:Rect::intersectsCircle(Vec2, float)
3 x  p0 B. g# U9 j7 Q矩形和点:Rect::containsPoint(Vec2)4 N% W  c7 u& ]8 v# _, N: c8 X* i. u, U8 j0 z% E& L
1.9.2 圆形碰撞检测
% ~( g, p3 [4 N" f" d% Q5 e0 ]6 |转化为圆心距离是否超过两个圆半径之和
4 `' {0 I8 g. I  r1.9.3 点与圆碰撞检测. A8 |( I3 \* |& ^- k% f. D
转化为圆心到点的距离是否小于半径1 x* J1 u4 M2 O: m+ `
, ?& R( v6 O/ z1.9.4 线段碰撞检测6 A0 V' k. M# _% e& _& i2 w
ccpSegmentIntersect! K: P& |# ~2 m! F( g8 g- V0 X3 o! m
1.10 文本显示7 i6 A4 W/ |" W# C; g% l: o, u
在不显眼的角落,它们扮演着很重要的角色0 b* `* P5 H) F* ^+ ~* I+ F0 S8 J+ a" h
1.10.1 systemFont
/ t1 c' c- r" x4 U  eLabel::createWithSystemFont()7 ^' `, [5 ]" K- }" D* g1 R5 O
1.10.2 altas) I" U- ^% ~9 A9 ]
Label::createWithCharMap()1 `3 e+ W2 N5 b: r
6 t9 G1 F' o: q1.10.3 BMFont: U! {- E/ K  z  z0 N
Label::createWithBMFont()9 j+ k( b2 `% t( a. n: [; k( U* G, r
1.10.4 TTF(TrueTypeFont) Label0 ~" {8 I$ o" t, v% p, @3 D( e
Label::createWithTTF()
* D+ e3 W6 m4 o( S' M. p3 [7 S5 y1.10.5 Label的锚点也是Label文字的对齐方式1.11 菜单& k1 H, I  _; k3 c
菜单,其实是触摸封装1 o1 K( @. q' Z1 D/ \8 m0 f
1.11.1 菜单实现6 q8 l% s: s( T% W  r
Menu类和MenuItem类
$ s1 Y; d+ p* CMenu类,负责响应触摸,是Layer的派生类6 z  j) V- z( b" N: _7 Z* {) ]
MenuItem类,负责展示菜单项目- K8 w! Q$ W# M$ T6 o6 P7 R
5 a1 o% ~; D  _为菜单项设置回调函数 MenuItem::setCallback
# y& k. F6 o. {自动排列菜单项 Menu::alignItemsVertically
. x8 f1 y$ Z  C" k' Q移动菜单项位置,菜单的坐标体系原点在屏幕中间+ w8 b3 {9 c" l! T$ C. i
& j2 ^: I2 g  }  j4 Z1.11.2 菜单项介绍
. J7 c) {/ p4 C9 u' j1 jMenuItemFont* h9 ^! c& r0 C6 I( w5 _
MenuItemLabel
% Z( R5 m3 D3 DMenuItemSprite5 Z$ h' o! {2 _% m. c( g+ ^9 g* z& |
MenuItemImage  _5 a' [: G1 W* E
MenuItemToggle1 ^1 l1 }- g' o, D* v. K
! u# K. ?4 O) [1 j/ d补充知识:设计分辨率,getFrameSize,getWinSize,getVisibleSize
- L0 Y/ ^4 O: J  J* ]+ w2 T5 X1 _  m1.12 场景切换
  g. g( v& _2 f1 F1 I9 [/ H战斗结束了...) {. j% x1 q% l! d5 `0 G8 B7 h9 J- s9 w$ @! h7 B
1.12.1 场景介绍9 o+ G# I9 y+ M% W' E4 G! ?5 J
场景是独立的游戏逻辑6 G$ @" `. N8 X0 ?0 C* T, h, @
场景是导演调度单位  k) ?/ j( Z1 }; L. O9 M; Y
场景是组织游戏元素的根节点6 n6 E9 r: l$ L
显示在游戏界面上的元素,都是以场景为根节点的节点树的节点- J% U9 d: P* d* N: T0 ?. B6 J1 L
1.12.2 场景替换 replaceScene: B& r# C. ?6 z: G
替换场景接口! X8 }) a0 v2 |( Y7 M% ~
Scene* scene = Scene::create();Director::getInstance()->replaceScene(scene);8 _, R6 ]3 v4 H' O6 i* d
替换场景行为) H1 b+ q4 |4 I+ N- B) i3 }7 v
删除原来活动的场景5 s1 k7 |. J5 i5 z; ?2 X& H1 V
新场景为活动场景
1 U% E0 z. E# u, ^% M1.12.3 场景入栈和出栈 pushScene& W5 H, e5 Q! s7 K, A1 z
场景压栈! n7 n+ d9 U4 i
Scene* scene = Scene::create();Director::getInstance()->pushScene(scene);
0 Z8 U* F2 Y: T; B8 g  p# m场景压栈行为
# ]1 a% F* y' a1 O; z: ]原来的活动场景保存在栈中
7 G& G: u  d. ?! d+ `( X新场景为活动场景+ Q4 v+ z+ c, n7 \& B  t* v6 W* m# f
场景出栈! l- i0 ?( j- l: J$ \  F- k4 k* k5 M
Director::getInstance()->popScene();/ ?) Q- Q. _+ l! A
场景出栈行为4 E8 U& z, g; I# L' }+ R; k! l8 b( e1 Y: N6 m
当前活动场景出栈并删除& {& r2 f) d& _
出栈之后当前栈定场景为活动场景4 d/ j$ g' v7 e  T: i7 P7 n  l7 P7 X4 d- s2 B3 e7 _- ]" \
1.12.4 总结: V: `& u# ]0 q; g. H5 Y! n
在cocos中,导演对象有一个场景栈来保存所有的场景,栈顶的场景为当前活动的场景,非栈顶的场景为暂停的场景。4 [. U7 [8 G, k$ G) o$ b
runWithScene是第一次往栈中增加场景, Q1 F8 q+ l" o: }9 i- o
replaceScene是替换栈顶的场景& L% @0 n! v" T/ \0 ]
pushScene是往栈中增加场景8 m+ q: n5 Q' x/ F  y! F- k" P0 y
popScene是从栈中删除一个场景,如果popScene后,栈为空,也就是说pop最后一个场景后,程序将退出3 Y& i" G6 n  Z7 d* g$ }
在游戏中,慎用pushScene,因为会导致内存暴增,除非自己很清楚必须这样做。
. p7 F  y, w& O; y5 O: x* |4 ~: ?; [场景切换效果0 I- k, r& X6 r3 f( \5 E3 u5 u% G1 ^: c5 l  B
只有replace可以有切换效果
4 m9 ~4 A& B8 P1 w6 F' y2 o1.13 截取屏幕
7 I2 T' x7 P, g) t" d) F# O拍照留念可以不: _: i7 _% _+ f8 w0 ~$ a5 F1 J7 k7 c1 H8 X
1.13.1 使用RenderTexture抓屏
" }" s0 H! C. J8 ^流程# w3 o0 f* N1 g) v, t: U2 p) A& {, `  v6 B- @' R  O
RenderTexture::begin+ \' i, m  H( h* t
被抓取对象::visit* X9 @; s/ @( r$ I0 @# ?6 s. K2 K* ^
RenderTexture::end: {. p) l) {) N5 P1 c1 ^3 H
' I8 k% S$ K% Z& Z( _" B3 b1.13.2 使用utils::captureScreen抓屏* B# i. a6 I1 ?4 M" S
在3.2中引入0 s% P* S; O& k8 E0 O: X' F
1.14 声音( p# D; W0 g/ o0 f
没声音,再好的戏也出不来" L) x* k$ ]6 N, K7 A( V( h
1.14.1 cocos2dx跨平台音频引擎cocosdension/ G+ p0 ?& Z6 I% j: T* |
cocos2dx的音频引擎为各个平台提供统一的接口
7 Y; r, v" G7 j& c7 u, _( m头文件 #include "SimpleAudioEngine.h"# ^# }7 c, P; H9 _+ ~! l
需要使用命名空间 CocosDenshion. \2 d; H& e9 [# B! F: i
1.14.2 背景音乐; c9 V/ h- L& W& r
播放背景音乐* x$ |' q8 y& f. X4 _$ I) m3 @2 Y$ K3 K# d6 a: o
循环播放  v, N; C7 S! {0 g! V1 V1 b6 `* @" k
停止背景音乐3 k" r6 B: C4 U, m% O& F2 s6 |, h3 a8 s5 Y; O3 D
1.14.3 音效
" n. l: Y# v4 B播放音效6 o" j( R3 j! n) F0 S# v% q
停止音效9 F/ b" E' ?! e9 G  O6 u( a$ ~' c8 y- H# C- f9 @8 n% b
1.14.4 干预! N/ v# R# W' l) V7 ?: m0 Z' k
设置音量
! ]8 s0 a. i! \1 A$ i暂停  k1 R: B2 j6 y6 O# |! O6 L! f
继续8 p% _0 F8 F! \+ Q" P4 C* J, z6 d' I% s1 [$ B7 c4 H. h2 {$ [; W
1.14.5 提高效率:预加载音乐1.14.6 背景音乐的生命周期1.14.7 程序进入后台的处理4 q' ?* |6 X3 b/ R; d( U
补充:学习cppTest代码,从cppTest代码获得知识
/ u; m. n, D9 W( a( Z/ y7 t- N1.15 实现飞机大战案例
: l, j( h* b. K, B& G+ b, B3 ]一切准备就绪,让我们来设计游戏吧6 M! i" k+ y* ~0 _# h8 B2 _6 |. `' b9 {6 K3 `
1.15.1 设计目标
" {; Q2 q) @2 U. x8 n划分模块,简化模块逻辑,逐步实现
: c0 m6 ^3 c) s3 A- |! n! _8 i1.15.2 控制层实现* Y' I, j/ a2 @$ l% `. T5 P
英雄战机的移动控制
( T' Z  a7 u, Q% Z1 ?. H发射子弹
' Z  @8 H3 k) A: d" n% n引爆炸弹( [) A5 C2 _2 @$ S" q* X" X  k/ }9 g9 D- d$ F. o
1.15.3 AI层实现' W+ O; D; p; u
敌机产生" g- T) I, F' D& M1 k2 {
敌机自动移动控制3 x) R3 o* N4 I5 e/ n# C3 s5 t/ M
子弹自动移动控制' X9 I0 y7 U+ D8 Y5 \% {' r1 Z. z
炸弹道具产生/ [. U/ a/ j2 B* @- @1 e+ L- |
1.15.4 碰撞检测7 S" F0 g/ b) f  _. C. Q
敌机和子弹的碰撞检测8 d: E0 i% r' \; H) a. P- r
敌机和英雄战机的碰撞检测
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

服务QQ

800-089-037

官方Q群:556480310
关注我们 :

QQ- 小黑屋- 当下网络资源收集提供社区,提供免费教程,高质量资源分享,致力打造最优质网盘资源分享论坛.

Powered by 龙天论坛 X3.2 Licensed© 2013-2017 龙天论坛  沪ICP备16001425号-1