예제 #1
0
void CNrpLaborMarket::CreateNewFreeUsers()
{
	USERS coders, designer, composer, tester;
	core::map< NrpText, USERS* > group;
	group[ NrpCoder::ClassName() ] = &coders;
	group[ NrpDesigner::ClassName() ] = &designer;
	group[ NrpComposer::ClassName() ] = &composer;
	group[ NrpTester::ClassName() ] = &tester;

	for( u32 i=0; i < _users.size(); i++ )
	{
		CNrpUser* user = _users[ i ];
		NrpText typeName = user->ObjectTypeName();
		if( (*user)[ PARENTCOMPANY ].As<PNrpCompany>() != NULL )
			continue;

		if( core::map< NrpText, USERS* >::Node* node = group.find( typeName ) )
			node->getValue()->push_back( user );
	}

	size_t USER_GROUP_COUNT = 6;

	core::map< NrpText, USERS* >::Iterator gIter = group.getIterator();
	for( ; !gIter.atEnd(); gIter++ )
	{
		USERS& tmpList = *(gIter->getValue());
		for( u32 k=0; k < tmpList.size(); k++ )
			RemoveUser( tmpList[ k ] );

		tmpList.clear();

		for( size_t cnt=tmpList.size(); cnt < USER_GROUP_COUNT; cnt++ )
			tmpList.push_back( CreateRandomUser( gIter->getKey() ) );
	}

	gIter = group.getIterator();
	for( ; !gIter.atEnd(); gIter++ )
		for( u32 cnt=0; cnt < gIter->getValue()->size(); cnt++ )
			_users.push_back( (*gIter->getValue())[ cnt ] );

	if( _self[ USERNUMBER ] != static_cast< int >( _users.size() ) )
		PCall( APP_USER_MARKETUPDATE, NULL );

	_self[ USERNUMBER ] = static_cast< int >( _users.size() );
}
예제 #2
0
bool CNrpMainScene::OnEvent( const irr::SEvent& event )						//обработка событий
{
	switch( event.EventType ) 
	{	//события от гуи
		case EET_GUI_EVENT:
		{
			s32 id = event.GUIEvent.Caller->getID();		
            //если было вызвано не перехваченное нажатие кнопки 
			switch( event.GUIEvent.EventType )
			{
				//а может это дернули скролбар
				case gui::EGET_SCROLL_BAR_CHANGED:
				{
					gui::CNrpScrollBar* scr = (gui::CNrpScrollBar*)event.GUIEvent.Caller;
					//и к этому скроллбару повесили функцию луа
					if( scr->getAction().size() )
					{	//попытаемся её выполнить
						nrp::CNrpScript::Instance().CallFunction( scr->getAction(), scr );
						return true;
					}
				}					
				break;
			}
		}
		break;
		//если произошло неперехваченное событие от клавы
		case EET_KEY_INPUT_EVENT:
		{	//отдадим его на обработку
			PCall( SCENE_KEY_INPUT_EVENT, this, (void*)&event );
		}
		break;
		//последними обрабатываем события мышки
		case EET_MOUSE_INPUT_EVENT:
		{
			switch( event.MouseInput.Event )
			{		 	
				//нажатие пкм произошло вне гуи
				case EMIE_RMOUSE_LEFT_UP:	
					 PCall( SCENE_RMOUSE_LEFT_UP, this );
				break;
				//вне гуи произошло нажатие лкм
				case EMIE_LMOUSE_LEFT_UP:
				{		
					//попробуем найти объект сцены к которому попытались обратиться
					gui::IGUIEnvironment* guienv = _nrpEngine.GetGuiEnvironment();
					if( guienv->isHovered( guienv->getRootGUIElement() ) ) //проверяем на пересечение если курсор не находится над гуи
					{
						core::vector3df pnt;
						GetNodeAndIntersectionFromCursor_( selectedNode_, pnt, twinLeftMouseClick_);					
					}
					
					//вызываем событие луа
					mouseSceneBLeftEvent_ = true;
				}
				break;

				case EMIE_MOUSE_MOVED:
				{	//обрабатываем событие перемещения мышки
					PCall( SCENE_MOUSE_MOVED, this );
				}
				break;
				
			}
			return false;
				
		}
		break;

		case EET_USER_EVENT:
		{
			//DoLuaFunctionsByType( SCENE_USER_EVENT, (void*)&event );
		}
		break;
	}
	return false;
}
예제 #3
0
//один кадр сцены
void CNrpMainScene::OnUpdate()
{
	try
	{
		video::IVideoDriver* driver = _nrpEngine.GetVideoDriver();
		
		//вызываем событие луа до начала сцены
		PCall( SCENE_BEFORE_BEGIN, this );
		driver->beginScene( true, true, video::SColor(150,50,50,50) );
		
		try
		{
			//вызываем событие луа до рендера сцены
			PCall( SCENE_BEFORE_RENDER, this );
			//рендерим сцену
			RenderScene_();
			//вызываем событие луа после рендера сцены
			PCall( SCENE_AFTER_RENDER, this );			

			//отладочная вещь для просмотра выделенных объектов
			try
			{
				if( selectedNode_ != NULL && IsObjectChildOfScene_( selectedNode_ ) )
				{				
					video::SMaterial mat;
					mat.Thickness = 2;
					driver->setMaterial( mat );
					driver->setTransform(video::ETS_WORLD, core::IdentityMatrix );
					core::aabbox3df bbox = selectedNode_->getBoundingBox();
					selectedNode_->setDebugDataVisible( true );
					selectedNode_->getAbsoluteTransformation().transformBoxEx( bbox );

					driver->draw3DBox( bbox, video::SColor( 0xff, 0xff, 0, 0 ) );

					mat.Thickness = 1;
					driver->setMaterial( mat );
				}
				else
					selectedNode_ = NULL;
			}
			catch(...)
			{
				selectedNode_ = NULL;
			}
		}
		catch(...)
		{
			//ErrLog( gfx ) << all << "Ошибка RenderScene" << term;
		}
			
		driver->endScene();
		//вызываем событие луа после завершения рендера сцены
		PCall( SCENE_AFTER_END, this );
	
		if( mouseSceneBLeftEvent_ && ( GetTickCount() - lastTimeNodeSelect_ > 200) )
		{
			PCall( twinLeftMouseClick_ ? SCENE_LMOUSE_DOUBLE_CLICK : SCENE_LMOUSE_LEFT_UP, selectedNode_ );
			mouseSceneBLeftEvent_ = false;
			twinLeftMouseClick_ = false;
		}

        _nrpEngine.GetDevice()->yield();
	}
	catch(...)
	{
		//ErrLog(gfx) << all << "Ошибка основной сцены" << term;
	}
}