public override bool IsMouseOn(Vector2 position) { if (!base.IsMouseOn(position)) { return(false); } if (StairDirection == Direction.None) { Vector2 rectSize = rect.Size.ToVector2(); if (BodyWidth > 0.0f) { rectSize.X = BodyWidth; } if (BodyHeight > 0.0f) { rectSize.Y = BodyHeight; } Vector2 bodyPos = WorldPosition + BodyOffset; Vector2 transformedMousePos = MathUtils.RotatePointAroundTarget(position, bodyPos, MathHelper.ToDegrees(BodyRotation)); return (Math.Abs(transformedMousePos.X - bodyPos.X) < rectSize.X / 2.0f && Math.Abs(transformedMousePos.Y - bodyPos.Y) < rectSize.Y / 2.0f); } else { if (StairDirection == Direction.Left) { return(MathUtils.LineToPointDistance(new Vector2(WorldRect.X, WorldRect.Y), new Vector2(WorldRect.Right, WorldRect.Y - WorldRect.Height), position) < 40.0f); } else { return(MathUtils.LineToPointDistance(new Vector2(WorldRect.X, WorldRect.Y - rect.Height), new Vector2(WorldRect.Right, WorldRect.Y), position) < 40.0f); } } }
private void BakeItemComponents( ItemPrefab prefab, Rectangle rect, Color color, float scale, float rotation, float depth, out bool overrideSprite) { overrideSprite = false; foreach (var subElement in prefab.ConfigElement.Elements()) { switch (subElement.Name.LocalName.ToLowerInvariant()) { case "turret": Sprite barrelSprite = null; Sprite railSprite = null; foreach (XElement turretSubElem in subElement.Elements()) { switch (turretSubElem.Name.ToString().ToLowerInvariant()) { case "barrelsprite": barrelSprite = new Sprite(turretSubElem); break; case "railsprite": railSprite = new Sprite(turretSubElem); break; } } var transformedBarrelPos = MathUtils.RotatePointAroundTarget( subElement.GetAttributeVector2("barrelpos", Vector2.Zero) * scale, new Vector2(rect.Width / 2, rect.Height / 2), MathHelper.ToRadians(rotation)); Vector2 drawPos = new Vector2(rect.X + transformedBarrelPos.X, rect.Y - transformedBarrelPos.Y); drawPos.Y = -drawPos.Y; railSprite?.Draw(spriteRecorder, drawPos, color, rotation + MathHelper.PiOver2, scale, SpriteEffects.None, depth + (railSprite.Depth - prefab.sprite.Depth)); barrelSprite?.Draw(spriteRecorder, drawPos - new Vector2((float)Math.Cos(MathHelper.ToRadians(rotation)), (float)Math.Sin(MathHelper.ToRadians(rotation))) * scale, color, rotation + MathHelper.PiOver2, scale, SpriteEffects.None, depth + (barrelSprite.Depth - prefab.sprite.Depth)); break; case "door": doors.Add(new Door(rect)); var doorSpriteElem = subElement.Elements().FirstOrDefault(e => e.Name.LocalName.Equals("sprite", StringComparison.OrdinalIgnoreCase)); if (doorSpriteElem != null) { string texturePath = doorSpriteElem.GetAttributeString("texture", ""); Vector2 pos = rect.Location.ToVector2() * new Vector2(1f, -1f); if (subElement.GetAttributeBool("horizontal", false)) { pos.Y += (float)rect.Height * 0.5f; } else { pos.X += (float)rect.Width * 0.5f; } Sprite doorSprite = new Sprite(doorSpriteElem, texturePath.Contains("/") ? "" : Path.GetDirectoryName(prefab.FilePath)); spriteRecorder.Draw(doorSprite.Texture, pos, new Rectangle((int)doorSprite.SourceRect.X, (int)doorSprite.SourceRect.Y, (int)doorSprite.size.X, (int)doorSprite.size.Y), color, 0.0f, doorSprite.Origin, new Vector2(scale), SpriteEffects.None, doorSprite.Depth); } break; case "ladder": var backgroundSprElem = subElement.Elements().FirstOrDefault(e => e.Name.LocalName.Equals("backgroundsprite", StringComparison.OrdinalIgnoreCase)); if (backgroundSprElem != null) { Sprite backgroundSprite = new Sprite(backgroundSprElem); backgroundSprite.DrawTiled(spriteRecorder, new Vector2(rect.Left, -rect.Top) - backgroundSprite.Origin * scale, new Vector2(backgroundSprite.size.X * scale, rect.Height), color: color, textureScale: Vector2.One * scale, depth: depth + 0.1f); } break; } } }