double atan(double arg) { if(arg > 0) return satan(arg); return -satan(-arg); }
//Notifie le jeu qu'un Hero est mort void CGameEngine::heroDied(boost::shared_ptr<CHero> deadHero) { deadHero->setActive(false); bool areAllPlayerDead = true; for(std::map<Int8, CPlayer>::const_iterator i=m_players.begin(); i != m_players.end(); i++) if(i->second.getEntity()->isActive()) areAllPlayerDead = false; if(areAllPlayerDead) { CLog::debug("Partie perdu"); pause(); boost::shared_ptr<CGameLostState> loseState(new CGameLostState()); pushState(loseState); } else { boost::shared_ptr<IModel> satanModel = getResEngine()->getModel("Satan"); satanModel->setAnim("Fly"); boost::shared_ptr<CSatanModel> model(new CSatanModel(deadHero->getModel(),satanModel)); boost::shared_ptr<IEntity> satan(new CSatan(200,deadHero,model)); satan->setDim(sf::Vector2f(140,200)); addEntity(satan); } }
// 数字1字を認識する int ExtractNumber::number(cv::Mat character) { // 輪郭抽出で分別する // 12357, 0469, 8 /// @see http://opencv.jp/cookbook/opencv_img.html#id54 std::vector<std::vector<cv::Point> > contours; // 輪郭情報 std::vector<cv::Vec4i> hierarchy; // 階層構造 // 2値画像,輪郭(出力),階層構造(出力),輪郭抽出モード,輪郭の近似手法 cv::findContours(character, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE); // 8, 02469, 12357 // 輪郭数で分別する if ( 3 == hierarchy.size()) { return 8; } else if( 2 == hierarchy.size() ) { // 6, 049 // 第2輪郭始点が上部3分の1にないとき6 if ( contours[1][0].y > (character.rows/3) ) { return 6; } else { // 9, 04 // 中央部の縦の輝点パターン // 9: 10101 // 0,4: 101 if( 3 == rowBrightPattern(character, character.cols/2) ) { return 9; }else { // 4, 0 // 右端の上から3分の1に輝点があるとき0 int u = utan(character); if ( 0 < character.data[character.rows/3*character.cols+u] ) { return 0; }else { return 4; } } } } else if ( 1 == hierarchy.size() ) { // 17, 235 // 左端の輝点パターン // 17: 1 // 235: 101 int s = satan(character); switch (rowBrightPattern(character, s) ) { case 1: // 1, 7 // 中央部の縦の輝点パターン // 1: 1 // 7: 101 switch (rowBrightPattern(character, character.cols/2)) { case 1: return 1; case 2: return 7; default: return 0; } case 2: // 5, 23 // 右端の上から3分の1に暗点があるとき5 int u = utan(character); if ( 0 == character.data[character.rows/3*character.cols+u] ) { return 5; } // 2, 3 // 右端の上から3分の2に暗点があるとき2 if ( 0 == character.data[character.rows/3*2*character.cols+u] ) { return 2; } return 3; } } return 0; }