// // SimpleLevelPickerView.cpp // HalloweenSpaceInvaders-mobile // // Created by Katarzyna Kalinowska-Górska on 01/10/2019. // #include #include "SimpleLevelPickerView.h" #include "MiscUtils.h" #include "GeometryUtils.h" SimpleLevelPickerView* SimpleLevelPickerView::create(std::vector levelImagePaths){ SimpleLevelPickerView * view = new (std::nothrow) SimpleLevelPickerView(); if(view && view->init(levelImagePaths)) { view->autorelease(); return view; } CC_SAFE_DELETE(view); return nullptr; } bool SimpleLevelPickerView::init(std::vector levelImagePaths){ if(!cocos2d::Node::init()){ return false; } for(auto levelImagePath : levelImagePaths){ auto newLevelView = LevelView::create(levelImagePath); addChild(newLevelView); levelViews.emplace_back(newLevelView); newLevelView->setCascadeOpacityEnabled(true); newLevelView->setOpacity(0); auto contentSize = getContentSize(); contentSize = cocos2d::Size(MAX(contentSize.width, newLevelView->getBoundingBox().size.width), MAX(contentSize.height, newLevelView->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 SimpleLevelPickerView::selectLevelIndex(int index, bool animated){ if(_selectedLevelIndex != index){ if(animated){ levelViews[_selectedLevelIndex]->runAction(cocos2d::FadeOut::create(MiscUtils::StandardAnimationTime)); levelViews[_selectedLevelIndex]->setChosen(false, true); levelViews[index]->runAction(cocos2d::FadeIn::create(MiscUtils::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 SimpleLevelPickerView::getPickedLevelIndex(){ return _selectedLevelIndex; } void SimpleLevelPickerView::addOnLevelChangedCallback(std::function onLevelChanged){ _onLevelChanged = onLevelChanged; } void SimpleLevelPickerView::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); } void SimpleLevelPickerView::prepareTouchHandlers() { auto touchListener = cocos2d::EventListenerTouchOneByOne::create(); touchListener->onTouchBegan = [&](cocos2d::Touch* touch, cocos2d::Event* event){ return GeometryUtils::getBoundingBoxToWorld(this).containsPoint(touch->getLocation()); // if(getBoundingBox().containsPoint(touch->getLocation())){ // return true; // } // return false; }; touchListener->onTouchEnded = [&](cocos2d::Touch* touch, cocos2d::Event* event){ if(GeometryUtils::getBoundingBoxToWorld(this).containsPoint(touch->getLocation())){ selectLevelIndex((_selectedLevelIndex+1)%levelViews.size(), true); if(_onLevelChanged != nullptr){ _onLevelChanged(_selectedLevelIndex); } } }; _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); }