设置功能场景的ui效果图:
可以看出这个功能场景的控件就三种类型,一个是菜单按钮——关闭按钮和保存按钮以及音乐和音效的开关按钮。而是精灵图片——背景图片等,三是滑动条的控件。因此此处我们需要学习的两个全新的控件就是滑动条的控件和开关按钮的控件,他们对应的Cocos2d-x的控件是:滑动条:ControlSlider,开关按钮MenuItemToggle。
0ControlSlider的用法
滑动条控件的组成分为三部分——互动的背景图,滑块,划过区域的图。看下他的关键源码:
ControlSlider.cpp
class ControlSlider: public Control
{
public:
static ControlSlider* create(const char* bgFile, const char* progressFile, const char* thumbFile);
static ControlSlider* create(Sprite * backgroundSprite, Sprite* pogressSprite, Sprite* thumbSprite);
static ControlSlider* create(const char* bgFile, const char* progressFile, const char* thumbFile,
const char* selectedThumbSpriteFile);
static ControlSlider* create(Sprite * backgroundSprite, Sprite* pogressSprite, Sprite* thumbSprite,
Sprite* selectedThumbSprite);
ControlSlider();
virtual ~ControlSlider();
virtual bool initWithSprites(Sprite * backgroundSprite, Sprite* progressSprite, Sprite* thumbSprite);
virtual bool initWithSprites(Sprite * backgroundSprite, Sprite* progressSprite, Sprite* thumbSprite,
Sprite* selectedThumbSprite);
virtual void needsLayout();
virtual void setMaximumValue(float val);
virtual void setEnabled(bool enabled);
virtual bool isTouchInside(Touch * touch);
Point locationFromTouch(Touch* touch);
virtual void setValue(float val);
virtual void setMinimumValue(float val);
``````
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
他的父类Control提供了一个绑定事件的函数如下:
void addTargetWithActionForControlEvent(Ref* target, Handler action, EventType controlEvent);
enum class EventType
{
TOUCH_DOWN = 1 << 0,
DRAG_INSIDE = 1 << 1,
DRAG_OUTSIDE = 1 << 2,
DRAG_ENTER = 1 << 3,
DRAG_EXIT = 1 << 4,
TOUCH_UP_INSIDE = 1 << 5,
TOUCH_UP_OUTSIDE = 1 << 6,
TOUCH_CANCEL = 1 << 7,
VALUE_CHANGED = 1 << 8
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
然后是MenuItemToggle的用法,这个控件的学习方法和上面一样,查看其源码就可以知道他的构造性方法和重要的API函数,我这里就不再带着大家走一遍了。
下面是该界面的主要实现代码:
#ifndef __SetLayer__H__
#define __SetLayer__H__
#include "cocos2d.h"
#include "extensions/cocos-ext.h"
USING_NS_CC;
using namespace cocos2d::extension;
class SetLayer : public Layer {
public:
static Scene* createScene();
virtual bool init();
CREATE_FUNC(SetLayer);
void changeMusicVol(Ref* pSender, Control::EventType type);
void changeEffectVol(Ref* pSender, Control::EventType type);
void saveSet(Ref* pSender);
void closeBtn(Ref* pSender);
void musicSet(Ref* pSender);
void effectSet(Ref* pSender);
};
#endif
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
实现代码
Scene* SetLayer::createScene()
{
Scene* setScene = Scene::create();
SetLayer* layer = SetLayer::create();
setScene->addChild(layer);
return setScene;
}
bool SetLayer::init()
{
if (!Layer::init())
{
return false;
}
float music = getFloatFromXML(MUSICVOL)*100.0f;
float effect = getFloatFromXML(SOUNDVOL)*100.0f;
auto BG = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("image-0.png"));
BG->setPosition(WINSIZE.width / 2, WINSIZE.height / 2);
auto bgInterface = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("BGPicSet.png"));
bgInterface->setPosition(WINSIZE.width / 2 + 50, WINSIZE.height / 2);
auto closeBtn = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("closeSetNormal.png")),
Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("closeSetSelected.png")), CC_CALLBACK_1(SetLayer::closeBtn, this));
closeBtn->setPosition(WINSIZE.width - 150, WINSIZE.height - 100);
auto saveBtn = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("SaveSettings.png")),
Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("SaveSettings.png")), CC_CALLBACK_1(SetLayer::saveSet, this));
saveBtn->setPosition(WINSIZE.width/2+40, WINSIZE.height / 2 - 190);
auto musicOn = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("unchecked.png")),
Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("unchecked.png")));
auto musicOff = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hook.png")),
Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hook.png")));
auto effectOn = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("unchecked.png")),
Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("unchecked.png")));
auto effectOff = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hook.png")),
Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hook.png")));
auto musicToggle = MenuItemToggle::createWithTarget(this, menu_selector(SetLayer::musicSet), musicOn, musicOff, NULL);
musicToggle->setPosition(369.5, 457);
auto effectToggle = MenuItemToggle::createWithTarget(this, menu_selector(SetLayer::effectSet), effectOn, effectOff, NULL);
effectToggle->setPosition(369.5, 357);
if (getBoolFromXML(MUSIC_KEY))
{
musicToggle->setSelectedIndex(1);
}
else
{
musicToggle->setSelectedIndex(0);
}
if (getBoolFromXML(SOUND_KEY))
{
effectToggle->setSelectedIndex(1);
}
else
{
effectToggle->setSelectedIndex(0);
}
auto menu = Menu::create(closeBtn, saveBtn, musicToggle, effectToggle, NULL);
menu->setPosition(Point::ZERO);
auto musicSlider = ControlSlider::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bgBar.png")),
Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("progressBar.png")), Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("ThumbBtn.png")));
musicSlider->addTargetWithActionForControlEvents(this, cccontrol_selector(SetLayer::changeMusicVol), Control::EventType::VALUE_CHANGED);
auto effectSlider = ControlSlider::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bgBar.png")),
Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("progressBar.png")), Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("ThumbBtn.png")));
effectSlider->addTargetWithActionForControlEvents(this, cccontrol_selector(SetLayer::changeEffectVol), Control::EventType::VALUE_CHANGED);
musicSlider->setPosition(800, 457);
musicSlider->setMinimumValue(0.0f);
musicSlider->setMaximumValue(100.0f);
musicSlider->setMinimumAllowedValue(0.0f);
musicSlider->setMaximumAllowedValue(100.0f);
musicSlider->setValue(music);
effectSlider->setPosition(800, 357);
effectSlider->setMinimumValue(0.0f);
effectSlider->setMaximumValue(100.0f);
effectSlider->setMinimumAllowedValue(0.0f);
effectSlider->setMaximumAllowedValue(100.0f);
effectSlider->setValue(effect);
this->addChild(BG);
this->addChild(bgInterface);
this->addChild(musicSlider);
this->addChild(effectSlider);
this->addChild(menu);
return true;
}
void SetLayer::changeMusicVol(Ref* pSender, Control::EventType type)
{
auto temp = (ControlSlider*)pSender;
setFloatToXML(MUSICVOL, temp->getValue()/100.0f);
UserDefault::getInstance()->flush();
aduioEngine->setBackgroundMusicVolume(getFloatFromXML(MUSICVOL));
}
void SetLayer::changeEffectVol(Ref* pSender, Control::EventType type)
{
auto temp = (ControlSlider*)pSender;
setFloatToXML(SOUNDVOL, temp->getValue()/100.0f);
UserDefault::getInstance()->flush();
aduioEngine->setEffectsVolume(getFloatFromXML(SOUNDVOL));
}
void SetLayer::closeBtn(Ref* pSender)
{
PLAYEFFECT;
Director::getInstance()->replaceScene(StartLayer::createScene());
}
void SetLayer::saveSet(Ref* pSender)
{
PLAYEFFECT;
Director::getInstance()->replaceScene(StartLayer::createScene());
}
void SetLayer::musicSet(Ref* pSender)
{
auto musicTemp = (MenuItemToggle*)pSender;
PLAYEFFECT;
if (musicTemp->getSelectedIndex() == 0)
{
setBoolToXML(MUSIC_KEY, false);
UserDefault::getInstance()->flush();
SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
}
else
{
setBoolToXML(MUSIC_KEY, true);
UserDefault::getInstance()->flush();
aduioEngine->setBackgroundMusicVolume(getFloatFromXML(MUSICVOL));
SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
}
}
void SetLayer::effectSet(Ref* pSender)
{
auto effectTemp = (MenuItemToggle*)pSender;
if (effectTemp->getSelectedIndex() == 0)
{
setBoolToXML(SOUND_KEY, false);
UserDefault::getInstance()->flush();
}
else
{
setBoolToXML(SOUND_KEY, true);
UserDefault::getInstance()->flush();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
以上就是设置功能场景的基本实现,其所使用的新的内容首先是UserDefault类保存和读取用户的数据,然后是ControlSlider类和MenuItemToggle类。