void addData(ObjectProperties::SPtr properties, sfe::Data data) { if(!data || !data.displayed()) return; auto storageType = data.supportedType(); auto typeTrait = data.typeInfo(); std::string valueType; int columnCount = 1; bool fixedSize = false; if(typeTrait && typeTrait->ValidInfo()) { valueType = typeTrait->ValueType()->name(); columnCount = typeTrait->size(); fixedSize = typeTrait->FixedSize(); } BaseValueWrapper::SPtr wrapper; switch(storageType) { case sfe::Data::DataType::Int: wrapper = createProp<int>(data); break; case sfe::Data::DataType::Float: wrapper = createProp<float>(data); break; case sfe::Data::DataType::Double: wrapper = createProp<double>(data); break; case sfe::Data::DataType::String: wrapper = createProp<std::string>(data); break; case sfe::Data::DataType::Vector_Int: wrapper = createVectorProp<int>(data, fixedSize, columnCount); break; case sfe::Data::DataType::Vector_Float: wrapper = createVectorProp<float>(data, fixedSize, columnCount); break; case sfe::Data::DataType::Vector_Double: wrapper = createVectorProp<double>(data, fixedSize, columnCount); break; case sfe::Data::DataType::Vector_String: wrapper = createVectorProp<std::string>(data, fixedSize, columnCount); break; } auto prop = wrapper->property(); if (valueType == "bool") prop->value()->baseMetaContainer().add(meta::Checkbox()); properties->addProperty(wrapper->property()); properties->addValueWrapper(wrapper); }
bool SweeperStatisticsScene::init() { if (!BaseScene::init()) { return false; } // 创建时代显示标签; m_labelGeneration = Label::createWithSystemFont("Generation: 0", "Arial", 20); m_labelGeneration->setAnchorPoint(Vec2(0, 1)); m_labelGeneration->setPosition(DISPLAY->left(), DISPLAY->top()); this->addChild(m_labelGeneration); // 创建切换按钮; auto label = Label::createWithSystemFont("Switch Live", "Arial", 20); auto item = MenuItemLabel::create(label, [=](Ref *) { auto scene = SweeperLiveScene::create(); Director::getInstance()->replaceScene(scene); }); auto menu = Menu::create(item, nullptr); menu->setPosition(DISPLAY->right()-100, DISPLAY->top()-20); this->addChild(menu); // 创建地雷; for (int i=0; i<CONSTANTS.MineNumber; ++i) { auto mine = MineObject::create(nullptr); m_mines.insert(mine); // 设置随机位置; mine->setFixedPosition(this->randomFixedPosition()); } // 创建sweeper; for (int i=0; i<CONSTANTS.SweeperNumber; ++i) { auto sweeper = SweeperObject::create(nullptr); sweeper->setFixedSize(FixedSize(20, 20)); m_sweepers.push_back(sweeper); // 设置随机位置; sweeper->setFixedPosition(this->randomFixedPosition()); // 设置基因; const auto &genes = GeneticAlgorithm::instance()->getGenome(i); sweeper->setGenome(genes); } // 创建统计曲线渲染器; m_coordinateRenderer = DrawNode::create(); this->addChild(m_coordinateRenderer); m_bestFitnessRenderer = DrawNode::create(); this->addChild(m_bestFitnessRenderer); m_averageFitnessRenderer = DrawNode::create(); this->addChild(m_averageFitnessRenderer); m_worstFitnessRenderer = DrawNode::create(); this->addChild(m_worstFitnessRenderer); m_labelBestFitness = Label::createWithSystemFont("", "Arial", 18); m_labelBestFitness->setPosition(200, 550); m_labelBestFitness->setTextColor(Color4B(0, 255, 0, 255)); this->addChild(m_labelBestFitness); m_labelAverageFitness = Label::createWithSystemFont("", "Arial", 18); m_labelAverageFitness->setPosition(400, 550); m_labelAverageFitness->setTextColor(Color4B(0, 0, 255, 255)); this->addChild(m_labelAverageFitness); m_labelWorstFitness = Label::createWithSystemFont("", "Arial", 18); m_labelWorstFitness->setPosition(600, 550); m_labelWorstFitness->setTextColor(Color4B(255, 0, 0, 255)); this->addChild(m_labelWorstFitness); // 开始时代; this->startGeneration(); // 绘制统计图; this->drawStatistics(); // 注册更新回调; this->scheduleUpdate(); return true; }
bool SweeperLiveScene::init() { if (!BaseScene::init()) { return false; } // 创建时代显示标签; m_labelGeneration = Label::createWithSystemFont("Generation: 0", "Arial", 20); m_labelGeneration->setAnchorPoint(Vec2(0, 1)); m_labelGeneration->setPosition(DISPLAY->left(), DISPLAY->top()); this->addChild(m_labelGeneration); // 创建切换按钮; auto label = Label::createWithSystemFont("Switch Statistics", "Arial", 20); auto item = MenuItemLabel::create(label, [=](Ref *) { auto scene = SweeperStatisticsScene::create(); Director::getInstance()->replaceScene(scene); return; }); auto menu = Menu::create(item, nullptr); menu->setPosition(DISPLAY->right()-100, DISPLAY->top()-20); this->addChild(menu); // 创建地雷; for (int i=0; i<CONSTANTS.MineNumber; ++i) { MineView *mineView = nullptr; mineView = MineView::create(); this->addChild(mineView); auto mine = MineObject::create(mineView); m_mines.insert(mine); // 设置随机位置; mine->setFixedPosition(this->randomFixedPosition()); } // 创建sweeper; for (int i=0; i<CONSTANTS.SweeperNumber; ++i) { SweeperView *sweeperView = nullptr; sweeperView = SweeperView::create(); this->addChild(sweeperView); auto sweeper = SweeperObject::create(sweeperView); sweeper->setFixedSize(FixedSize(20, 20)); m_sweepers.push_back(sweeper); // 设置随机位置; sweeper->setFixedPosition(this->randomFixedPosition()); // 设置基因; const auto &genes = GeneticAlgorithm::instance()->getGenome(i); sweeper->setGenome(genes); } // 开始新时代; this->startGeneration(); // 注册回调; this->scheduleUpdate(); return true; }