AniSimpleLevelPickerView.cpp
3.86 KB
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
//
// AniSimpleLevelPickerView.cpp
// HalloweenSpaceInvaders-mobile
//
// Created by Katarzyna Kalinowska-Górska on 01/10/2019.
//
#include <stdio.h>
#include "AniSimpleLevelPickerView.h"
#include "AniMiscUtils.h"
#include "AniGeometryUtils.h"
AniSimpleLevelPickerView* AniSimpleLevelPickerView::create(std::vector<std::string> levelImagePaths){
AniSimpleLevelPickerView * view = new (std::nothrow) AniSimpleLevelPickerView();
if(view && view->init(levelImagePaths))
{
view->autorelease();
return view;
}
CC_SAFE_DELETE(view);
return nullptr;
}
bool AniSimpleLevelPickerView::init(std::vector<std::string> levelImagePaths){
if(!cocos2d::Node::init()){
return false;
}
for(auto levelImagePath : levelImagePaths){
auto newAniLevelView = AniLevelView::create(levelImagePath);
addChild(newAniLevelView);
AniLevelViews.emplace_back(newAniLevelView);
newAniLevelView->setCascadeOpacityEnabled(true);
newAniLevelView->setOpacity(0);
auto contentSize = getContentSize();
contentSize = cocos2d::Size(MAX(contentSize.width, newAniLevelView->getBoundingBox().size.width), MAX(contentSize.height, newAniLevelView->getBoundingBox().size.height));
setContentSize(contentSize);
}
for(auto AniLevelView : AniLevelViews){
AniLevelView->setPosition(getContentSize().width/2, getContentSize().height/2);
}
_selectedLevelIndex = 0;
AniLevelViews[_selectedLevelIndex]->setOpacity(255);
AniLevelViews[_selectedLevelIndex]->setChosen(true, false);
_onLevelChanged = nullptr;
prepareTouchHandlers();
return true;
}
void AniSimpleLevelPickerView::selectLevelIndex(int index, bool animated){
if(_selectedLevelIndex != index){
if(animated){
AniLevelViews[_selectedLevelIndex]->runAction(cocos2d::FadeOut::create(AniMiscUtils::StandardAnimationTime));
AniLevelViews[_selectedLevelIndex]->setChosen(false, true);
AniLevelViews[index]->runAction(cocos2d::FadeIn::create(AniMiscUtils::StandardAnimationTime));
AniLevelViews[index]->setChosen(true, true);
} else {
AniLevelViews[_selectedLevelIndex]->setOpacity(0);
AniLevelViews[_selectedLevelIndex]->setChosen(false, false);
AniLevelViews[index]->setOpacity(255);
AniLevelViews[index]->setChosen(true, false);
}
_selectedLevelIndex = index;
}
}
int AniSimpleLevelPickerView::getPickedLevelIndex(){
return _selectedLevelIndex;
}
void AniSimpleLevelPickerView::addOnLevelChangedCallback(std::function<void(int)> onLevelChanged){
_onLevelChanged = onLevelChanged;
}
void AniSimpleLevelPickerView::loadPropertiesFromJSON(const rapidjson::Value& jsonValue, AniLayoutViewInterface* scene, const std::string resFolder, const std::string altResFolder)
{
setAnchorPoint(cocos2d::Vec2(0.5,0.5));
this->loadCommonPropertiesFromJSON(jsonValue);
}
void AniSimpleLevelPickerView::prepareTouchHandlers()
{
auto touchListener = cocos2d::EventListenerTouchOneByOne::create();
touchListener->onTouchBegan = [&](cocos2d::Touch* touch, cocos2d::Event* event){
return AniGeometryUtils::getBoundingBoxToWorld(this).containsPoint(touch->getLocation());
// if(getBoundingBox().containsPoint(touch->getLocation())){
// return true;
// }
// return false;
};
touchListener->onTouchEnded = [&](cocos2d::Touch* touch, cocos2d::Event* event){
if(AniGeometryUtils::getBoundingBoxToWorld(this).containsPoint(touch->getLocation())){
selectLevelIndex((_selectedLevelIndex+1)%AniLevelViews.size(), true);
if(_onLevelChanged != nullptr){
_onLevelChanged(_selectedLevelIndex);
}
}
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);
}