cocos2d_x_03_经常使用类的使用_事件_画图
一、TextFieldTTF输入框的使用


#pragma mark - 自己定义方法
// 自己定义方法,加入一个 TextField
void TextFieldScene::addOneTextField(float x,float y)
{
TextFieldTTF *field = TextFieldTTF::textFieldWithPlaceHolder("请输入:","宋体",50);
field->setPosition(x,y);
// 加入精灵到当前 Layer
this->addChild(field);
// 2、实例化一个触摸监听器 对象
auto listener = EventListenerTouchOneByOne::create();
// 当触摸開始时,绑定一个闭包函数;
// 【】表示 要传入的外界对象,此处是field
// ()表示參数
listener->onTouchBegan = [field](Touch *t,Event *e){
// getLocation 返回一个OpenGL坐标
// 假设点击的点,在textField上,才同意输入
if (field->getBoundingBox().containsPoint(t->getLocation())) {
field->attachWithIME();
}else{
field->detachWithIME();
}
return false;
};
// 3、获取事件分发器,加入一个事件监听器,到this身上;即监听的是field对象【文本输入框】
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, field);
}
二、自己定义类Ball,继承自Sprite
Ball.h
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
CREATE_FUNC(type)宏
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
Ball.cpp
init方法的实现

在主场景中使用自己定义类,创建实例对象
能够是在onEnter()方法,也能够在init()方法
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

三、Cocos2d-x的内存管理
引用计数 reference count
推荐:使用时,先retain,使用完release
不建议:delete
简化操作:创建完成后。使用autorelease();
四、菜单的使用

第1种方式:设置 回调函数 为 闭包函数,它属于c++11最新特性
菜单项的 回调函数类型 定义例如以下:


第2种方式:设置 菜单项 的回调方法,通过宏
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
CC_CALLBACK_1宏

.h文件里的回调方法声明
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
.cpp文件里回调方法的实现

五、TableView的使用

导入cocos2d-x扩展头文件,里面有CCTableView.h

场景继承自datasouce和delegate
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
以下是数据源的方法声明

以下是tableView代理的声明

实例化一个tableView

整个场景的完整的头文件

整个场景的方法实现.cpp文件
//
// TableViewScene.cpp
// 01_cocos2d-x
//
// Created by beyond on 14-10-4.
#include "TableViewScene.h"
Scene* TableViewScene::createScene()
{
// 'scene' 自己主动释放
// 创建一个scene
auto scene = Scene::create();
// 'layer' 自己主动释放
auto layer = TableViewScene::create();
// 将图层 加入到场景中
scene->addChild(layer);
// 返回 填充好图层的 场景
return scene;
}
// 在 "init" 方法中,实例化自己要用的精灵对象
bool TableViewScene::init()
{
// 1. 调用父类的init , cpp 没有super,直接写父类名
if ( !Layer::init() ) return false;
// 屏幕尺寸
winSize = Director::getInstance()->getVisibleSize();
// 加入一个tableview
Size size = Size(300, 300);
TableView *tv = TableView::create(this, size);
// 设置锚点
tv->setAnchorPoint(Point(0, 0));
// 设置位置
tv->setPosition(winSize.width/2, winSize.height/2);
// 设置代理
tv->setDelegate(this);
// 加入到this
addChild(tv);
return true;
}
#pragma mark - 数据源方法
// 以下全是数据源方法
// 共同拥有多少行
ssize_t TableViewScene::numberOfCellsInTableView(TableView *table)
{
return 7;
}
// 每一行的尺寸
Size TableViewScene::tableCellSizeForIndex(TableView *table, ssize_t idx)
{
return Size(300, 60);
}
// 每一行的cell
TableViewCell* TableViewScene::tableCellAtIndex(TableView *table, ssize_t idx)
{
// 重用机制,先从缓存池中取,取不到再创建
TableViewCell *cell = table->dequeueCell();
LabelTTF *label;
if (cell==NULL) {
// 创建一个cell
cell = TableViewCell::create();
// 创建一个新的label
label = LabelTTF::create();
// 绑定标记
label->setTag(5267);
// 设置字体大小
label->setFontSize(30);
// 设置锚点
label->setAnchorPoint(Point(0, 0));
// 加入到cell
cell->addChild(label);
}else{
// 直接取出cell里面的 label,又一次赋值
label = (LabelTTF*)cell->getChildByTag(5267);
}
std::string arr[] = {"宝玉","黛玉","宝钗","湘云","探春","妙玉","晴雯"};
// 设置label内容
label->setString(StringUtils::format("Label %ld,%s",idx,arr[idx].c_str()));
// 返回独一无二的cell
return cell;
}
#pragma mark - 代理 方法
//以下全是代理方法
// 点击时调用
void TableViewScene::tableCellTouched(TableView* table, TableViewCell* cell)
{
LabelTTF *label = (LabelTTF*)cell->getChildByTag(5267);
std::string content = StringUtils::format("点击了第n行,内容是:%s",label->getString().c_str());
MessageBox(content.c_str(), "标题");
}
重点是
StringUtils::format();<span style="color: rgb(57, 57, 57); font-family: 'Courier New'; font-size: 24px; line-height: 32px; background-color: rgb(245, 245, 245);"><strong>方法</strong></span>
<span style="color: rgb(57, 57, 57); font-family: 'Courier New'; font-size: 24px; line-height: 32px; background-color: rgb(245, 245, 245);"><strong>返回的是std::string对象,能够通过c_str()</strong></span><span style="font-family: 'Courier New'; background-color: rgb(245, 245, 245);">方法转成c字符串</span>
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
重点是:重用机制

