// // AniLevelPickerView.cpp // HalloweenSpaceInvaders-mobile // // Created by Katarzyna Kalinowska-Górska on 29/09/2019. // #include #include "AniLevelPickerView.h" #include "AniGeometryUtils.h" #include "AniMiscUtils.h" AniLevelPickerView* AniLevelPickerView::create(const std::vector& levelImagePaths, const std::vector& levelNames){ AniLevelPickerView * view = new (std::nothrow) AniLevelPickerView(); if(view && view->init(levelImagePaths, levelNames)) { view->autorelease(); return view; } CC_SAFE_DELETE(view); return nullptr; } bool AniLevelPickerView::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 AniLevelPickerView::reloadLevels(const std::vector& levelImagePaths, const std::vector& levelNames){ for(auto oldAniLevelView : AniLevelViews){ oldAniLevelView->removeFromParent(); } AniLevelViews.clear(); float maxHeight = 0; float sumWidth = 0; for(int i = 0; i < levelImagePaths.size(); ++i){ auto newAniLevelView = levelNames.size() == levelImagePaths.size() ? AniLevelView::create(levelImagePaths[i], levelNames[i]) : AniLevelView::create(levelImagePaths[i]); addChild(newAniLevelView); AniLevelViews.emplace_back(newAniLevelView); sumWidth += newAniLevelView->getBoundingBox().size.width; maxHeight = MAX(newAniLevelView->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 < AniLevelViews.size(); ++i){ auto AniLevelView = AniLevelViews[i]; AniLevelView->setPosition(AniLevelView->getBoundingBox().size.width/2 + padding*(4*i+0.5), contentSize.height/2); } _selectedLevelIndex = 0; AniLevelViews[_selectedLevelIndex]->setChosen(true, false); } void AniLevelPickerView::selectLevelIndex(int index, bool animated){ if(_selectedLevelIndex != index){ if(animated){ AniLevelViews[_selectedLevelIndex]->setChosen(false, true); AniLevelViews[index]->setChosen(true, true); } else { AniLevelViews[_selectedLevelIndex]->setChosen(false, false); AniLevelViews[index]->setChosen(true, false); } _selectedLevelIndex = index; } } int AniLevelPickerView::getPickedLevelIndex(){ return _selectedLevelIndex; } void AniLevelPickerView::startAnimatingLevelPicture(int index){ // AniLevelViews[_selectedLevelIndex]->runAction(cocos2d::RepeatForever::create(cocos2d::Blink::create(0.2f, 1))); AniLevelViews[_selectedLevelIndex]->startAnimatingLevelPicture(); //->runAction(cocos2d::RepeatForever::create(cocos2d::Sequence::create(cocos2d::JumpTo::create(0.4f, AniLevelViews[_selectedLevelIndex]->getPosition(), AniLevelViews[_selectedLevelIndex]->getBoundingBox().size.height/10, 1), cocos2d::DelayTime::create(0.f), nullptr))); // AniLevelViews[_selectedLevelIndex]->runAction(cocos2d::RepeatForever::create(cocos2d::Sequence::create(cocos2d::RotateBy::create(0.2f, 360), cocos2d::DelayTime::create(0.f), nullptr))); } void AniLevelPickerView::addOnLevelChangedCallback(std::function onLevelChanged){ _onLevelChanged = onLevelChanged; } void AniLevelPickerView::prepareTouchHandlers() { auto touchListener = cocos2d::EventListenerTouchOneByOne::create(); touchListener->onTouchBegan = [&](cocos2d::Touch* touch, cocos2d::Event* event){ return _enabled && AniMiscUtils::isNodeVisible(this) && AniGeometryUtils::getBoundingBoxToWorld(this).containsPoint(touch->getLocation()); }; touchListener->onTouchEnded = [&](cocos2d::Touch* touch, cocos2d::Event* event){ if(!_enabled){ return; } for(int i = 0; i < AniLevelViews.size(); ++i){ if(AniGeometryUtils::getBoundingBoxToWorld(AniLevelViews[i]).containsPoint(touch->getLocation())){ selectLevelIndex(i, true); if(_onLevelChanged != nullptr){ _onLevelChanged(i); } break; } } }; _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); } void AniLevelPickerView::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); }