// // LevelPickerView.cpp // HalloweenSpaceInvaders-mobile // // Created by Katarzyna Kalinowska-Górska on 29/09/2019. // #include #include "LevelPickerView.h" #include "GeometryUtils.h" #include "MiscUtils.h" LevelPickerView* LevelPickerView::create(const std::vector& levelImagePaths, const std::vector& levelNames){ LevelPickerView * view = new (std::nothrow) LevelPickerView(); if(view && view->init(levelImagePaths, levelNames)) { view->autorelease(); return view; } CC_SAFE_DELETE(view); return nullptr; } bool LevelPickerView::init(const std::vector& levelImagePaths, const std::vector& levelNames){ // assert(levelNames.size() == levelImagePaths.size()); if(!cocos2d::Node::init()){ return false; } setCascadeOpacityEnabled(true); reloadLevels(levelImagePaths, levelNames); _onLevelChanged = nullptr; prepareTouchHandlers(); return true; } void LevelPickerView::reloadLevels(const std::vector& levelImagePaths, const std::vector& levelNames){ for(auto oldLevelView : levelViews){ oldLevelView->removeFromParent(); } levelViews.clear(); float maxHeight = 0; float sumWidth = 0; for(int i = 0; i < levelImagePaths.size(); ++i){ auto newLevelView = levelNames.size() == levelImagePaths.size() ? LevelView::create(levelImagePaths[i], levelNames[i]) : LevelView::create(levelImagePaths[i]); addChild(newLevelView); levelViews.emplace_back(newLevelView); sumWidth += newLevelView->getBoundingBox().size.width; maxHeight = MAX(newLevelView->getBoundingBox().size.height, maxHeight); } auto padding = sumWidth/levelImagePaths.size()/3; auto contentSize = cocos2d::Size(sumWidth+padding*3, maxHeight); setContentSize(contentSize); for(int i = 0; i < levelViews.size(); ++i){ auto levelView = levelViews[i]; levelView->setPosition(levelView->getBoundingBox().size.width/2 + padding*(4*i+0.5), contentSize.height/2); } _selectedLevelIndex = 0; levelViews[_selectedLevelIndex]->setChosen(true, false); } void LevelPickerView::selectLevelIndex(int index, bool animated){ if(_selectedLevelIndex != index){ if(animated){ levelViews[_selectedLevelIndex]->setChosen(false, true); levelViews[index]->setChosen(true, true); } else { levelViews[_selectedLevelIndex]->setChosen(false, false); levelViews[index]->setChosen(true, false); } _selectedLevelIndex = index; } } int LevelPickerView::getPickedLevelIndex(){ return _selectedLevelIndex; } void LevelPickerView::addOnLevelChangedCallback(std::function onLevelChanged){ _onLevelChanged = onLevelChanged; } void LevelPickerView::prepareTouchHandlers() { auto touchListener = cocos2d::EventListenerTouchOneByOne::create(); touchListener->onTouchBegan = [&](cocos2d::Touch* touch, cocos2d::Event* event){ return MiscUtils::isNodeVisible(this) && GeometryUtils::getBoundingBoxToWorld(this).containsPoint(touch->getLocation()); }; touchListener->onTouchEnded = [&](cocos2d::Touch* touch, cocos2d::Event* event){ for(int i = 0; i < levelViews.size(); ++i){ if(GeometryUtils::getBoundingBoxToWorld(levelViews[i]).containsPoint(touch->getLocation())){ selectLevelIndex(i, true); if(_onLevelChanged != nullptr){ _onLevelChanged(i); } break; } } }; _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); } void LevelPickerView::loadPropertiesFromJSON(const rapidjson::Value& jsonValue, LayoutViewInterface* scene, const std::string resFolder, const std::string altResFolder) { setAnchorPoint(cocos2d::Vec2(0.5,0.5)); this->loadCommonPropertiesFromJSON(jsonValue); }