⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listener.cpp

📁 本人刚学游戏编程时开发的一个游戏项目《魔幻森林》中的地图编辑器源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		char cScaleX[20];
		char cScaleY[20];
		char cScaleZ[20];
		char cAngleY[20];
		char tmp[20];
		sprintf(tmp, "grass%d", i+1);    
		GetPrivateProfileString(tmp , "posX" , "\0" , cPosX , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "posY" , "\0" , cPosY , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "posZ" , "\0" , cPosZ , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "scaleX" , "\0" , cScaleX , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "scaleY" , "\0" , cScaleY , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "scaleZ" , "\0" , cScaleZ , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "angleY" , "\0" , cAngleY , 20 ,".\\MagicForest.map");
		SceneNode* snGrass=NULL;
		snGrass=m_sceneMgr->getRootSceneNode()->createChildSceneNode(tmp);
		snGrass->attachObject(m_sceneMgr->createEntity(tmp, "grass.mesh"));	
		snGrass->scale((float)atof(cScaleX),(float)atof(cScaleY),(float)atof(cScaleZ));
		snGrass->yaw((Radian)atof(cAngleY));
		snGrass->translate((float)atof(cPosX) ,(float)atof(cPosY) , (float)atof(cPosZ));
		MAPOBJECT tmpGrass;
		tmpGrass.name=tmp;
		tmpGrass.pos=snGrass->getPosition();
		tmpGrass.scale=snGrass->getScale();
		tmpGrass.angleY=(float)atof(cAngleY);
		m_vecGrass.push_back(tmpGrass);
	}
	//花
	for(int i=0 ; i<m_iFlowerCount ; i++)
	{
		char cPosX[20];
		char cPosY[20];
		char cPosZ[20];
		char cScaleX[20];
		char cScaleY[20];
		char cScaleZ[20];
		char cAngleY[20];
		char tmp[20];
		sprintf(tmp, "flower%d", i+1);    
		GetPrivateProfileString(tmp , "posX" , "\0" , cPosX , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "posY" , "\0" , cPosY , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "posZ" , "\0" , cPosZ , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "scaleX" , "\0" , cScaleX , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "scaleY" , "\0" , cScaleY , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "scaleZ" , "\0" , cScaleZ , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "angleY" , "\0" , cAngleY , 20 ,".\\MagicForest.map");
		SceneNode* snFlower=NULL;
		snFlower=m_sceneMgr->getRootSceneNode()->createChildSceneNode(tmp);
		snFlower->attachObject(m_sceneMgr->createEntity(tmp, "grass.mesh"));	
		snFlower->scale((float)atof(cScaleX),(float)atof(cScaleY),(float)atof(cScaleZ));
		snFlower->yaw((Radian)atof(cAngleY));
		snFlower->translate((float)atof(cPosX) ,(float)atof(cPosY) , (float)atof(cPosZ));
		MAPOBJECT tmpFlower;
		tmpFlower.name=tmp;
		tmpFlower.pos=snFlower->getPosition();
		tmpFlower.scale=snFlower->getScale();
		tmpFlower.angleY=(float)atof(cAngleY);
		m_vecFlower.push_back(tmpFlower);
	}
	//房子
	for(int i=0 ; i<m_iHouseCount ; i++)
	{
		char cPosX[20];
		char cPosY[20];
		char cPosZ[20];
		char cScaleX[20];
		char cScaleY[20];
		char cScaleZ[20];
		char cAngleY[20];
		char tmp[20];
		sprintf(tmp, "house%d", i+1);    
		GetPrivateProfileString(tmp , "posX" , "\0" , cPosX , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "posY" , "\0" , cPosY , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "posZ" , "\0" , cPosZ , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "scaleX" , "\0" , cScaleX , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "scaleY" , "\0" , cScaleY , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "scaleZ" , "\0" , cScaleZ , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "angleY" , "\0" , cAngleY , 20 ,".\\MagicForest.map");
		SceneNode* snHouse=NULL;
		snHouse=m_sceneMgr->getRootSceneNode()->createChildSceneNode(tmp);
		snHouse->attachObject(m_sceneMgr->createEntity(tmp, "grass.mesh"));	
		snHouse->scale((float)atof(cScaleX),(float)atof(cScaleY),(float)atof(cScaleZ));
		snHouse->yaw((Radian)atof(cAngleY));
		snHouse->translate((float)atof(cPosX) ,(float)atof(cPosY) , (float)atof(cPosZ));
		MAPOBJECT tmpHouse;
		tmpHouse.name=tmp;
		tmpHouse.pos=snHouse->getPosition();
		tmpHouse.scale=snHouse->getScale();
		tmpHouse.angleY=(float)atof(cAngleY);
		m_vecHouse.push_back(tmpHouse);
	}
	//摄像机
	for(int i=0 ; i<m_iCameraCount ; i++)
	{
		char cPosX[20];
		char cPosY[20];
		char cPosZ[20];
		char cScaleX[20];
		char cScaleY[20];
		char cScaleZ[20];
		char cAngleY[20];
		char tmp[20];
		sprintf(tmp, "camera%d", i+1);    
		GetPrivateProfileString(tmp , "posX" , "\0" , cPosX , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "posY" , "\0" , cPosY , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "posZ" , "\0" , cPosZ , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "scaleX" , "\0" , cScaleX , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "scaleY" , "\0" , cScaleY , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "scaleZ" , "\0" , cScaleZ , 20 ,".\\MagicForest.map");
		GetPrivateProfileString(tmp , "angleY" , "\0" , cAngleY , 20 ,".\\MagicForest.map");
		SceneNode* snCamera=NULL;
		snCamera=m_sceneMgr->getRootSceneNode()->createChildSceneNode(tmp);
		snCamera->attachObject(m_sceneMgr->createEntity(tmp, "grass.mesh"));	
		snCamera->scale((float)atof(cScaleX),(float)atof(cScaleY),(float)atof(cScaleZ));
		snCamera->yaw((Radian)atof(cAngleY));
		snCamera->translate((float)atof(cPosX) ,(float)atof(cPosY) , (float)atof(cPosZ));
		MAPOBJECT tmpCamera;
		tmpCamera.name=tmp;
		tmpCamera.pos=snCamera->getPosition();
		tmpCamera.scale=snCamera->getScale();
		tmpCamera.angleY=(float)atof(cAngleY);
		m_vecCamera.push_back(tmpCamera);
	}
	MessageBox(NULL,"MagicForest.map载入成功!","地图载入",0);
}

