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