tableCellTouched 相当于iOS中的didSlectedRowAtIndexPath

六、场景切换
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" width="600" height="1800">
效果图:

场景.h头文件
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
场景.cpp类实现
加入一个LabelTTF,内容是空白字符串,监听点击事件,进行场景切换
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
七、动作Action


// 创建一个监听器对象
auto listener = EventListenerTouchOneByOne::create();
// 监听方法 用闭包函数实现
listener->onTouchBegan = [label](Touch *t,Event *e){
// 仅仅有点击的位置在label身上,才响应监听事件
if (label->getBoundingBox().containsPoint(t->getLocation())) {
// 绝对, 相对
label->runAction(MoveTo::create(1, Point(100, 100)));
label->runAction(MoveBy::create(1, Point(-50, -50))->reverse());
// 同一时候并发运行 Spawn
label->runAction(Spawn::create(MoveBy::create(1, Point(100, 100)), RotateBy::create(1, 360),NULL));
label->runAction(Sequence::create(MoveBy::create(1, Point(100, 100)),RotateBy::create(1, 360), NULL));
// 顺序运行 Sequence
label->runAction(Sequence::create(
MoveBy::create(1, Point(100, 100)),
RotateBy::create(1, 360),
// 闭包函数,实现 动作的侦听
CallFunc::create([](){
// 动作完毕时,弹出 对话框
MessageBox("Action complete", "title");
}),NULL));
}
return false;
};
// 向事件分发器 注冊一个事件侦听器,侦听发生在label身上的事件
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, label);
八、逐帧动画

首先。下载Flash_Professional_13_LS20.dmg,约1G左右
按以下方法,执行补丁

打开Flash,打开【库Library】,点击左下角的新建button。
新建一个Symbol,类型选择【影片剪辑Movie Clip】;
在第1帧先画一个正方形,按F6在第20帧创建一个关键帧;
并在第20帧 删除原来的正方形,画一个圆形;
在上面两个关键帧之间的随意一帧,右击,创建一个【形变补间动画shape tween】
最后,重点,导出为cocos2d用的大纹理+Plist文件
点击库,右击刚才创建的影片剪辑【movie clip】,选择【Generate Sprite Sheet】,data format选择【cocos2D v3】,选择【Export导出】
这时,生成了plist文件+一个大纹理图片,例如以下所看到的

plist文件