void CListener::selectTree()
{
	m_iObjectType=1;
	m_snTree->setVisible(true);
	m_snCurrentObject=m_snTree;
}
void CListener::selectRock()
{
	m_iObjectType=2;
	m_snRock->setVisible(true);
	m_snCurrentObject=m_snRock;
}
void CListener::selectGrass()
{
	m_iObjectType=3;
	m_snGrass->setVisible(true);
	m_snCurrentObject=m_snGrass;
}
void CListener::selectFlower()
{
	m_iObjectType=4;
	m_snFlower->setVisible(true);
	m_snCurrentObject=m_snFlower;
}
void CListener::selectHouse()
{
	m_iObjectType=5;
	m_snHouse->setVisible(true);
	m_snCurrentObject=m_snHouse;
}
void CListener::selectCamera()
{
	m_iObjectType=6;
	m_snCamera->setVisible(true);
	m_snCurrentObject=m_snCamera;
}

bool CListener::frameStarted(const FrameEvent& evt)
{
	ExampleFrameListener::frameStarted(evt);
	if (mInputDevice->isKeyDown(KC_W)) 
	{
		moveCamera(0,0,Vector3(0,0,-10));
	}
	if (mInputDevice->isKeyDown(KC_S)) 
	{
		moveCamera(0,0,Vector3(0,0,10));
	}
	if (mInputDevice->isKeyDown(KC_A)) 
	{
		moveCamera(0,0,Vector3(-10,0,0));
	}
	if (mInputDevice->isKeyDown(KC_D)) 
	{
		moveCamera(0,0,Vector3(10,0,0));
	}

	if(m_bShutDown)
	{
		return false;
	}
	if(mWindow->isClosed())
	{
		return false;
	}
	return true;
}
bool CListener::frameEnded(const FrameEvent& evt)
{
	updateStats();
	return true;
}
void CListener::mouseDragged(MouseEvent* e)
{
	CEGUI::System::getSingleton().injectMouseMove(
			e->getRelX() * m_GUIRenderer->getWidth(), 
			e->getRelY() * m_GUIRenderer->getHeight());
		e->consume();
	moveCamera(e->getRelX()*2,e->getRelY()*2);
	
}
void CListener::mouseMoved(MouseEvent* e)
{
	CEGUI::System::getSingleton().injectMouseMove(e->getRelX() * m_GUIRenderer->getWidth(), e->getRelY() * m_GUIRenderer->getHeight());
	e->consume();
    if(m_iObjectType!=0)
	{
		Ray mouseRay = mCamera->getCameraToViewportRay(e->getX(),e->getY());
		m_pRaySceneQuery->setRay(mouseRay);
		RaySceneQueryResult &result = m_pRaySceneQuery->execute();
		RaySceneQueryResult::iterator itr = result.begin();
		if (itr != result.end() && itr->worldFragment)
		{
			m_snCurrentObject->setPosition(itr->worldFragment->singleIntersection);
		}
	}
}
void CListener::mousePressed (MouseEvent *e)
{
	CEGUI::System::getSingleton().injectMouseButtonDown(convertOgreButtonToCegui(e->getButtonID()));
	e->consume();

	if(convertOgreButtonToCegui(e->getButtonID())==0)
	{
		//树
		if(m_iObjectType==1)
		{
			char tmp[20];
			sprintf(tmp, "tree%d", ++m_iTreeCount);    //命名不重复
			SceneNode* snTree=m_sceneMgr->getRootSceneNode()->createChildSceneNode(tmp);
			snTree->attachObject(m_sceneMgr->createEntity(tmp, "tree.mesh"));	
			snTree->scale(float(rand()%30+71)/100.0f,float(rand()%60+41)/100.0f,float(rand()%30+71)/100.0f);
			snTree->translate(m_snTree->getPosition());
			MAPOBJECT tmpTree;
			tmpTree.name=tmp;
			tmpTree.pos=snTree->getPosition();
			tmpTree.scale=snTree->getScale();
			tmpTree.angleY=0;
			m_vecTree.push_back(tmpTree);
		}
		//石头
		if(m_iObjectType==2)
		{
			char tmp[20];
			sprintf(tmp, "rock%d", ++m_iRockCount);    //命名不重复
			SceneNode* snRock=m_sceneMgr->getRootSceneNode()->createChildSceneNode(tmp);
			snRock->attachObject(m_sceneMgr->createEntity(tmp, "st.mesh"));	
			snRock->scale(1,1,1);
			snRock->translate(m_snRock->getPosition());
			MAPOBJECT tmpRock;
			tmpRock.name=tmp;
			tmpRock.pos=snRock->getPosition();
			tmpRock.scale=snRock->getScale();
			tmpRock.angleY=0;
			m_vecRock.push_back(tmpRock);
		}
		//草
		if(m_iObjectType==3)
		{
			char tmp[20];
			sprintf(tmp, "grass%d", ++m_iGrassCount);    //命名不重复
			SceneNode* snGrass=m_sceneMgr->getRootSceneNode()->createChildSceneNode(tmp);
			snGrass->attachObject(m_sceneMgr->createEntity(tmp, "grass.mesh"));	
			snGrass->scale(2,2,2);
			snGrass->translate(m_snGrass->getPosition());
			MAPOBJECT tmpGrass;
			tmpGrass.name=tmp;
			tmpGrass.pos=snGrass->getPosition();
			tmpGrass.scale=snGrass->getScale();
			tmpGrass.angleY=0;
			m_vecGrass.push_back(tmpGrass);
		}
		//花
		if(m_iObjectType==4)
		{
			char tmp[20];
			sprintf(tmp, "flower%d", ++m_iFlowerCount);    //命名不重复
			SceneNode* snFlower=m_sceneMgr->getRootSceneNode()->createChildSceneNode(tmp);
			snFlower->attachObject(m_sceneMgr->createEntity(tmp, "grass.mesh"));	
			snFlower->scale(2,2,2);
			snFlower->translate(m_snFlower->getPosition());
			MAPOBJECT tmpFlower;
			tmpFlower.name=tmp;
			tmpFlower.pos=snFlower->getPosition();
			tmpFlower.scale=snFlower->getScale();
			tmpFlower.angleY=0;
			m_vecFlower.push_back(tmpFlower);
		}
		//房子
		if(m_iObjectType==5)
		{
			char tmp[20];
			sprintf(tmp, "house%d", ++m_iHouseCount);    //命名不重复
			SceneNode* snHouse=m_sceneMgr->getRootSceneNode()->createChildSceneNode(tmp);
			snHouse->attachObject(m_sceneMgr->createEntity(tmp, "grass.mesh"));	
			snHouse->scale(2,2,2);
			snHouse->translate(m_snHouse->getPosition());
			MAPOBJECT tmpHouse;
			tmpHouse.name=tmp;
			tmpHouse.pos=snHouse->getPosition();
			tmpHouse.scale=snHouse->getScale();
			tmpHouse.angleY=0;
			m_vecHouse.push_back(tmpHouse);
		}
		//摄像机
		if(m_iObjectType==6)
		{
			char tmp[20];
			sprintf(tmp, "camera%d", ++m_iCameraCount);    //命名不重复
			SceneNode* snCamera=m_sceneMgr->getRootSceneNode()->createChildSceneNode(tmp);
			snCamera->attachObject(m_sceneMgr->createEntity(tmp, "grass.mesh"));	
			snCamera->scale(2,2,2);
			snCamera->translate(m_snCamera->getPosition());
			MAPOBJECT tmpCamera;
			tmpCamera.name=tmp;
			tmpCamera.pos=snCamera->getPosition();
			tmpCamera.scale=snCamera->getScale();
			tmpCamera.angleY=0;
			m_vecCamera.push_back(tmpCamera);
		}
		if(m_iObjectType==0)
		{
			if(m_snCurrentObject!=NULL)
			{
				m_snCurrentObject->showBoundingBox(false);
			}
			//得到一条从摄像机发出的射线
			Ray SelectRay = mCamera->getCameraToViewportRay(e->getX(),e->getY()); 
			bool bSelect=false;
            //树
			for(int i=0 ; i<m_vecTree.size() ; i++)
			{
				std::pair<bool ,Real> pairAB = SelectRay.intersects(m_sceneMgr->getSceneNode(m_vecTree[i].name)->_getWorldAABB());
				if(pairAB.first)
				{
					m_snCurrentObject=m_sceneMgr->getSceneNode(m_vecTree[i].name);
					m_snCurrentObject->showBoundingBox(true);
					bSelect=true;
					break;
				}
			}
			//石头
		    if(bSelect!=true)
			{
				for(int i=0 ; i<m_vecRock.size() ; i++)
				{
					std::pair<bool ,Real> pairAB = SelectRay.intersects(m_sceneMgr->getSceneNode(m_vecRock[i].name)->_getWorldAABB());
					if(pairAB.first)
					{
						m_snCurrentObject=m_sceneMgr->getSceneNode(m_vecRock[i].name);
						m_snCurrentObject->showBoundingBox(true);
						bSelect=true;
						break;
					}
				}
			}
			//草
			if(bSelect!=true)
			{
				for(int i=0 ; i<m_vecGrass.size() ; i++)
				{
					std::pair<bool ,Real> pairAB = SelectRay.intersects(m_sceneMgr->getSceneNode(m_vecGrass[i].name)->_getWorldAABB());
					if(pairAB.first)
					{
						m_snCurrentObject=m_sceneMgr->getSceneNode(m_vecGrass[i].name);
						m_snCurrentObject->showBoundingBox(true);
						bSelect=true;
						break;
					}
				}
			}
			//花
			if(bSelect!=true)
			{
				for(int i=0 ; i<m_vecFlower.size() ; i++)
				{
					std::pair<bool ,Real> pairAB = SelectRay.intersects(m_sceneMgr->getSceneNode(m_vecFlower[i].name)->_getWorldAABB());
					if(pairAB.first)
					{
						m_snCurrentObject=m_sceneMgr->getSceneNode(m_vecFlower[i].name);
						m_snCurrentObject->showBoundingBox(true);
						bSelect=true;
						break;
					}
				}
			}
			//房子
			if(bSelect!=true)
			{
				for(int i=0 ; i<m_vecHouse.size() ; i++)
				{
					std::pair<bool ,Real> pairAB = SelectRay.intersects(m_sceneMgr->getSceneNode(m_vecHouse[i].name)->_getWorldAABB());
					if(pairAB.first)
					{
						m_snCurrentObject=m_sceneMgr->getSceneNode(m_vecHouse[i].name);
						m_snCurrentObject->showBoundingBox(true);
						bSelect=true;
						break;
					}
				}
			}
			//摄像机
			if(bSelect!=true)
			{
				for(int i=0 ; i<m_vecCamera.size() ; i++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -