void XOrderIndicate::OnCreate() { // 터치를 허용하는 윈도우들의 목록처리 if( m_spProp->m_aryIdsAllow.size() > 0 ) { for( auto& idsAllow : m_spProp->m_aryIdsAllow ) { if( !idsAllow.empty() ) { GAME->SetActive( true ); GAME->AddidsAllowWnd( idsAllow ); CreateIndicator( idsAllow ); } } } if( m_spProp->m_aryIdsTarget.size() ) { // 타겟리스트가 있을때 bool bFound = false; for( auto& idsTarget : m_spProp->m_aryIdsTarget ) { if( !idsTarget.empty() ) { // 각타겟에 인디케이터를 생성한다. bFound = CreateIndicator(); } else { CONSOLE( "%s:ids_target(%s)찾을수 없음.", __TFUNC__, C2SZ(idsTarget) ); } } if( !bFound ) m_timerSec.Set( 1.f ); // 1초에 한번씩 재검색하기 위해 // 아직 창이 안떳다든가 하는이유로 타겟팅에 실패하면 process에서 다시 찾는다. if( m_spProp->m_typeEnd == xFIN_PUSH_TARGET ) { GAME->SetActive( true ); // 입력을 모두 풀고 GAME->AddidsAllowWnd( m_spProp->m_aryIdsTarget ); } } else { // end조건이 order_complete이면 좌표가 반드시 있어야 한다.(뭔가 이상하군) XBREAK( m_spProp->m_typeEnd != xFIN_ORDER_COMPLETE && m_spProp->m_vPos.IsZero() ); if( m_spProp->m_secLife > 0 ) { m_timerFinish.Set( m_spProp->m_secLife ); } else { // if( m_spProp->m_aryIdsTarget.size() == 0 ) // m_timerFinish.Set( 10.f ); // 타겟이 없는 화살표는 10초후에 자동으로 종료된다. } if( m_spProp->m_idsRoot.empty() ) CreateSpr( m_spProp->m_vPos, GAME->GetpScene(), XE::VEC2(0) ); else { XWnd *pRoot = GAME->Find( m_spProp->m_idsRoot ); if( XASSERT( pRoot ) ) { CreateSpr( pRoot, m_spProp->m_idsRoot ); } // CreateSpr( m_spProp->m_vPos, pRoot, std::string() ); } } if( m_spProp->m_typeEnd == xFIN_ORDER_COMPLETE ) { GAME->SetActive( true ); } }
void XOrderIndicate::Process( float dt ) { if( m_timerSec.IsOver() ) { if( CreateIndicator() == false ) { if( ++m_numFailed >= 3 ) SetbEnd( true ); // 타겟을 3초간 못찾으면 그냥 끝냄. } m_timerSec.Reset(); } // 시간되면 자동 종료 if( m_timerFinish.IsOver() ) { // 이 인디케이터가 다른 order의 end가 종료시점일때 if( GetspProp()->m_typeEnd == xFIN_END_ORDER ) { auto spOrderProp = m_spPropSeq->GetspOrderProp( GetspProp()->m_idsEnd ); if( XASSERT(spOrderProp) ) { // 그 다른 order가 touch방식이 아닐때만 자동 사라짐. if( spOrderProp->m_typeEnd != xFIN_TOUCH ) { CONSOLE("XOrderIndicate::Process:시간초과로 자동 종료됨."); SetbEnd( true ); m_timerFinish.Off(); } else { m_timerFinish.Off(); // 더이상 검사하지 않도록. } } } else if( GetspProp()->m_typeEnd == xFIN_DELAY ) { m_timerFinish.Off(); SetbEnd( true ); } } }
// Create controls on dialog box // Four colums of 32 button-controls // For each button dispaly Button number and an edit box // The edit box will accept channel number (1-24) void SppBtnsDlg::CreateControls(UINT nButtons) { // Set the upper-left corner as starting point POINT OrigPt; OrigPt.x = OrigPt.y = 10; for (UINT i=1; i<=nButtons; i++) { CreateButtonLable(i); CreateChannelEdit(i); CreateIndicator(i); }; }
bool XOrderIndicate::CreateIndicator() { if( m_bTargeted ) return true; int numFounds = 0; bool bOk = false; XBREAK( m_spProp->m_aryIdsTarget.size() == 0 ); for( auto& idsTarget : m_spProp->m_aryIdsTarget ) { bool bOk = CreateIndicator( idsTarget ); if( bOk ) { ++numFounds; } } // 리스트에있는 모든 윈도우를 다 찾았을경우면 true한다. 누락되면 계속 찾기를 시도한다. if( m_spProp->m_aryIdsTarget.size() == numFounds ) { m_bTargeted = true; } return bOk; }