private void DrawContent(RenderEnv env, TooltipContent content, Vector2 position, bool adjustToWindow) { Vector2 padding = new Vector2(10, 8); Vector2 preferSize = new Vector2( Math.Max(content.size.X + padding.X * 2, 26), Math.Max(content.size.Y + padding.Y * 2, 26)); if (adjustToWindow) { position.X = Math.Max(0, Math.Min(position.X, env.Camera.Width - preferSize.X)); position.Y = Math.Max(0, Math.Min(position.Y, env.Camera.Height - preferSize.Y)); } env.Sprite.Begin(); var background = UIGraphics.LayoutNinePatch(this.Resource, new Point((int)preferSize.X, (int)preferSize.Y)); foreach (var block in background) { if (block.Rectangle.Width > 0 && block.Rectangle.Height > 0 && block.Texture != null) { var rect = new Rectangle((int)position.X + block.Rectangle.X, (int)position.Y + block.Rectangle.Y, block.Rectangle.Width, block.Rectangle.Height); env.Sprite.Draw(block.Texture, rect, Color.White); } } if (content.textures != null) { foreach (var block in content.textures) { if (block.Texture != null) { var rect = block.Rectangle; rect.X += (int)(position.X + padding.X); rect.Y += (int)(position.Y + padding.Y); if (rect.Width == 0) { rect.Width = block.Texture.Width; } if (rect.Height == 0) { rect.Height = block.Texture.Height; } env.Sprite.Draw(block.Texture, rect, Color.White); } } } env.Sprite.Flush(); foreach (var block in content.blocks) { var pos = new Vector2(position.X + padding.X + block.Position.X, position.Y + padding.Y + block.Position.Y); var baseFont = block.Font.BaseFont; if (baseFont is XnaFont) { env.Sprite.DrawStringEx((XnaFont)baseFont, block.Text, pos, block.ForeColor); env.Sprite.Flush(); } else if (baseFont is D2DFont) { env.D2DRenderer.Begin(); env.D2DRenderer.DrawString((D2DFont)baseFont, block.Text, pos, block.ForeColor); env.D2DRenderer.End(); } } env.Sprite.End(); }
public void Draw(RenderEnv env, GameTime gameTime) { //计算UI偏移 Matrix trans = Matrix.CreateTranslation(this.Position.X, this.Position.Y, 0); //绘制外框 env.GraphicsDevice.ScissorRectangle = new Rectangle((int)this.Position.X, (int)this.Position.Y, (int)this.Size.X, (int)this.Size.Y); env.GraphicsDevice.RasterizerState = StateEx.Scissor(); env.Sprite.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, transformMatrix: trans); env.Sprite.FillRectangle(this.MinimapRectangle, new Color(Color.Black, 0.7f)); UIGraphics.DrawNineForm(env, this.resource, Vector2.Zero, this.Size); env.Sprite.End(); env.GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise; //绘制标题 if (this.MapNameFont != null) { env.Sprite.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, transformMatrix: trans); if (this.StreetName != null) { env.Sprite.DrawStringEx(this.MapNameFont, this.StreetName, this.streetNameOrigin, Color.White); } if (this.MapName != null) { env.Sprite.DrawStringEx(this.MapNameFont, this.MapName, this.mapNameOrigin, Color.White); } env.Sprite.End(); } //绘制小地图 if (this.MiniMap != null) { //绘制小地图标记 env.Sprite.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, transformMatrix: trans); if (MapMarkVisible && this.MiniMap.MapMark != null) { env.Sprite.Draw(this.MiniMap.MapMark, mapMarkOrigin, Color.White); } env.Sprite.End(); if (this.MiniMap.Canvas != null) { //计算世界地图到小地图的偏移 Texture2D canvas = this.MiniMap.Canvas; Rectangle fromRect; if (this.MiniMap.Width > 0 && this.MiniMap.Height > 0) { fromRect = new Rectangle(-this.MiniMap.CenterX, -this.MiniMap.CenterY, this.MiniMap.Width, this.MiniMap.Height); } else { fromRect = env.Camera.WorldRect; } Rectangle toRect = new Rectangle(0, 0, canvas.Width, canvas.Height); Matrix worldToMinimap = Matrix.CreateTranslation(-fromRect.X, -fromRect.Y, 0) * Matrix.CreateScale(1f / fromRect.Width * toRect.Width, 1f / fromRect.Height * toRect.Height, 0) * Matrix.CreateTranslation(toRect.X, toRect.Y, 0); //计算小地图区域的二次偏移 Rectangle rect = this.MinimapRectangle; Vector2 offset = new Vector2((rect.Width - canvas.Width) / 2, (rect.Height - canvas.Height) / 2); worldToMinimap *= Matrix.CreateTranslation(offset.X, offset.Y, 0); //设置剪裁区域 env.GraphicsDevice.ScissorRectangle = new Rectangle( (int)this.Position.X + rect.X, (int)this.Position.Y + rect.Y, rect.Width, rect.Height); env.GraphicsDevice.RasterizerState = StateEx.Scissor(); //绘制小地图本体 env.Sprite.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, transformMatrix: trans); env.Sprite.Draw(this.MiniMap.Canvas, miniMapOrigin + offset, Color.White); if (this.ResourceLoaded) { Vector2 iconOrigin = new Vector2(0, 5); //绘制一般传送门 if (this.Portals.Count > 0 && this.texPortal != null) { Vector2 origin = new Vector2(this.texPortal.Width / 2, this.texPortal.Height / 2); foreach (var portal in this.Portals) { Vector2 position = Vector2.Transform(portal, worldToMinimap); position = miniMapOrigin + position - origin - iconOrigin; position = MathHelper2.Round(position); env.Sprite.Draw(this.texPortal, position, Color.White); } } //绘制地图内传送门 if (this.Transports.Count > 0 && this.texTransport != null) { Vector2 origin = new Vector2(this.texTransport.Width / 2, this.texTransport.Height / 2); foreach (var portal in this.Transports) { Vector2 position = Vector2.Transform(portal, worldToMinimap); position = miniMapOrigin + position - origin - iconOrigin; position = MathHelper2.Round(position); env.Sprite.Draw(this.texTransport, position, Color.White); } } } //绘制摄像机区域框 Rectangle cameraRect = MathHelper2.Transform(env.Camera.ClipRect, worldToMinimap); cameraRect.X += (int)miniMapOrigin.X; cameraRect.Y += (int)miniMapOrigin.Y; env.Sprite.DrawRectangle(cameraRect, Color.Yellow); env.Sprite.End(); env.GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise; } } }