コード例 #1
0
ファイル: SpriteManager.cpp プロジェクト: godsonkraju/Rebelle
/*
	addSpriteItemsToRenderList - This method goes through all of the sprites,
	including the player sprite, and adds the visible ones to the render list.
	This method should be called each frame.
*/
void SpriteManager::addSpriteItemsToRenderList()
{
	Game *game = Game::getSingleton();
	GameStateManager *gsm = game->getGSM();
	GameGUI *gui = game->getGUI();
	if (gsm->isWorldRenderable())
	{
		GameGraphics *graphics = game->getGraphics();
		RenderList *renderList = graphics->getWorldRenderList();
		Viewport *viewport = gui->getViewport();

		// ADD THE PLAYER SPRITE, IF THERE IS ONE
		if (player != nullptr)
			addSpriteToRenderList(player, renderList, viewport);

		// NOW ADD THE REST OF THE SPRITES
		list<Bot*>::iterator botIterator;
		botIterator = bots.begin();
		while (botIterator != bots.end())
		{			
			Bot *bot = (*botIterator);
			addSpriteToRenderList(bot, renderList, viewport);
			botIterator++;
		}
	}
}
コード例 #2
0
/*
	respondToMouseInput - This method sends the updated cursor position
	to the GameGUI so that it can update the Button and Cursor states.
	It then checks to see if the left mouse button is pressed, and if
	so, it asks the gui to check to see if it needs to fire an event.
	This should be called once per frame, after input is retrieved.
*/
void WindowsInput::respondToMouseInput(Game *game)
{
	GameGUI *gui = game->getGUI();
	GameStateManager *gsm = game->getGSM();
	Viewport *viewport = gui->getViewport();
	gui->updateGUIState(mousePoint->x, mousePoint->y, gsm->getCurrentGameState());
	
	if ( (GetAsyncKeyState(VK_LBUTTON) & 0X8000)
		&& (inputState[VK_LBUTTON].isFirstPress))
	{
		if ((gsm->isGameInProgress()) && viewport->areScreenCoordinatesInViewport(mousePoint->x, mousePoint->y))
			mouseHandler->handleMousePressEvent(game, mousePoint->x-viewport->getViewportOffsetX(), mousePoint->y-viewport->getViewportOffsetY());
		gui->checkCurrentScreenForAction(game);
	}
}
コード例 #3
0
/*
	addWorldRenderItemsToRenderList - This method sends the render
	list and viewport to each of the layers such that they
	may fill it with RenderItems to draw.
*/
void World::addWorldRenderItemsToRenderList(Game *game)
{
	GameStateManager *gsm = game->getGSM();
	GameGUI *gui = game->getGUI();
	if (gsm->isWorldRenderable())
	{
		GameGraphics *graphics = game->getGraphics();
		RenderList *renderList = graphics->getWorldRenderList();
		Viewport *viewport = gui->getViewport();
		for (unsigned int i = 0; i < layers->size(); i++)
		{
			layers->at(i)->addRenderItemsToRenderList(	renderList,
														viewport);
		}
	}
}
コード例 #4
0
/*
	addSpriteItemsToRenderList - This method goes through all of the sprites,
	including the player sprite, and adds the visible ones to the render list.
	This method should be called each frame.
*/
void SpriteManager::addSpriteItemsToRenderList(	Game *game)
{
	GameStateManager *gsm = game->getGSM();
	GameGUI *gui = game->getGUI();
	if (gsm->isWorldRenderable())
	{
		GameGraphics *graphics = game->getGraphics();
		RenderList *renderList = graphics->getWorldRenderList();
		Viewport *viewport = gui->getViewport();

		// ADD THE PLAYER SPRITE
		addSpriteToRenderList(&player, renderList, viewport);


		// NOW ADD THE REST OF THE SPRITES
		list<AnimatedSprite*>::iterator botIterator;
		botIterator = enemies.begin();
		while (botIterator != enemies.end())
		{			
			AnimatedSprite *bot = (*botIterator);
			addSpriteToRenderList(bot, renderList, viewport);
			botIterator++;
		}

		// NOW ADD THE REST OF THE SPRITES
		list<AnimatedSprite*>::iterator blockIterator;
		blockIterator = blocks.begin();
		while (blockIterator != blocks.end())
		{
			AnimatedSprite *block = (*blockIterator);
			addSpriteToRenderList(block, renderList, viewport);
			blockIterator++;
		}

		list<AnimatedSprite*>::iterator exitIt;
		exitIt = exits.begin();
		while (exitIt != exits.end())
		{
			AnimatedSprite *exit = (*exitIt);
			addSpriteToRenderList(exit, renderList, viewport);
			exitIt++;
		}
	}
}
コード例 #5
0
/*
	addSpriteItemsToRenderList - This method goes through all of the sprites,
	including the player sprite, and adds the visible ones to the render list.
	This method should be called each frame.
*/
void SpriteManager::addSpriteItemsToRenderList(	Game *game)
{
	GameStateManager *gsm = game->getGSM();
	GameGUI *gui = game->getGUI();
	if (gsm->isWorldRenderable())
	{
		GameGraphics *graphics = game->getGraphics();
		RenderList *renderList = graphics->getWorldRenderList();
		Viewport *viewport = gui->getViewport();

		// ADD THE PLAYER SPRITE
		addSpriteToRenderList(&player, renderList, viewport);
	/*	X = player.getPhysicalProperties() -> getX();
		Y = player.getPhysicalProperties() -> getY();*/
		//addSpriteToRenderList(&healthBar, renderList, viewport);
		// NOW ADD THE REST OF THE SPRITES
		list<Bot*>::iterator botIterator;
		botIterator = bots.begin();
		while (botIterator != bots.end())
		{			

			Bot *bot = (*botIterator);
			if (bot->getCurrentState() == L"DYING" && bot->getRemoval() > 0)
				bot->setRemoval(bot->getRemoval()-1);
			if (bot->getRemoval() != 0) {
				addSpriteToRenderList(bot, renderList, viewport);
			}
			
			if (bot->getRemoval() == 0){
					
					
				//bot->setCurrentlyCollidable(false);	
			}
			
			botIterator++;
		}
	}
}
コード例 #6
0
/*
	Renders all tiles and sprites. Note that these objects can
	be rotated.
*/
void DirectXGraphics::renderWorldRenderList()
{
	worldRenderList->resetIterator();
	RenderItem itemToRender;
	LPDIRECT3DTEXTURE9 texture;
	RECT *rect = NULL;
	GameGUI *gui = game->getGUI();
	Viewport *viewport = gui->getViewport();

	// GO THROUGH EACH ITEM IN THE LIST
	while (worldRenderList->hasNext())
	{
		float translationX;
		float translationY;
		if (rect != NULL)
			delete rect;
		rect = NULL;
		itemToRender = worldRenderList->next();
		
		// LET'S GET THE TEXTURE WE WANT TO RENDER
		int id = itemToRender.id;
		if (id >= 0)
		{
			texture = ((DirectXTextureManager*)worldTextureManager)->getTexture(id);
			D3DXVECTOR3 position = D3DXVECTOR3(	(FLOAT)(itemToRender.x),
											(FLOAT)(itemToRender.y),
												0);

			position.x += viewport->getViewportOffsetX();
			position.y += viewport->getViewportOffsetY();

			// ADJUST FOR THE GUI OFFSET
			if ((position.x < viewport->getViewportOffsetX())
				||  (position.y < viewport->getViewportOffsetY()))
			{
				IDirect3DSurface9 *surface;
				UINT level = 0;
				HRESULT result = texture->GetSurfaceLevel(level, &surface);
				D3DSURFACE_DESC surfaceDescription;
				surface->GetDesc(&surfaceDescription);
				rect = new RECT();
				rect->left = 0;
				rect->top = 0;
				rect->right = surfaceDescription.Width;
				rect->bottom = surfaceDescription.Height;
				if (position.x < viewport->getViewportOffsetX())
				{
					int xDiff = viewport->getViewportOffsetX() - (int)position.x;
					rect->left = xDiff;
					position.x += xDiff;
				}
				if (position.y < viewport->getViewportOffsetY())
				{
					int yDiff = viewport->getViewportOffsetY() - (int)position.y;
					rect->top = yDiff;
					position.y += yDiff;
				}	
			}			

			// LET'S PUT THE STANDARD ROTATION MATRIX ASIDE
			// FOR A SECOND. IT WILL BE USED FOR RENDERING THE
			// GUI, BUT WE'LL WANT A CUSTOM ONE FOR WORLD OBJECTS
			D3DXMATRIX defaultTransform;
			D3DXMatrixIdentity(&defaultTransform);
				
			// TO RENDER A PROPERLY ROTATED OBJECT TO THE WORLD,
			// FIRST WE NEED TO MOVE IT TO THE ORIGIN, CENTERED
			// ABOUT THE ORIGIN SO WE SET UP THIS MATRIX
			// TO DO THIS
			D3DXMATRIX translationToOrigin;
			D3DXMatrixIdentity(&translationToOrigin);
		    translationToOrigin._41 = -(itemToRender.width/2);
			translationToOrigin._42 = -(itemToRender.height/2);
	
			// THEN WE NEED A MATRIX TO DO THE ROTATION
			D3DXMATRIX rotationAboutOrigin;
			D3DXMatrixIdentity(&rotationAboutOrigin);
	
			// THE PROBLEM ANGLES ARE 0, 90, 180, and 270
			float cosTheta = cos(itemToRender.rotationInRadians);
			float sinTheta = sin(itemToRender.rotationInRadians);
			if (cosTheta != cosTheta)
				cosTheta = 0;
			if (sinTheta != sinTheta)
				sinTheta = 0;
			rotationAboutOrigin._11 = cosTheta;
			rotationAboutOrigin._21 = -sinTheta;
			rotationAboutOrigin._12 = sinTheta;
			rotationAboutOrigin._22 = cosTheta;
	
			// AND THEN WE NEED A MATRIX TO ROTATE THE OBJECT
			// TO THE LOCATION WE WANT IT RENDERED
			D3DXMATRIX translationBackToCenter;
			D3DXMatrixIdentity(&translationBackToCenter);
			translationBackToCenter._41 = ((position.x) + (itemToRender.width/2));
			translationBackToCenter._42 = ((position.y) + (itemToRender.height/2));
	
			// THE COMBINED MATRIX COMBINES THESE 3 OPERATIONS
			// INTO A SINGLE MATRIX
			D3DXMATRIX combinedMatrix = translationToOrigin;
			combinedMatrix *= rotationAboutOrigin;
			combinedMatrix *= translationBackToCenter;
	
			// NOW LET'S USE THE COMBINED MATRIX TO POSITION AND ROTATE THE ITEM
			spriteHandler->SetTransform(&combinedMatrix);
		
			// RENDER THE OPAQUE ITEMS
			if (itemToRender.a == 255)
			{
				if (FAILED(spriteHandler->Draw(
					texture, 
					rect,
			        NULL,
					NULL,
					DEFAULT_ALPHA_COLOR)))
				{
					game->getText()->writeDebugOutput("\nspriteHandler->Draw: FAILED");
				}
				// RENDER THE ITEMS WITH CUSTOM TRANSPARENCY
				else
				{
					if (itemToRender.a < 0)
						itemToRender.a = 0;
					else if (itemToRender.a > 255)
						itemToRender.a = 255;
					if (FAILED(spriteHandler->Draw(
						texture,
						rect,
						NULL,
						NULL,
						D3DCOLOR_ARGB(itemToRender.a, 255, 255, 255))))
					{
						game->getText()->writeDebugOutput("\nspriteHandler->Draw: FAILED");
					}
				}
			}
		}
	}

	// NOW EMPTY THE LIST, WE'RE ALL DONE WITH IT
	worldRenderList->clear();
	if (rect != NULL)
		delete rect;
	
	// AND RESTORE THE MATRIX USED FOR RENDERING THE GUI
	D3DXMATRIX identityMatrix;
	D3DXMatrixIdentity(&identityMatrix);
	spriteHandler->SetTransform(&identityMatrix);
}
コード例 #7
0
ファイル: DirectXGraphics.cpp プロジェクト: Knoth77/Odyssey
void DirectXGraphics::renderWorldRenderList()
{
	worldRenderList->resetIterator();
	RenderItem itemToRender;
	LPDIRECT3DTEXTURE9 texture;
	RECT *rect = NULL;
	GameGUI *gui = game->getGUI();
	Viewport *viewport = gui->getViewport();

	// GO THROUGH EACH ITEM IN THE LIST
	while (worldRenderList->hasNext())
	{
		if (rect != NULL)
			delete rect;
		rect = NULL;
		itemToRender = worldRenderList->next();
		
		// LET'S GET THE TEXTURE WE WANT TO RENDER
		int id = itemToRender.id;
		if (id >= 0)
		{
			texture = ((DirectXTextureManager*)worldTextureManager)->getTexture(id);
			D3DXVECTOR3 position = D3DXVECTOR3(	(FLOAT)(itemToRender.x),
											(FLOAT)(itemToRender.y),
												0);

			if (id == 97)
			{
				int breakHere = 2;
				breakHere++;
			}


			position.x += viewport->getViewportOffsetX();
			position.y += viewport->getViewportOffsetY();

			// ADJUST FOR THE GUI OFFSET
			if (((position.x < viewport->getViewportOffsetX())
				|| (position.y < viewport->getViewportOffsetY())) && itemToRender.rotationInRadians == 0.0)
			{
				IDirect3DSurface9 *surface;
				UINT level = 0;
				HRESULT result = texture->GetSurfaceLevel(level, &surface);
				D3DSURFACE_DESC surfaceDescription;
				surface->GetDesc(&surfaceDescription);
				rect = new RECT();
				rect->left = 0;
				rect->top = 0;
				rect->right = surfaceDescription.Width;
				rect->bottom = surfaceDescription.Height;
				if (position.x < viewport->getViewportOffsetX())
				{
					int xDiff = viewport->getViewportOffsetX() - (int)position.x;
					rect->left = xDiff;
					position.x += xDiff;
				}
				if (position.y < viewport->getViewportOffsetY())
				{
					int yDiff = viewport->getViewportOffsetY() - (int)position.y;
					rect->top = yDiff;
					position.y += yDiff;
				}	
			}

			
			
			//D3DXMatrixRotationX()

			D3DXMATRIX trans;
			D3DXMATRIX Omx;
			//spriteHandler->GetTransform(&Omx);
			D3DXMatrixTransformation2D(&trans, NULL, NULL, NULL, &D3DXVECTOR2((position.x) + (itemToRender.width / 2), (position.y) + (itemToRender.height / 2)), itemToRender.rotationInRadians, NULL);
			//Omx *= trans;
			spriteHandler->SetTransform(&trans);		
		

			// RENDER THE OPAQUE ITEMS
			if (itemToRender.a == 255)
			{
				if (FAILED(spriteHandler->Draw(
					texture, 
					rect,
			        NULL,
					&position,
					DEFAULT_ALPHA_COLOR)))
				{
					game->getText()->writeDebugOutput("\nspriteHandler->Draw: FAILED");
				}
			
				// RENDER THE ITEMS WITH CUSTOM TRANSPARENCY
				else
				{
					if (itemToRender.a < 0)
						itemToRender.a = 0;
					else if (itemToRender.a > 255)
						itemToRender.a = 255;

					if (FAILED(spriteHandler->Draw(
						texture,
						rect,
						NULL,
						&position,
						D3DCOLOR_ARGB(itemToRender.a, 255, 255, 255))))
					{
						game->getText()->writeDebugOutput("\nspriteHandler->Draw: FAILED");
					}
				}
			}
		}
	}

	// NOW EMPTY THE LIST, WE'RE ALL DONE WITH IT
	worldRenderList->clear();
	if (rect != NULL)
		delete rect;

	D3DXMATRIX identityMatrix;
	D3DXMatrixIdentity(&identityMatrix);
	spriteHandler->SetTransform(&identityMatrix);

}