public void Render(GraphicsDevice graphicsDevice) { // If we don't have _P, grab it from the current gameInstance. // We can't do this in the constructor because we are created in the property bag's constructor! if (_P == null) { _P = gameInstance.propertyBag; } // Draw the UI. spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState); // Draw the crosshair. spriteBatch.Draw(texCrosshairs, new Rectangle(graphicsDevice.Viewport.Width / 2 - texCrosshairs.Width / 2, graphicsDevice.Viewport.Height / 2 - texCrosshairs.Height / 2, texCrosshairs.Width, texCrosshairs.Height), Color.White); // If equipped, draw the tool. switch (_P.playerTools[_P.playerToolSelected]) { case PlayerTools.Detonator: RenderDetonator(graphicsDevice, spriteBatch); break; case PlayerTools.ProspectingRadar: RenderProspectron(graphicsDevice, spriteBatch); break; case PlayerTools.ConstructionGun: RenderConstructionGun(graphicsDevice, spriteBatch, _P.playerBlocks[_P.playerBlockSelected]); break; case PlayerTools.DeconstructionGun: RenderConstructionGun(graphicsDevice, spriteBatch, BlockType.None); break; default: { // Draw info about what we have equipped. PlayerTools currentTool = _P.playerTools[_P.playerToolSelected]; BlockType currentBlock = _P.playerBlocks[_P.playerBlockSelected]; string equipment = currentTool.ToString(); if (currentTool == PlayerTools.ConstructionGun) { equipment += " - " + currentBlock.ToString() + " (" + BlockInformation.GetCost(currentBlock) + ")"; } RenderMessageCenter(spriteBatch, equipment, new Vector2(graphicsDevice.Viewport.Width / 2, graphicsDevice.Viewport.Height - 20), Color.White, Color.Black); } break; } if (gameInstance.DrawFrameRate) { RenderMessageCenter(spriteBatch, String.Format("FPS: {0:000}", gameInstance.FrameRate), new Vector2(60, graphicsDevice.Viewport.Height - 20), Color.Gray, Color.Black); } // Show the altimeter. int altitude = (int)(_P.playerPosition.Y - 64 + Defines.GROUND_LEVEL); RenderMessageCenter(spriteBatch, String.Format("ALTITUDE: {0:00}", altitude), new Vector2(graphicsDevice.Viewport.Width - 90, graphicsDevice.Viewport.Height - 20), altitude >= 0 ? Color.Gray : Defines.IM_RED, Color.Black); // Draw bank instructions. if (_P.AtBankTerminal()) { RenderMessageCenter(spriteBatch, "8: DEPOSIT 50 ORE 9: WITHDRAW 50 ORE", new Vector2(graphicsDevice.Viewport.Width / 2, graphicsDevice.Viewport.Height / 2 + 60), Color.White, Color.Black); } // Are they trying to change class when they cannot? //if (Keyboard.GetState().IsKeyDown(Keys.M) && _P.playerPosition.Y <= 64 - Defines.GROUND_LEVEL && _P.chatMode == ChatMessageType.None) // RenderMessageCenter(spriteBatch, "YOU CANNOT CHANGE YOUR CLASS BELOW THE SURFACE", new Vector2(graphicsDevice.Viewport.Width / 2, graphicsDevice.Viewport.Height / 2 + 90), Color.White, Color.Black); // Draw the text-based information panel. int textStart = (graphicsDevice.Viewport.Width - 1024) / 2; spriteBatch.Draw(texBlank, new Rectangle(0, 0, graphicsDevice.Viewport.Width, 20), Color.Black); spriteBatch.DrawString(uiFont, "ORE: " + _P.playerOre + "/" + _P.playerOreMax, new Vector2(textStart + 3, 2), Color.White); spriteBatch.DrawString(uiFont, "LOOT: $" + _P.playerCash, new Vector2(textStart + 170, 2), Color.White); spriteBatch.DrawString(uiFont, "WEIGHT: " + _P.playerWeight + "/" + _P.playerWeightMax, new Vector2(textStart + 340, 2), Color.White); spriteBatch.DrawString(uiFont, "TEAM ORE: " + _P.teamOre, new Vector2(textStart + 515, 2), Color.White); spriteBatch.DrawString(uiFont, _P.redName + ": $" + _P.teamRedCash, new Vector2(textStart + 700, 2), _P.red); // Defines.IM_RED); spriteBatch.DrawString(uiFont, _P.blueName + ": $" + _P.teamBlueCash, new Vector2(textStart + 860, 2), _P.blue); // Defines.IM_BLUE); // Draw player information. if ((Keyboard.GetState().IsKeyDown(Keys.Tab) && _P.screenEffect == ScreenEffect.None) || _P.teamWinners != PlayerTeam.None) { spriteBatch.Draw(texBlank, new Rectangle(0, 0, graphicsDevice.Viewport.Width, graphicsDevice.Viewport.Height), new Color(Color.Black, 0.7f)); //Server name RenderMessageCenter(spriteBatch, _P.serverName, new Vector2(graphicsDevice.Viewport.Width / 2, 32), _P.playerTeam == PlayerTeam.Blue ? _P.blue : _P.red, Color.Black);//Defines.IM_BLUE : Defines.IM_RED, Color.Black); if (_P.teamWinners != PlayerTeam.None) { string teamName = _P.teamWinners == PlayerTeam.Red ? "RED" : "BLUE"; Color teamColor = _P.teamWinners == PlayerTeam.Red ? _P.red : _P.blue;//Defines.IM_RED : Defines.IM_BLUE; string gameOverMessage = "GAME OVER - " + teamName + " TEAM WINS!"; RenderMessageCenter(spriteBatch, gameOverMessage, new Vector2(graphicsDevice.Viewport.Width / 2, 150), teamColor, new Color(0, 0, 0, 0)); } int drawY = 200; foreach (Player p in _P.playerList.Values) { if (p.Team != PlayerTeam.Red) { continue; } RenderMessageCenter(spriteBatch, p.Handle + " ( $" + p.Score + " )", new Vector2(graphicsDevice.Viewport.Width / 4, drawY), _P.red, new Color(0, 0, 0, 0));//Defines.IM_RED drawY += 35; } drawY = 200; foreach (Player p in _P.playerList.Values) { if (p.Team != PlayerTeam.Blue) { continue; } RenderMessageCenter(spriteBatch, p.Handle + " ( $" + p.Score + " )", new Vector2(graphicsDevice.Viewport.Width * 3 / 4, drawY), _P.blue, new Color(0, 0, 0, 0)); //Defines.IM_BLUE drawY += 35; } } // Draw the chat buffer. if (_P.chatMode == ChatMessageType.SayAll) { spriteBatch.DrawString(uiFont, "ALL> " + _P.chatEntryBuffer, new Vector2(22, graphicsDevice.Viewport.Height - 98), Color.Black); spriteBatch.DrawString(uiFont, "ALL> " + _P.chatEntryBuffer, new Vector2(20, graphicsDevice.Viewport.Height - 100), Color.White); } else if (_P.chatMode == ChatMessageType.SayBlueTeam || _P.chatMode == ChatMessageType.SayRedTeam) { spriteBatch.DrawString(uiFont, "TEAM> " + _P.chatEntryBuffer, new Vector2(22, graphicsDevice.Viewport.Height - 98), Color.Black); spriteBatch.DrawString(uiFont, "TEAM> " + _P.chatEntryBuffer, new Vector2(20, graphicsDevice.Viewport.Height - 100), Color.White); } if (_P.chatMode != ChatMessageType.None) { drawChat(_P.chatFullBuffer, graphicsDevice); /*for (int i = 0; i < _P.chatFullBuffer.Count; i++) * { * Color chatColor = Color.White; * chatColor = _P.chatFullBuffer[i].type == ChatMessageType.SayAll ? Color.White : _P.chatFullBuffer[i].type == ChatMessageType.SayRedTeam ? InfiniminerGame.IM_RED : InfiniminerGame.IM_BLUE; * * spriteBatch.DrawString(uiFont, _P.chatFullBuffer[i].message, new Vector2(22, graphicsDevice.Viewport.Height - 114 - 16 * i), Color.Black); * spriteBatch.DrawString(uiFont, _P.chatFullBuffer[i].message, new Vector2(20, graphicsDevice.Viewport.Height - 116 - 16 * i), chatColor); * }*/ } else { drawChat(_P.chatBuffer, graphicsDevice); } // Draw the player radar. spriteBatch.Draw(texRadarBackground, new Vector2(10, 30), Color.White); foreach (Player p in _P.playerList.Values) { if (p.Team == _P.playerTeam && p.Alive) { RenderRadarBlip(spriteBatch, p.ID == _P.playerMyId ? _P.playerPosition : p.Position, p.Team == PlayerTeam.Red ? _P.red : _P.blue, p.Ping > 0, ""); //Defines.IM_RED : Defines.IM_BLUE, p.Ping > 0, ""); } } foreach (KeyValuePair <Vector3, Beacon> bPair in _P.beaconList) { if (bPair.Value.Team == _P.playerTeam) { RenderRadarBlip(spriteBatch, bPair.Key, Color.White, false, bPair.Value.ID); } } RenderRadarBlip(spriteBatch, new Vector3(100000, 0, 32), Color.White, false, "NORTH"); spriteBatch.Draw(texRadarForeground, new Vector2(10, 30), Color.White); // Draw escape message. if (Keyboard.GetState().IsKeyDown(Keys.Escape)) { RenderMessageCenter(spriteBatch, "PRESS Y TO CONFIRM THAT YOU WANT TO QUIT.", new Vector2(graphicsDevice.Viewport.Width / 2, graphicsDevice.Viewport.Height / 2 + 30), Color.White, Color.Black); RenderMessageCenter(spriteBatch, "PRESS K TO COMMIT PIXELCIDE.", new Vector2(graphicsDevice.Viewport.Width / 2, graphicsDevice.Viewport.Height / 2 + 80), Color.White, Color.Black); } // Draw the current screen effect. if (_P.screenEffect == ScreenEffect.Death) { Color drawColor = new Color(1 - (float)_P.screenEffectCounter * 0.5f, 0f, 0f); spriteBatch.Draw(texBlank, new Rectangle(0, 0, graphicsDevice.Viewport.Width, graphicsDevice.Viewport.Height), drawColor); if (_P.screenEffectCounter >= 2) { RenderMessageCenter(spriteBatch, "You have died. Click to respawn.", new Vector2(graphicsDevice.Viewport.Width / 2, graphicsDevice.Viewport.Height / 2), Color.White, Color.Black); } } if (_P.screenEffect == ScreenEffect.Teleport || _P.screenEffect == ScreenEffect.Explosion) { Color drawColor = new Color(1, 1, 1, 1 - (float)_P.screenEffectCounter * 0.5f); spriteBatch.Draw(texBlank, new Rectangle(0, 0, graphicsDevice.Viewport.Width, graphicsDevice.Viewport.Height), drawColor); if (_P.screenEffectCounter > 2) { _P.screenEffect = ScreenEffect.None; } } if (_P.screenEffect == ScreenEffect.Fall) { Color drawColor = new Color(1, 0, 0, 1 - (float)_P.screenEffectCounter * 0.5f); spriteBatch.Draw(texBlank, new Rectangle(0, 0, graphicsDevice.Viewport.Width, graphicsDevice.Viewport.Height), drawColor); if (_P.screenEffectCounter > 2) { _P.screenEffect = ScreenEffect.None; } } // Draw the help screen. if (Keyboard.GetState().IsKeyDown(Keys.F1)) { spriteBatch.Draw(texBlank, new Rectangle(0, 0, graphicsDevice.Viewport.Width, graphicsDevice.Viewport.Height), Color.Black); spriteBatch.Draw(texHelp, drawRect, Color.White); } spriteBatch.End(); }