精灵帧缓存、纹理缓存、SpriteBatchNode三者的关系

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
//
// FrameAnimateScene.cpp
// 01_cocos2d-x
//
// Created by beyond on 14-10-4.
//
//
#include "FrameAnimateScene.h"
USING_NS_CC;
Scene* FrameAnimateScene::createScene()
{
// 'scene' 自己主动释放
// 创建一个scene
auto scene = Scene::create();
// 'layer' 自己主动释放
auto layer = FrameAnimateScene::create();
// 将图层 加入到场景中
scene->addChild(layer);
// 返回 填充好图层的 场景
return scene;
}
// 在 "init" 方法中,实例化自己要用的精灵对象
bool FrameAnimateScene::init()
{
// 1. 调用父类的init , cpp 没有super,直接写父类名
if ( !Layer::init() ) return false;
// 屏幕尺寸
winSize = Director::getInstance()->getVisibleSize();
// 2.加入一个精灵,播放帧动画
this->addSpriteFrameAniamtion();
return true;
}
#pragma mark - 自己定义方法
// 2.加入一个精灵,播放帧动画
void FrameAnimateScene::addSpriteFrameAniamtion(){
// 精灵帧缓存 单例
auto cache = SpriteFrameCache::getInstance();
// 【精灵帧缓存】会依据plist中的key,到大纹理相冊中,分割并载入 小的精灵帧,放入帧缓存中,以后仅仅需 依据 小图片名,从【精灵帧缓存】中取出小精灵帧就可以
cache->addSpriteFramesWithFile("anim.plist");
// 容器,数组,里面存放的是精灵帧
Vector<SpriteFrame*> vec;
// 用来生成小精灵帧的图片名
char name[15];
// 用0清空内存
memset(name, 0, 15);
// 从帧缓存中取出全部的小精灵帧,放入Vector
for (int i=0; i<20; i++) {
// 格式化name,%04d,表示 不足四位 用填充
sprintf(name, "anim%04d",i);
// 将小精灵帧 加入容器
vec.pushBack(cache->getSpriteFrameByName(name));
}
// 创建 Animation
Animation *animation = Animation::createWithSpriteFrames(vec,0.1f);
// 创建 Animate
Animate *animate = Animate::create(animation);
// 创建精灵
auto sprite = Sprite::create();
// 加入到 this
addChild(sprite);
// 设置位置
sprite->setPosition(200, 200);
// 运行序列帧动画
Sequence *seq = Sequence::create(animate,animate->reverse(), NULL);
sprite->runAction(RepeatForever::create(seq));
}
九、事件的传递
listener->onTouchBegan方法中,返回的bool值 决定了onTouchMove方法是否可以被触发
onTouchBegan方法,返回值是bool,參数:Touch *t,Event *e
当中,參数Event *e中,e->getCurrentTarget()得到的是被点击的对象,即 向事件分发器中注冊listener时,绑定的Node对象
此外,仅仅要是Node都能够监听事件


多点触摸
【OneByOne是单点触摸】【AllAtOnce是多点触摸】

加速计事件
1、必须先 同意加速计事件
2、事件类型是【EventListenerAcceleration】

关于加速计的方向x y z

当手机竖着,x方向的加速值,约等于0
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">
当手机向右倾斜,x方向的加速值,添加

当手机全然向右倾斜,x方向的加速值,约等于+1.0
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">
当手机向左倾斜,x方向的加速值,减小

当手机全然向左倾斜,x方向的加速值,约等于-1.0

侦听 Android的菜单键和返回键
事件类型是【EventListenerKeyboard】
闭包函数的參数1:键盘码,当中,菜单键是【4199】,返回键是【8】
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
十、画图API
效果图:

Node类有一个虚方法draw(),仅仅要覆写,就能够绘制自己的Node

自己定义类,继承自Node



draw()方法中,主要使用到的类是【DrawPrimitives】

DrawPrimitives类绘制图形,但已经过期~
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="color:rgb(57,57,57); font-family:'Courier New'; font-size:24px; font-weight:bold; line-height:32px">
在draw()方法中绘制 矩形

在draw()方法中绘制
填充矩形SolidRect

在draw()方法中绘制 圆形
圆心 半径
角度360度 segment为50 true表示要连接一根线到圆心
注意 第4个參数 segment
为 3 时,事实上是画一个三角形;当为50段时,就比較接近圆了
计算机 事实上 无法直接画圆,就是当分段数目segment趋近无穷大时,就接近于圆了


在draw()方法中绘制 填充圆形 Solid


在draw()方法中绘制 多边形 顶点数组
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

在draw()方法中绘制 填充多边形

在draw()方法中绘制 画直线

在draw()方法中绘制 画点


