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