Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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;
                }
            }
        }