/* 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++; } } }
/* 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); } }
/* 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); } } }
/* 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++; } } }
/* 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++; } } }
/* 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); }
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); }