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