#pragma mark - 自己定义方法
// 自己定义方法,加入一个 TextField
void TextFieldScene::addOneTextField(float x,float y)
{
TextFieldTTF *field = TextFieldTTF::textFieldWithPlaceHolder("请输入:","宋体",50);
field->setPosition(x,y);
// 加入精灵到当前 Layer
this->addChild(field); // 2、实例化一个触摸监听器 对象
auto listener = EventListenerTouchOneByOne::create();
// 当触摸開始时,绑定一个闭包函数;
// 【】表示 要传入的外界对象,此处是field
// ()表示參数
listener->onTouchBegan = [field](Touch *t,Event *e){
// getLocation 返回一个OpenGL坐标
// 假设点击的点,在textField上,才同意输入
if (field->getBoundingBox().containsPoint(t->getLocation())) {
field->attachWithIME();
}else{
field->detachWithIME();
}
return false;
};
// 3、获取事件分发器,加入一个事件监听器,到this身上;即监听的是field对象【文本输入框】
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, field); }
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
//
// TableViewScene.cpp
// 01_cocos2d-x
//
// Created by beyond on 14-10-4.
#include "TableViewScene.h" Scene* TableViewScene::createScene()
{
// 'scene' 自己主动释放
// 创建一个scene
auto scene = Scene::create(); // 'layer' 自己主动释放
auto layer = TableViewScene::create();
// 将图层 加入到场景中
scene->addChild(layer);
// 返回 填充好图层的 场景
return scene;
} // 在 "init" 方法中,实例化自己要用的精灵对象
bool TableViewScene::init()
{
// 1. 调用父类的init , cpp 没有super,直接写父类名
if ( !Layer::init() ) return false;
// 屏幕尺寸
winSize = Director::getInstance()->getVisibleSize(); // 加入一个tableview
Size size = Size(300, 300);
TableView *tv = TableView::create(this, size);
// 设置锚点
tv->setAnchorPoint(Point(0, 0));
// 设置位置
tv->setPosition(winSize.width/2, winSize.height/2);
// 设置代理
tv->setDelegate(this);
// 加入到this
addChild(tv); return true;
} #pragma mark - 数据源方法
// 以下全是数据源方法
// 共同拥有多少行
ssize_t TableViewScene::numberOfCellsInTableView(TableView *table)
{
return 7;
}
// 每一行的尺寸
Size TableViewScene::tableCellSizeForIndex(TableView *table, ssize_t idx)
{
return Size(300, 60);
}
// 每一行的cell
TableViewCell* TableViewScene::tableCellAtIndex(TableView *table, ssize_t idx)
{
// 重用机制,先从缓存池中取,取不到再创建
TableViewCell *cell = table->dequeueCell(); LabelTTF *label;
if (cell==NULL) {
// 创建一个cell
cell = TableViewCell::create();
// 创建一个新的label
label = LabelTTF::create();
// 绑定标记
label->setTag(5267);
// 设置字体大小
label->setFontSize(30);
// 设置锚点
label->setAnchorPoint(Point(0, 0));
// 加入到cell
cell->addChild(label);
}else{
// 直接取出cell里面的 label,又一次赋值
label = (LabelTTF*)cell->getChildByTag(5267);
}
std::string arr[] = {"宝玉","黛玉","宝钗","湘云","探春","妙玉","晴雯"};
// 设置label内容
label->setString(StringUtils::format("Label %ld,%s",idx,arr[idx].c_str()));
// 返回独一无二的cell
return cell; }
#pragma mark - 代理 方法
//以下全是代理方法
// 点击时调用
void TableViewScene::tableCellTouched(TableView* table, TableViewCell* cell)
{
LabelTTF *label = (LabelTTF*)cell->getChildByTag(5267);
std::string content = StringUtils::format("点击了第n行,内容是:%s",label->getString().c_str());
MessageBox(content.c_str(), "标题");
}
StringUtils::format();<span style="color: rgb(57, 57, 57); font-family: 'Courier New'; font-size: 24px; line-height: 32px; background-color: rgb(245, 245, 245);"><strong>方法</strong></span>
<span style="color: rgb(57, 57, 57); font-family: 'Courier New'; font-size: 24px; line-height: 32px; background-color: rgb(245, 245, 245);"><strong>返回的是std::string对象,能够通过c_str()</strong></span><span style="font-family: 'Courier New'; background-color: rgb(245, 245, 245);">方法转成c字符串</span>
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" width="600" height="1800">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
// 创建一个监听器对象
auto listener = EventListenerTouchOneByOne::create();
// 监听方法 用闭包函数实现
listener->onTouchBegan = [label](Touch *t,Event *e){
// 仅仅有点击的位置在label身上,才响应监听事件
if (label->getBoundingBox().containsPoint(t->getLocation())) {
// 绝对, 相对
label->runAction(MoveTo::create(1, Point(100, 100)));
label->runAction(MoveBy::create(1, Point(-50, -50))->reverse());
// 同一时候并发运行 Spawn
label->runAction(Spawn::create(MoveBy::create(1, Point(100, 100)), RotateBy::create(1, 360),NULL)); label->runAction(Sequence::create(MoveBy::create(1, Point(100, 100)),RotateBy::create(1, 360), NULL)); // 顺序运行 Sequence
label->runAction(Sequence::create(
MoveBy::create(1, Point(100, 100)),
RotateBy::create(1, 360),
// 闭包函数,实现 动作的侦听
CallFunc::create([](){
// 动作完毕时,弹出 对话框
MessageBox("Action complete", "title");
}),NULL));
} return false;
};
// 向事件分发器 注冊一个事件侦听器,侦听发生在label身上的事件
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, label);

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
//
// FrameAnimateScene.cpp
// 01_cocos2d-x
//
// Created by beyond on 14-10-4.
//
// #include "FrameAnimateScene.h"
USING_NS_CC;
Scene* FrameAnimateScene::createScene()
{
// 'scene' 自己主动释放
// 创建一个scene
auto scene = Scene::create(); // 'layer' 自己主动释放
auto layer = FrameAnimateScene::create();
// 将图层 加入到场景中
scene->addChild(layer);
// 返回 填充好图层的 场景
return scene;
} // 在 "init" 方法中,实例化自己要用的精灵对象
bool FrameAnimateScene::init()
{
// 1. 调用父类的init , cpp 没有super,直接写父类名
if ( !Layer::init() ) return false;
// 屏幕尺寸
winSize = Director::getInstance()->getVisibleSize(); // 2.加入一个精灵,播放帧动画
this->addSpriteFrameAniamtion();
return true;
} #pragma mark - 自己定义方法
// 2.加入一个精灵,播放帧动画
void FrameAnimateScene::addSpriteFrameAniamtion(){
// 精灵帧缓存 单例
auto cache = SpriteFrameCache::getInstance();
// 【精灵帧缓存】会依据plist中的key,到大纹理相冊中,分割并载入 小的精灵帧,放入帧缓存中,以后仅仅需 依据 小图片名,从【精灵帧缓存】中取出小精灵帧就可以
cache->addSpriteFramesWithFile("anim.plist"); // 容器,数组,里面存放的是精灵帧
Vector<SpriteFrame*> vec;
// 用来生成小精灵帧的图片名
char name[15];
// 用0清空内存
memset(name, 0, 15);
// 从帧缓存中取出全部的小精灵帧,放入Vector
for (int i=0; i<20; i++) {
// 格式化name,%04d,表示 不足四位 用填充
sprintf(name, "anim%04d",i);
// 将小精灵帧 加入容器
vec.pushBack(cache->getSpriteFrameByName(name));
}
// 创建 Animation
Animation *animation = Animation::createWithSpriteFrames(vec,0.1f);
// 创建 Animate
Animate *animate = Animate::create(animation);
// 创建精灵
auto sprite = Sprite::create();
// 加入到 this
addChild(sprite);
// 设置位置
sprite->setPosition(200, 200);
// 运行序列帧动画
Sequence *seq = Sequence::create(animate,animate->reverse(), NULL);
sprite->runAction(RepeatForever::create(seq));
}
多点触摸
【OneByOne是单点触摸】【AllAtOnce是多点触摸】
1、必须先 同意加速计事件
2、事件类型是【EventListenerAcceleration】
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">
侦听 Android的菜单键和返回键
事件类型是【EventListenerKeyboard】
闭包函数的參数1:键盘码,当中,菜单键是【4199】,返回键是【8】
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="color:rgb(57,57,57); font-family:'Courier New'; font-size:24px; font-weight:bold; line-height:32px">
填充矩形SolidRect
圆心 半径
角度360度 segment为50 true表示要连接一根线到圆心
注意 第4个參数 segment
为 3 时,事实上是画一个三角形;当为50段时,就比較接近圆了
计算机 事实上 无法直接画圆,就是当分段数目segment趋近无穷大时,就接近于圆了
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
cocos2d_x_03_经常使用类的使用_事件_画图的更多相关文章
- C#_事件
C#_事件 概述 今天用来演示事件的例子是模拟实现一个文件下载类,在这个类中我将定义一个DownLoad事件,这个事件用来在文件下载的过程中,向订阅这个事件的用户发出消息,而这个消息将用DownLoa ...
- 图解C#_事件
概述 今天用来演示事件的例子是模拟实现一个文件下载类,在这个类中我将定义一个DownLoad事件,这个事件用来在文件下载的过程中,向订阅这个事件的用户发出消息,而这个消息将用DownLoadEvent ...
- UML类图详解_关联关系_一对多
对于一对多的示例,可以想象一个账户可以多次申购.在申购的时候没有固定上限,下限为0,那么就可以使用容器类(container class)来搞,最常见的就是vector了. 下面我们来看一个“一对多” ...
- UML类图详解_关联关系_多对一
首先先来明确一个概念,即多重性.什么是多重性呢?多重性是指两个对象之间的链接数目,表示法是“下限...上限”,最小数据为零(0),最大数目为没有设限(*),如果仅标示一个数目级上下限相同. 实际在UM ...
- cb02a_c++_数据结构_顺序容器_STL_list类_双向链表
/*cb02a_c++_数据结构_顺序容器_STL_list类_双向链表实例化std::list对象在list开头插入元素在list末尾插入元素在list中间插入元素,插入时间恒定,非常快.数组:中间 ...
- cb01a_c++_数据结构_顺序容器_STL_deque类
/*cb01a_c++_数据结构_顺序容器_STL_deque类deque是一个动态数组,比vector更加灵活.两者都属于动态数组deque与vector非常类似deque可以在数组开头和末尾插入和 ...
- 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好
HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...
- C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节
C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C++图形用户界面应用程序框架.它为应用程序开发者提供建立艺术级图形界面 ...
- 从IL角度彻底理解回调_委托_指针
从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...
随机推荐
- nyoj Wythoff Game(暴力枚举)
Wythoff Game ms | KB 描写叙述 近期ZKC同学在学博弈,学到了一个伟大的博弈问题--威佐夫博弈. 相信大家都学过了吧?没学过?没问题.我将要为你讲述一下这个伟大的博弈问题. ...
- 创建cifs系统案例之“实现将Windows磁盘共享至Linux”
原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong ...
- [iOS翻译]《iOS7 by Tutorials》在Xcode 5里使用单元測试(上)
简单介绍: 单元測试是软件开发的一个重要方面.毕竟,单元測试能够帮你找到bug和崩溃原因,而程序崩溃是Apple在审查时拒绝app上架的首要原因. 单元測试不是万能的,但Apple把它作为开发工具包的 ...
- MVC 全局异常处理(适用多人操作)
自定义特性: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...
- P2740 [USACO4.2]草地排水Drainage Ditches
题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没 ...
- css元素垂直居中方法
1.Line-height 适用情景:单行文字垂直居中技巧 这个方式应该是最多人知道的了,常见于单行文字的应用,像是按钮这一类对象,或者是下拉框.导航此类元素最常见到的方式了.此方式的原理是在于将单行 ...
- javascript一个重要知识点:事件。
javascript是事件驱动的,那什么是事件?事件就是在javascript中被侦测到DOM元素行为,就称之为javascript事件. 2.事件的三个阶段 事件的三个阶段分别为: 1.捕获阶段 2 ...
- hdu 1532 Drainage Ditches 【ISAP 】
还是不是很懂算法 先存一个模板先吧--- 看的这篇学的-- http://www.renfei.org/blog/isap.html #include<cstdio> #include&l ...
- Generic programming-泛型编程
Generic programming is a style of computer programming in which algorithms are written in terms of t ...
- ZBrush中SnakeHook蛇钩笔刷介绍
不同笔刷用着不同的作用,绘画出来的效果也是千姿百态,各有千秋,有些笔刷在使用的时候可以替代,但有些笔刷是无法替代,不可超越的,比如ZBrush®中给我们提供的,SnakeHook笔刷,该笔刷在模型表面 ...