예제 #1
0
    /// <summary>
    /// Constructs the pane with all the sprites.
    /// </summary>
    public DemoSpriteSimple()
    {
        // Create the basics
        sprites = new SpriteList();
        viewport = new SpriteViewport(sprites);
        viewport.BackgroundColor = new Color(0, 0, 50);

        // Load in a basic sprite
        IDrawable drawable = DemoSprites.PixbufFactory.Create("blue-sphere");
        sprite = new DrawableSprite(drawable);
        sprite.X = 10;
        sprite.Y = 10;
        sprite.Width = sprite.Height = 64;
        sprites.Add(sprite);

        // Load the second sprite
        drawable = DemoSprites.PixbufFactory.Create("green-sphere");
        sprite2 = new DrawableSprite(drawable);
        sprite2.X = 10;
        sprite2.Y = 300;
        sprite2.Width = sprite2.Height = 128;
        sprites.Add(sprite2);

        // Load in just a red sphere
        drawable = DemoSprites.TilesetFactory.Create("red-sphere");
        ISprite s = new DrawableSprite(drawable);
        s.X = 400;
        s.Y = 10;
        s.Width = s.Height = 256;
        sprites.Add(s);
    }
예제 #2
0
    /// <summary>
    /// Constructs the pane with all the sprites.
    /// </summary>
    public DemoSpriteSimple()
    {
        // Create the basics
        sprites  = new SpriteList();
        viewport = new SpriteViewport(sprites);
        viewport.BackgroundColor = new Color(0, 0, 50);

        // Load in a basic sprite
        IDrawable drawable = DemoSprites.PixbufFactory.Create("blue-sphere");

        sprite       = new DrawableSprite(drawable);
        sprite.X     = 10;
        sprite.Y     = 10;
        sprite.Width = sprite.Height = 64;
        sprites.Add(sprite);

        // Load the second sprite
        drawable      = DemoSprites.PixbufFactory.Create("green-sphere");
        sprite2       = new DrawableSprite(drawable);
        sprite2.X     = 10;
        sprite2.Y     = 300;
        sprite2.Width = sprite2.Height = 128;
        sprites.Add(sprite2);

        // Load in just a red sphere
        drawable = DemoSprites.TilesetFactory.Create("red-sphere");
        ISprite s = new DrawableSprite(drawable);

        s.X     = 400;
        s.Y     = 10;
        s.Width = s.Height = 256;
        sprites.Add(s);
    }
예제 #3
0
        /// <summary>
        /// Triggered when a token is added to the board.
        /// </summary>
        public void OnTokenAdded(
            object sender,
            TokenArgs args)
        {
            // Create a new token
            TokenSprite     ts = new TokenSprite(this, args.Token);
            ContainerSprite ms = new ContainerSprite(ts);

            sprites.Add(ms);

            // Move the sprite over
            ms.RateX = 100;
            ms.RateY = 100;
            ms.X     = ms.DesiredX = TileSize * args.Token.Column;
            ms.Y     = ms.DesiredY = TileSize * args.Token.Row;
            ms.Y    -= TileSize;

            // Check the state
            if (Game.State == GameState.InProgress &&
                args.Token.Type == TokenType.Flooded && args.Token.Value == ' ')
            {
                // Flooded tokens show up in place, but with a special
                // animation
                ms.Y = ms.DesiredY;
                ms.X = ms.DesiredX;
                ts.DrawableState.Frame = TokenSprite.FloodedStart;
            }

            // We need to sort the list again
            sortNext = true;
            QueueDraw();
            log.Debug(
                "TokenAdded: {0} sprits {1} state {2}", ts, sprites.Count, Game.State);
        }
예제 #4
0
        public EditorHandles()
        {
            spritesAlreadyChanged = new PositionedObjectList <PositionedObject>();

            Layer axisLayer = SpriteManager.AddLayer();

            origin = SpriteManager.AddSprite(
                FlatRedBallServices.Load <Texture2D>("Content/EditorHandles/Origin.png", GuiManager.InternalGuiContentManagerName), axisLayer);
            origin.Name = "OriginOfEditAxes";
            editAxisSpriteArray.Add(origin);

            xAxis = SpriteManager.AddSprite(
                FlatRedBallServices.Load <Texture2D>("Content/EditorHandles/MoveX.png", GuiManager.InternalGuiContentManagerName), axisLayer);

            editAxisSpriteArray.Add(xAxis);

            yAxis = SpriteManager.AddSprite(
                FlatRedBallServices.Load <Texture2D>("Content/EditorHandles/MoveY.png", GuiManager.InternalGuiContentManagerName), axisLayer);
            editAxisSpriteArray.Add(yAxis);

            zAxis = SpriteManager.AddSprite(
                FlatRedBallServices.Load <Texture2D>("Content/EditorHandles/MoveZ.png", GuiManager.InternalGuiContentManagerName), axisLayer);
            editAxisSpriteArray.Add(zAxis);

            xScale = SpriteManager.AddSprite(
                FlatRedBallServices.Load <Texture2D>("Content/EditorHandles/ScaleX.png", GuiManager.InternalGuiContentManagerName), axisLayer);
            editAxisSpriteArray.Add(xScale);

            yScale = SpriteManager.AddSprite(
                FlatRedBallServices.Load <Texture2D>("Content/EditorHandles/ScaleY.png", GuiManager.InternalGuiContentManagerName), axisLayer);
            editAxisSpriteArray.Add(yScale);

            xRot = SpriteManager.AddSprite(
                FlatRedBallServices.Load <Texture2D>("Content/EditorHandles/RotateX.png", GuiManager.InternalGuiContentManagerName), axisLayer);

            editAxisSpriteArray.Add(xRot);

            yRot = SpriteManager.AddSprite(
                FlatRedBallServices.Load <Texture2D>("Content/EditorHandles/RotateY.png", GuiManager.InternalGuiContentManagerName), axisLayer);



            editAxisSpriteArray.Add(yRot);

            xAxis.AttachTo(origin, true);
            yAxis.AttachTo(origin, true);
            zAxis.AttachTo(origin, true);
            xScale.AttachTo(origin, true);
            yScale.AttachTo(origin, true);
            xRot.AttachTo(origin, true);
            yRot.AttachTo(origin, true);

            Scale = 1;

            editAxisSpriteArray.Visible = false;
            mCursorOverAxis             = false;
            mVisible = false;
        }
예제 #5
0
        public float Fire()
        {
            if (CooldownCounter != Cooldown)
            {
                return(0f);
            }

            SoundEffectInstance?.Play();

            var middleLength = Length - Start.Texture.Width - End.Texture.Width;

            MiddleLength = middleLength;

            var tempRect = Start.Rectangle;

            tempRect.Width  = Start.Texture.Width;
            tempRect.Height = Start.Texture.Height;
            Start.Rectangle = tempRect;

            var tempRect2 = Middle.Rectangle;

            tempRect2.Width  = Convert.ToInt16(middleLength);
            Middle.Rectangle = tempRect2;

            var tempRect3 = End.Rectangle;

            tempRect3.Width  = End.Texture.Width;
            tempRect3.Height = End.Texture.Height;
            End.Rectangle    = tempRect3;

            Start.Position = Position;
            Start.Rotation = Rotation;

            var tempPos = Middle.Position;

            tempPos.X       = (int)Math.Cos(Rotation) * Start.Texture.Width + Position.X;
            tempPos.Y       = (int)Math.Sin(Rotation) * Start.Texture.Width + Position.Y;
            Middle.Position = tempPos;

            Middle.Rotation = Rotation;

            var tempPos2 = End.Position;

            tempPos.X    = (int)Math.Cos(Rotation) * Middle.Rectangle.Width + Middle.Position.X;
            tempPos.Y    = (int)Math.Sin(Rotation) * Middle.Rectangle.Width + Middle.Position.Y;
            End.Position = tempPos2;
            End.Rotation = Rotation;

            SpriteList.Add(Start);
            SpriteList.Add(Middle);
            SpriteList.Add(End);

            CooldownCounter  = 0f;
            _durationCounter = Duration;
            IsFiring         = true;
            TurnRate         = BaseTurnrate * 0.1f;

            return(EnergyCost);
        }
예제 #6
0
    /// <summary>
    /// Constructs the pane with all the sprites.
    /// </summary>
    public DemoSpriteMoving()
    {
        // Create the basics
        sprites  = new SpriteList();
        viewport = new SpriteViewport(sprites);
        viewport.BackgroundColor = new Color(0, 0, 50);

        // Load in the static green sphere
        IDrawable      drawable = DemoSprites.TilesetFactory.Create("red-sphere");
        DrawableSprite sprite1  = new DrawableSprite(drawable);

        sprite = new MovingSprite(sprite1);
        sprite.StoppedMoving += OnStoppedMoving;
        sprite.Height         = sprite.Width = 64;
        sprite.X              = sprite.Y = 10;
        sprites.Add(sprite);

        // Create the target
        drawable      = DemoSprites.TilesetFactory.Create("green-sphere");
        target        = new DrawableSprite(drawable);
        target.Height = target.Width = 32;
        sprites.Add(target);

        // Load in the static green sphere
        drawable = DemoSprites.TilesetFactory.Create("red-sphere2");
        DrawableSprite sprite2a = new DrawableSprite(drawable);

        sprite2        = new MovingSprite(sprite2a);
        sprite2.Height = sprite2.Width = 64;
        sprite2.X      = sprite2.Y = 10;
        sprites.Add(sprite2);

        // Create the target
        drawable       = DemoSprites.TilesetFactory.Create("green-sphere");
        target2        = new DrawableSprite(drawable);
        target2.Height = target2.Width = 32;
        sprites.Add(target2);
        sprite2.DesiredX = Entropy.Next(0, viewport.Width - sprite.Width);
        sprite2.DesiredY = Entropy.Next(0, viewport.Height - sprite.Height);
        target2.X        = sprite2.DesiredX + 16;
        target2.Y        = sprite2.DesiredY + 16;

        // Start our timer
        Timeout.Add(1000, OnNewLocation2);
    }
예제 #7
0
    /// <summary>
    /// Constructs the pane with all the sprites.
    /// </summary>
    public DemoSpriteMoving()
    {
        // Create the basics
        sprites = new SpriteList();
        viewport = new SpriteViewport(sprites);
        viewport.BackgroundColor = new Color(0, 0, 50);

        // Load in the static green sphere
        IDrawable drawable = DemoSprites.TilesetFactory.Create("red-sphere");
        DrawableSprite sprite1 = new DrawableSprite(drawable);
        sprite = new MovingSprite(sprite1);
        sprite.StoppedMoving += OnStoppedMoving;
        sprite.Height = sprite.Width = 64;
        sprite.X = sprite.Y = 10;
        sprites.Add(sprite);

        // Create the target
        drawable = DemoSprites.TilesetFactory.Create("green-sphere");
        target = new DrawableSprite(drawable);
        target.Height = target.Width = 32;
        sprites.Add(target);

        // Load in the static green sphere
        drawable = DemoSprites.TilesetFactory.Create("red-sphere2");
        DrawableSprite sprite2a = new DrawableSprite(drawable);
        sprite2 = new MovingSprite(sprite2a);
        sprite2.Height = sprite2.Width = 64;
        sprite2.X = sprite2.Y = 10;
        sprites.Add(sprite2);

        // Create the target
        drawable = DemoSprites.TilesetFactory.Create("green-sphere");
        target2 = new DrawableSprite(drawable);
        target2.Height = target2.Width = 32;
        sprites.Add(target2);
        sprite2.DesiredX = Entropy.Next(0, viewport.Width - sprite.Width);
        sprite2.DesiredY = Entropy.Next(0, viewport.Height - sprite.Height);
        target2.X = sprite2.DesiredX + 16;
        target2.Y = sprite2.DesiredY + 16;

        // Start our timer
        Timeout.Add(1000, OnNewLocation2);
    }
예제 #8
0
    /// <summary>
    /// Constructs the pane with all the sprites.
    /// </summary>
    public DemoSpriteTileset()
    {
        // Create the basics
        sprites  = new SpriteList();
        viewport = new SpriteViewport(sprites);
        viewport.BackgroundColor = new Color(0, 0, 50);

        // Load in the static green sphere
        IDrawable      drawable = DemoSprites.TilesetFactory.Create("green-sphere");
        DrawableSprite sprite   = new DrawableSprite(drawable);

        sprite.Height = sprite.Width = 64;
        sprite.X      = sprite.Y = 10;
        sprites.Add(sprite);

        // Load in the animated red sphere
        int rows = 6;
        int cols = 6;

        for (int i = 0; i < cols; i++)
        {
            for (int j = 0; j < rows; j++)
            {
                if (i == j)
                {
                    drawable = DemoSprites.TilesetFactory.Create("red-sphere2");
                }
                else
                {
                    drawable = DemoSprites.TilesetFactory.Create("red-sphere");
                }

                sprite        = new DrawableSprite(drawable);
                sprite.Height = sprite.Width = 64;
                sprite.X      = 100 + i * 100;
                sprite.Y      = 10 + j * 100;
                sprite.Randomize();
                sprites.Add(sprite);
            }
        }
    }
예제 #9
0
        void CustomInitialize()
        {
            for (int i = 0; i < 3; i++)
            {
                var sprite = new Sprite();
                SpriteList.Add(sprite);
                SpriteManager.AddToLayer(sprite, LayerInstance);
            }

            SpriteList[0].Y = 0;
            SpriteList[1].Y = -10;
            SpriteList[2].Y = 10;
        }
예제 #10
0
 public PartyGUIMember(SpritedBattlePokemon pkmn, SpriteList sprites)
 {
     _usePartyPkmn = false;
     _battlePkmn   = pkmn;
     _color        = GetColor();
     _mini         = new Sprite()
     {
         Image    = pkmn.Mini,
         Y        = Sprite_BounceDefY,
         Callback = Sprite_Bounce,
         Data     = new Sprite_BounceData()
     };
     sprites.Add(_mini);
     _background = new Image((UI.Program.RenderWidth / 2) - (UI.Program.RenderWidth / 20), (UI.Program.RenderHeight / 4) - (UI.Program.RenderHeight / 20));
     UpdateBackground();
 }
예제 #11
0
 public PartyGUIMember(PartyPokemon pkmn, SpriteList sprites)
 {
     _usePartyPkmn = true;
     _partyPkmn    = pkmn;
     _color        = GetColor();
     _mini         = new Sprite()
     {
         Image    = PokemonImageUtils.GetMini(pkmn.Species, pkmn.Form, pkmn.Gender, pkmn.Shiny, pkmn.IsEgg),
         Y        = Sprite_BounceDefY,
         Callback = Sprite_Bounce,
         Data     = new Sprite_BounceData()
     };
     sprites.Add(_mini);
     _background = new Image((UI.Program.RenderWidth / 2) - (UI.Program.RenderWidth / 20), (UI.Program.RenderHeight / 4) - (UI.Program.RenderHeight / 20));
     UpdateBackground();
 }
예제 #12
0
    /// <summary>
    /// Constructs the pane with all the sprites.
    /// </summary>
    public DemoSpriteBounce()
    {
        // Create the basics
        sprites = new SpriteList();
        viewport = new SpriteViewport(sprites);
        viewport.BackgroundColor = new Color(0, 0, 50);

        // Load in a basic drawable
        IDrawable drawable = DemoSprites.PixbufFactory.Create("green-sphere");

        // Create the sprites
        for (int i = 0; i < 20; i++)
        {
            Bounce sprite = new Bounce(drawable);
            sprite.Width = sprite.Height = 64;
            sprites.Add(sprite);
        }
    }
예제 #13
0
    /// <summary>
    /// Constructs the pane with all the sprites.
    /// </summary>
    public DemoSpriteBounce()
    {
        // Create the basics
        sprites  = new SpriteList();
        viewport = new SpriteViewport(sprites);
        viewport.BackgroundColor = new Color(0, 0, 50);

        // Load in a basic drawable
        IDrawable drawable = DemoSprites.PixbufFactory.Create("green-sphere");

        // Create the sprites
        for (int i = 0; i < 20; i++)
        {
            Bounce sprite = new Bounce(drawable);
            sprite.Width = sprite.Height = 64;
            sprites.Add(sprite);
        }
    }
예제 #14
0
    /// <summary>
    /// Constructs the pane with all the sprites.
    /// </summary>
    public DemoSpriteTileset()
    {
        // Create the basics
        sprites = new SpriteList();
        viewport = new SpriteViewport(sprites);
        viewport.BackgroundColor = new Color(0, 0, 50);

        // Load in the static green sphere
        IDrawable drawable = DemoSprites.TilesetFactory.Create("green-sphere");
        DrawableSprite sprite = new DrawableSprite(drawable);
        sprite.Height = sprite.Width = 64;
        sprite.X = sprite.Y = 10;
        sprites.Add(sprite);

        // Load in the animated red sphere
        int rows = 6;
        int cols = 6;

        for (int i = 0; i < cols; i++)
        {
            for (int j = 0; j < rows; j++)
            {
                if (i == j)
                {
                    drawable = DemoSprites.TilesetFactory.Create("red-sphere2");
                }
                else
                {
                    drawable = DemoSprites.TilesetFactory.Create("red-sphere");
                }

                sprite = new DrawableSprite(drawable);
                sprite.Height = sprite.Width = 64;
                sprite.X = 100 + i * 100;
                sprite.Y = 10 + j * 100;
                sprite.Randomize();
                sprites.Add(sprite);
            }
        }
    }
예제 #15
0
        /// <summary>
        /// Removes all Sprites and SpriteFrames referencing the argument Texture2D.  Sets all
        /// SpriteGrid TextureLocationArray references to the argument texture back to the base texture or removes the
        /// SpriteGrid if the base texture is the same as the argument.
        /// </summary>
        /// <param name="texture">The texture being removed.</param>
        #endregion
        public static void RemoveObjectsReferencing(Texture2D texture)
        {
            SpriteList spritesToRemove = new SpriteList();

            // will need to store all removed objects for undo
            foreach (Sprite s in mScene.Sprites)
            {
                if (s.Texture == texture)
                {
                    spritesToRemove.Add(s);
                }
            }
            DeleteSprites(spritesToRemove, false);

            for (int i = GameData.Scene.SpriteGrids.Count - 1; i > -1; i--)
            {
                if (GameData.Scene.SpriteGrids[i].Blueprint.Texture == texture)
                {
                    /* The blueprint texture matches the texture being removed.  Remove the
                     * SpriteGrid from the SE.
                     */
                    sesgMan.DeleteGrid(GameData.Scene.SpriteGrids[i]);
                }
                else
                {
                    GameData.Scene.SpriteGrids[i].ReplaceTexture(
                        texture,
                        GameData.Scene.SpriteGrids[i].Blueprint.Texture);
                }
            }


            for (int i = Scene.SpriteFrames.Count - 1; i > -1; i--)
            {
                if (Scene.SpriteFrames[i].Texture == texture)
                {
                    DeleteSpriteFrame(Scene.SpriteFrames[i], true);
                }
            }
        }
예제 #16
0
        /// <summary>
        /// Generate an image for each font character
        /// </summary>
        /// <param name="list">input list of characters</param>
        /// <param name="font">the font to use</param>
        /// <returns>maximum dimensions among the rendered chars</returns>
        static Size CreateCharSprites(char[] list, Font font)
        {
            Size dim = FindMaxDim(list, font);

            Log.Debug("dim = [" + dim.Width + "x" + dim.Height + "]");

            for (int ci = 0; ci < list.Length; ci++)
            {
                char c = list[ci];
                //Log.Debug("Spriting "+c);
                var img = RenderCharSprite(c, font, dim);
                //#if DEBUG
                //using (var fs = File.OpenWrite("sprite-"+((int)c)+".png")) {
                //	img.SaveAsPng(fs);
                //}
                //#endif
                SpriteList.Add(img);
                double avg = Helpers.FindAverageGray(img);
                //Log.Debug("Spriting avg = "+avg);
            }
            return(dim);
        }
예제 #17
0
        internal void Add(Sprite sprite)
        {
            if (sprite.mOrdered)
            {
#if DEBUG
                if (mSprites.Contains(sprite))
                {
                    throw new InvalidOperationException("Can't add the Sprite to this layer because it's already added");
                }
#endif
                mSprites.Add(sprite);
            }
            else
            {
#if DEBUG
                if (mZBufferedSprites.Contains(sprite))
                {
                    throw new InvalidOperationException("Can't add the Sprite to this layer because it's already added");
                }
#endif
                mZBufferedSprites.Add(sprite);
            }
        }
예제 #18
0
        private void Open_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog
            {
                Title           = "Select data.win to open",
                CheckPathExists = true,
                CheckFileExists = true,
                Filter          = "Game Maker .win files|*.win",
                FilterIndex     = 0,
                Multiselect     = false
            };

            Stream fs = null;

            if (dialog.ShowDialog() == true)
            {
                fs = dialog.OpenFile();
            }
            else
            {
                return;
            }

            using (BinaryReader br = new BinaryReader(fs))
            {
                GEN8.Load(br);
                //GEN8 g = GEN8.Instance;
                //Console.WriteLine(string.Format("Filename: {0}\nName: {1}\nDisplayName: {2}\nSteamAppID: {3}", g.Filename, g.Name, g.DisplayName, g.SteamAppID));

                TXTR.Load(br);
                SPRT.Load(br);
                BGND.Load(br);
            }

            List <Sprite> sprites = SPRT.Instance.Contents;

            SpriteList.Clear();

            for (int i = 0; i < sprites.Count; i++)
            {
                Sprite spr = sprites[i];
                if (spr.GetFrames().Length < 1)
                {
                    continue;
                }

                AssetItem ai = new AssetItem(spr.Name, spr);
                SpriteList.Add(ai);
            }

            List <Background> backgrounds = BGND.Instance.Contents;

            BackgroundList.Clear();

            for (int i = 0; i < backgrounds.Count; i++)
            {
                AssetItem ai = new AssetItem(backgrounds[i].Name, backgrounds[i]);
                BackgroundList.Add(ai);
            }

            GEN8 g = GEN8.Instance;

            GameInfoText.Inlines.Clear();
            GameInfoText.Inlines.Add(new Bold(new Run("Name: ")));
            GameInfoText.Inlines.Add(new Run(g.DisplayName + "\n"));
            GameInfoText.Inlines.Add(new Bold(new Run("Development Name: ")));
            GameInfoText.Inlines.Add(new Run(g.Name + "\n"));
            GameInfoText.Inlines.Add(new Bold(new Run("Version: ")));
            GameInfoText.Inlines.Add(new Run(string.Format("{0}.{1}\n", g.MajorVersion, g.MinorVersion)));
            GameInfoText.Inlines.Add(new Bold(new Run("Build Version: ")));
            GameInfoText.Inlines.Add(new Run(g.BuildVersion + "\n"));
            GameInfoText.Inlines.Add(new Bold(new Run("Release Version: ")));
            GameInfoText.Inlines.Add(new Run(g.ReleaseVersion + "\n"));
        }
예제 #19
0
 /// <summary>
 /// Adds a sprite to a batch to be rendered to the output image.
 /// </summary>
 /// <param name="sprite">The graphic sprite.</param>
 /// <param name="X">The location of the sprite (in 8x8 tiles).</param>
 /// <param name="Y">The location of the sprite (int 8x8 tiles).</param>
 /// <param name="paletteIndex">The count of the paletteIndex to render with.</param>
 public void AddSprite(SpriteDefinition sprite, int X, int Y, byte paletteIndex)
 {
     _sprites.Add(new SpriteListItem(sprite, paletteIndex, new Point(X, Y)));
 }
예제 #20
0
        public void Render(SpriteList spriteList, Vector2 area, HAlignment hAlign, VAlignment vAlign, int maxCharacters = -1)
        {
            if (overflowMode == TextOverflowMode.Minify)
            {
                FitTextInsideArea(area);
            }
            List <int> lines;
            float      totalHeight;
            float      longestLineWidth;

            PrepareWordsAndLines(area.X, area.Y, out lines, out totalHeight, out longestLineWidth);
            // Draw all lines.
            int   b = 0;
            float y = 0;
            int   c = 0;

            foreach (int count in lines)
            {
                // Calculate height and width of line in pixels.
                float maxHeight  = 0;
                float totalWidth = 0;
                for (int j = 0; j < count; j++)
                {
                    var word  = fittedWords[b + j];
                    var style = Styles[word.Style];
                    maxHeight = Math.Max(maxHeight, ScaleSize(style.Size + style.SpaceAfter));
                    if (word.IsTagBegin)
                    {
                        maxHeight = Math.Max(maxHeight, ScaleSize(style.ImageSize.Y + style.SpaceAfter));
                    }
                    totalWidth += word.Width;
                }
                // Calculate offset for horizontal alignment.
                var offset = new Vector2();
                if (hAlign == HAlignment.Right)
                {
                    offset.X = area.X - totalWidth;
                }
                else if (hAlign == HAlignment.Center)
                {
                    offset.X = ((area.X - totalWidth) * 0.5f).Round();
                }
                // Calculate offset for vertical alignment.
                if (vAlign == VAlignment.Bottom)
                {
                    offset.Y = area.Y - totalHeight;
                }
                else if (vAlign == VAlignment.Center)
                {
                    offset.Y = ((area.Y - totalHeight) * 0.5f).Round();
                }
                // Draw string.
                for (int j = 0; j < count; j++)
                {
                    var       word     = fittedWords[b + j];
                    var       t        = texts[word.TextIndex];
                    TextStyle style    = Styles[word.Style];
                    Vector2   position = new Vector2(word.X, y) + offset;
                    if (IsBullet(word) && style.ImageTexture != null)
                    {
                        if (maxCharacters >= 0 && c >= maxCharacters)
                        {
                            break;
                        }
                        var sz = style.ImageSize * scaleFactor;
                        spriteList.Add(
                            style.ImageTexture, Color4.White, position + new Vector2(0, (maxHeight - sz.Y) * 0.5f),
                            sz, Vector2.Zero, Vector2.One, tag: word.Style);
                        position.X += sz.X;
                        c++;
                    }
                    var yOffset = new Vector2(0, (maxHeight - ScaleSize(style.Size)) * 0.5f);
                    var font    = style.Font;
                    if (style.CastShadow)
                    {
                        for (int k = 0; k < (style.Bold ? 2 : 1); k++)
                        {
                            Renderer.DrawTextLine(
                                font, position + style.ShadowOffset + yOffset, t, style.ShadowColor, ScaleSize(style.Size),
                                word.Start, word.Length, style.LetterSpacing, spriteList, tag: word.Style);
                        }
                    }
                    int wordLength = word.Length;
                    if (maxCharacters >= 0)
                    {
                        if (c >= maxCharacters)
                        {
                            break;
                        }
                        wordLength = wordLength.Min(maxCharacters - c);
                    }
                    for (int k = 0; k < (style.Bold ? 2 : 1); k++)
                    {
                        Renderer.DrawTextLine(
                            font, position + yOffset, t, style.TextColor, ScaleSize(style.Size),
                            word.Start, wordLength, style.LetterSpacing, spriteList, tag: word.Style);
                    }
                    c += wordLength;
                }
                // Draw overlays
                for (int j = 0; j < count; j++)
                {
                    var       word  = fittedWords[b + j];
                    TextStyle style = Styles[word.Style];
                    if (style.ImageUsage == TextStyle.ImageUsageEnum.Overlay)
                    {
                        int k = j + 1;
                        for (; k < count; k++)
                        {
                            if (fittedWords[b + k].IsTagBegin)
                            {
                                break;
                            }
                        }
                        k -= 1;
                        Vector2 lt      = new Vector2(fittedWords[b + j].X, y) + offset;
                        Vector2 rb      = new Vector2(fittedWords[b + k].X + fittedWords[b + k].Width, y) + offset;
                        float   yOffset = (maxHeight - ScaleSize(style.ImageSize.Y)) * 0.5f;
                        spriteList.Add(style.ImageTexture, Color4.White, lt + new Vector2(0, yOffset),
                                       rb - lt + new Vector2(0, style.ImageSize.Y),
                                       Vector2.Zero, Vector2.One, tag: word.Style);
                        j = k;
                    }
                }
                y += maxHeight;
                b += count;
            }
        }
예제 #21
0
        /*
         *  This is the LoadContent class for MonoGame.
         * This class does a number of different things.
         * Primarily, it loads the SQLite/Data files, and then organizes that data.
         * It also set's up the graphics display.
         */
        protected override void LoadContent()
        {
            graphics.IsFullScreen = true;
            graphics.PreferredBackBufferHeight = 1080;
            graphics.PreferredBackBufferWidth  = 1920;
            this.IsMouseVisible = true;
            graphics.ApplyChanges();
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            baseFont = Content.Load <SpriteFont>("BaseText");

            using (SQLiteConnection conn = new SQLiteConnection("Data Source=greyflare.db"))
            {
                conn.Open();
                SQLiteCommand cmd = conn.CreateCommand();

                try
                {
                    cmd.CommandText = "SELECT 1 FROM Skills";
                    cmd.ExecuteScalar();
                }
                catch (Exception ex)
                {
                    cmd.CommandText = "CREATE TABLE Skills (id INTEGER PRIMARY KEY AUTOINCREMENT, skillname LONGTEXT, lvl INTEGER, xp INTEGER)";
                    cmd.ExecuteNonQuery();
                }
                try
                {
                    cmd.CommandText = "SELECT 1 FROM Quests";
                    cmd.ExecuteScalar();
                }
                catch (Exception ex)
                {
                    cmd.CommandText = "CREATE TABLE Quests (id INTEGER PRIMARY KEY AUTOINCREMENT, questname LONGTEXT, questtext LONGTEXT, reqquests LONGTEXT, reqskills LONGTEXT, reqitems LONGTEXT, rwd LONGTEXT, iscomp LONGTEXT)";
                    cmd.ExecuteNonQuery();
                }
            }

            string[] filelist = Directory.GetFiles(@"C:\Users\Alex\source\repos\GreyFlare\GreyFlare\Content\PlayerSprites", "*.png");
            foreach (string s in filelist)
            {
                string sz     = s.Substring(s.LastIndexOf("\\")).Replace("\\", "");
                string TName  = sz.Split('.')[0];
                string TNameB = TName.Replace("_", "");
                SpriteList.Add(TNameB, Content.Load <Texture2D>(@"PlayerSprites\" + TName));
            }
            filelist = Directory.GetFiles(@"C:\Users\Alex\source\repos\FlareEdit\FlareEdit\Content", "*.png");
            foreach (string s in filelist)
            {
                string sz     = s.Substring(s.LastIndexOf("\\")).Replace("\\", "");
                string TName  = sz.Split('.')[0];
                string TNameB = TName.Replace("_", "");
                TextureList.Add(TNameB, Content.Load <Texture2D>(TName));
            }
            string[] fileobjlist = Directory.GetFiles(@"C:\Users\Alex\source\repos\FlareEdit\FlareEdit\Content\WO", "*.png");
            foreach (string s in fileobjlist)
            {
                string sz     = s.Substring(s.LastIndexOf("\\")).Replace("\\", "");
                string TName  = sz.Split('.')[0];
                string TNameB = TName.Replace("_", "");
                ObjTextureList.Add(TNameB, Content.Load <Texture2D>(@"WO\" + TName));
            }
            string[] npcfile = Directory.GetFiles(@"C:\Users\Alex\source\repos\GreyFlare\GreyFlare\Content\NPC", "*.png");
            foreach (string s in npcfile)
            {
                string sz     = s.Substring(s.LastIndexOf("\\")).Replace("\\", "");
                string TName  = sz.Split('.')[0];
                string TNameB = TName.Replace("_", "");
                NpcSpriteList.Add(TNameB, Content.Load <Texture2D>(@"NPC\" + TName));
            }
            LoadQuests();
            LoadMap();
            LoadNPC();

            using (SQLiteConnection conn = new SQLiteConnection("Data Source=GreyPlayer.db"))
            {
                conn.Open();
                SQLiteCommand cmd = conn.CreateCommand();
                object        rn  = null;
                try
                {
                    cmd.CommandText = "SELECT * FROM Players";
                    rn = cmd.ExecuteScalar().ToString();
                } catch (Exception ex)
                {
                }
                if (rn != null)
                {
                    cmd.CommandText = "SELECT * FROM Players";
                    using (SQLiteDataReader rdr = cmd.ExecuteReader())
                    {
                        while (rdr.Read())
                        {
                            Player pA = new Player(rdr[1].ToString(), SpriteList[rdr[2].ToString()], SpriteList[rdr[3].ToString()], float.Parse(rdr[4].ToString()), float.Parse(rdr[5].ToString()), Int32.Parse(rdr[6].ToString()));

                            PlayerList.Add(pA);
                        }
                    }
                }
            }

            if (PlayerList.Count < 1)
            {
                using (SQLiteConnection conn = new SQLiteConnection("Data Source=GreyPlayer.db"))
                {
                    conn.Open();
                    try
                    {
                        SQLiteCommand cmd = conn.CreateCommand();
                        cmd.CommandText = "CREATE TABLE Players (id INTEGER PRIMARY KEY AUTOINCREMENT, name LONGTEXT, head LONGTEXT, body LONGTEXT, x LONGTEXT, y LONGTEXT, currency INTEGER)";
                        cmd.ExecuteNonQuery();
                        cmd.CommandText = "CREATE TABLE Player_Quests (id INTEGER PRIMARY KEY AUTOINCREMENT, questname LONGTEXT, iscomp LONGTEXT)";
                        cmd.ExecuteNonQuery();
                        cmd.CommandText = "CREATE TABLE Player_Inv (id INTEGER PRIMARY KEY AUTOINCREMENT, item LONGTEXT)";
                        cmd.ExecuteNonQuery();
                        cmd.CommandText = "CREATE TABLE Player_Skills (id INTEGER PRIMARY KEY AUTOINCREMENT, skill LONGTEXT, xp LONGTEXT, lvl LONGTEXT)";
                        cmd.ExecuteNonQuery();

                        cmd.CommandText = "INSERT INTO Players (name, head, body, x, y, currency) VALUES (@n, @h, @b, @x, @y, @c)";
                        cmd.Parameters.AddWithValue("@n", "Test");
                        cmd.Parameters.AddWithValue("@h", "LeatherHead");
                        cmd.Parameters.AddWithValue("@b", "MageBody1");
                        cmd.Parameters.AddWithValue("@x", "0");
                        cmd.Parameters.AddWithValue("@y", "0");
                        cmd.Parameters.AddWithValue("@c", "25");
                        cmd.ExecuteNonQuery();
                        PlayerList.Add(new Player("Test", SpriteList["LeatherHead"], SpriteList["MageBody1"], 10, 10, 25));
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex);
                    }
                }
            }
            p    = PlayerList[0];
            CamX = PlayerList[0].PlayerX;
            CamY = PlayerList[0].PlayerY;
        }
예제 #22
0
        private void InitUI()
        {
            var listlable = new CCLabel("佣兵列表", StringManager.GetText("GlobalFont"), 14)
            {
                Position = new CCPoint(100, 420),
                Color    = CCColor3B.White
            };

            FollowerList = PlayerObject.Instance.Self.AllFollower;
            Page         = (FollowerList.Followers.Count + 8) / 9;

            AddChild(listlable, 100);

            foreach (var obj in FollowerList.Followers)
            {
                var fs = new FollowerSprite(obj, true);
                this.AddChild(fs);
                SpriteList.Add(fs);
            }

            var listview = new CozySampleListView()
            {
                ContentSize = new CCSize(600, 330),
                HasBorder   = true,
                Position    = new CCPoint(100, 60)
            };

            this.AddChild(listview);

            InnerList = new CozySampleListView[3];
            for (int i = 0; i < 3; ++i)
            {
                InnerList[i] = new CozySampleListView()
                {
                    ContentSize = new CCSize(200, 330),
                    Orientation = Public.Controls.Enum.ControlOrientation.Vertical,
                };
                listview.AddItem(new CozySampleListViewItem(InnerList[i]));
            }

            int fight = PlayerObject.Instance.Self.FightFollower.Followers.Count;

            AllFollower = new CCLabel("总数" + fight + "/" + FollowerList.Followers.Count, StringManager.GetText("GlobalFont"), 14)
            {
                Position = new CCPoint(92, 37),
                Color    = CCColor3B.White,
            };
            AddChild(AllFollower, 100);

            PageNumber = new CCLabel((CurPage + 1) + "/" + Page, StringManager.GetText("GlobalFont"), 14)
            {
                Position = new CCPoint(389, 37),
                Color    = CCColor3B.White
            };
            AddChild(PageNumber, 100);

            ShowDetail = new FollowerDetailSprite()
            {
                Position    = new CCPoint(100, 100),
                AnchorPoint = CCPoint.Zero,
                Visible     = false,
                FightStatusChangeCallback = new Action <Follower>(OnStatusChange),
            };
            this.AddChild(ShowDetail, 201);

            LastPageButton = new CozySampleButton(473, 17, 78, 36)
            {
                Text     = "上一页",
                FontSize = 14,
                OnClick  = () => PrevPage(),
            };
            NextPageButton = new CozySampleButton(585, 17, 78, 36)
            {
                Text     = "下一页",
                FontSize = 14,
                OnClick  = () => NextPage(),
            };
            AddChild(NextPageButton, 100);
            AddChild(LastPageButton, 100);
            uidispatcher.Add(NextPageButton);
            uidispatcher.Add(LastPageButton);

            var backButton = new CozySampleButton(650, 17, 78, 36)
            {
                Text     = "返回",
                FontSize = 14,
                OnClick  = () =>
                {
                    AppDelegate.SharedWindow.DefaultDirector.PopScene();
                }
            };

            AddChild(backButton, 100);
            uidispatcher.Add(backButton);
        }
예제 #23
0
        /// <summary>
        /// Emits particles as specified by the Emitter class
        /// </summary>
        /// <remarks>
        /// This method initiates one emission of particles.  The number of particles emitted
        /// depends on the numberPerEmission variable.  This method does not consider emission timing, and the time
        /// is not recorded for emission timing.
        ///
        /// The argument SpriteList stores all Sprites which were emitted
        /// during the call.  The Sprites are added regularly, rather than in a one way relationship.  This enables
        /// modification of emitted particles after the method ends.  null can be passed as an argument
        /// if specific action is not needed for emitted particles.  Particles are automatically created
        /// through the SpriteManager as Particle Sprites.
        /// <seealso cref="FlatRedBall.Graphics.Particle.Emitter.TimedEmit()"/>
        /// <seealso cref="FlatRedBall.SpriteManager.AddParticleSprite"/>
        ///
        /// </remarks>
        /// <param name="spriteList">The list of Sprites (which can be null) to add all Sprites created
        /// by this call.</param>
        public void Emit(SpriteList spriteList)
        {
            UpdateDependencies(TimeManager.CurrentTime);
            if (mBoundedEmission && mEmissionBoundary != null)
            {
                float cameraDistance;
#if FRB_MDX
                cameraDistance = -SpriteManager.Camera.Z;
#else
                cameraDistance = SpriteManager.Camera.Z;
#endif
                if (cameraDistance < 0)
                {
                    return;                     // skip check bounding if camera is behind z = 0 plain
                }
                cameraRectangle.Position = new Vector3(SpriteManager.Camera.X, SpriteManager.Camera.Y, 0);
                cameraRectangle.ScaleY   = SpriteManager.Camera.YEdge * cameraDistance / 100;
                cameraRectangle.ScaleX   = cameraRectangle.ScaleY * SpriteManager.Camera.AspectRatio;
                if (!mEmissionBoundary.CollideAgainst(cameraRectangle))
                {
                    return;
                }
            }

            #region loop through creating NumberPerEmission particles

            for (int i = 0; i < NumberPerEmission; i++)
            {
                #region Create the tempParticle (the Sprite instance)

                Sprite tempParticle = null;

                if (mEmitsAutomaticallyUpdatedSprites)
                {
                    tempParticle = SpriteManager.AddParticleSprite(EmissionSettings.Texture);
                }
                else
                {
                    tempParticle = SpriteManager.AddManualParticleSprite(EmissionSettings.Texture);
                }

                #endregion

                #region Removal events
                switch ((int)this.RemovalEvent)
                {
                case (int)RemovalEventType.Alpha0:
                    SpriteManager.mRemoveWhenAlphaIs0.Add(tempParticle);
                    break;

                case (int)RemovalEventType.OutOfScreen:
                    tempParticle.CustomBehavior += FlatRedBall.Utilities.CustomBehaviorFunctions.RemoveWhenOutsideOfScreen;

                    break;

                case (int)RemovalEventType.Timed:

#if FRB_MDX
                    tempParticle.Instructions.Add(
                        new FlatRedBall.Instructions.StaticMethodInstruction(
                            sSpriteManagerRemoveSprite,
                            new object[] { tempParticle },
                            TimeManager.CurrentTime + (mSecondsLasting * mSecondsModifier)));
#else
                    // August 28, 2012
                    // The following code
                    // was added during Sentient
                    // to fix some issue with particles
                    // not being removed when paused.  Not
                    // sure what the problem was, but this bug
                    // causes particles to be immediately removed
                    // if they are spawned when the game is paused -
                    // at least most of the time.  The reason is because
                    // when the game is paused, then the CurrentTime is 0
                    // which means the particle is told to be removed at a
                    // time very close to 0.  Usually this is in the past so
                    // any particles spawned when the game is paused will immediately
                    // be removed.  Not sure what the intent was here...
                    //double isEnginePaused = 1.0;
                    //if( InstructionManager.IsEnginePaused )
                    //{
                    //    isEnginePaused = 0.0;
                    //}
                    SpriteManager.mTimedRemovalList.InsertSorted(tempParticle,
                                                                 TimeManager.CurrentTime + (mSecondsLasting * mSecondsModifier));
#endif



                    //                        SpriteManager.RemoveSpriteInstruction(tempParticle, TimeManager.CurrentTimeAfterXSeconds(SecondsLasting));
                    break;
                }
                #endregion

                if (tempParticle == null)
                {
                    // do something here with the SpriteManager.  Probably call some event
                }

                #region Sprite-specific stuff (not stuff that other types can do, which are handled below)
                // manually inlined for speed:

                //tempParticle.LeftTextureCoordinate = 0;
                tempParticle.mVertices[0].TextureCoordinate.X = 0;
                tempParticle.mVertices[3].TextureCoordinate.X = 0;

                //tempParticle.RightTextureCoordinate = 1;
                tempParticle.mVertices[1].TextureCoordinate.X = 1;
                tempParticle.mVertices[2].TextureCoordinate.X = 1;

                //tempParticle.TopTextureCoordinate = 0;
                tempParticle.mVertices[0].TextureCoordinate.Y = 0;
                tempParticle.mVertices[1].TextureCoordinate.Y = 0;

                // Use the setter here to call UpdateScale
                tempParticle.BottomTextureCoordinate = 1;

                // Justin Johnson, 04/2015 - retiring particle blueprints
                // Use the animation chain from the
                // emission settings instead of setting
                // the animation based on chains and chain name
                if (EmissionSettings.AnimationChains != null)
                {
                    tempParticle.AnimationChains = EmissionSettings.AnimationChains;
                }
                tempParticle.SetAnimationChain(EmissionSettings.AnimationChain);
                tempParticle.CurrentFrameIndex = 0;
                tempParticle.Animate           = EmissionSettings.Animate;

                //tempParticle.AnimationChains = mParticleBlueprint.AnimationChains;
                //if (!string.IsNullOrEmpty(mParticleBlueprint.CurrentChainName ))
                //{

                //    tempParticle.CurrentChainName = mParticleBlueprint.CurrentChainName;
                //    tempParticle.Animate = mParticleBlueprint.Animate;
                //    tempParticle.CurrentFrameIndex = 0;
                //    //                return;
                //}

                if (EmissionSettings.Billboarded)
                {
                    SpriteManager.Camera.AddSpriteToBillboard(tempParticle);
                }


                if (spriteList != null)
                {
                    spriteList.Add(tempParticle);
                }

                if (mLayerToEmitOn != null)
                {
                    SpriteManager.AddToLayer(tempParticle, mLayerToEmitOn);
                }
                #endregion


                SetPositionedObjectProperties(tempParticle);
                //SetScalableProperties(tempParticle);
                SetSpriteScaleProperties(tempParticle);


                SetColorableProperties(tempParticle);


                // this sets the CustomBehavior to null so be sure not to call this after
                // setting any CustomBehavior.
                // Update on March 7, 2011:  CustomBehaviors are falling
                // out of style.  Particles no longer support them.
                // tempParticle.CopyCustomBehaviorFrom(mParticleBlueprint);
            }

            #endregion
        }
예제 #24
0
        public void CopyCurrentObjects(Window callingWindow)
        {
            if ((GameData.EditorLogic.CurrentSprites.Count != 0) ||
                (GameData.EditorLogic.CurrentSpriteFrames.Count != 0) ||
                (GameData.EditorLogic.CurrentPositionedModels.Count != 0) ||
                (GameData.EditorLogic.CurrentTexts.Count != 0))
            {
                int instructionNum = 0;

                #region Copy Sprites

                if (SpriteEditorSettings.EditingSprites)
                {

                    // remove the in-screen markers and axes so they don't get touched by the copying
                    GameData.EditorLogic.EditAxes.CurrentObject = null;

                    Sprite topSpriteAdded = null;
                    AttachableList<Sprite> oldestParents = AttachableList<Sprite>.GetTopParents<Sprite, Sprite>(GameData.EditorLogic.CurrentSprites);
                    SpriteList addedSprites = new SpriteList();

                    // The appendedNumbers variable is used for improving performance when copying large groups.  When a Sprite
                    // is copied, it is given a number at the end of its name or if there is already a number present,
                    // it is incremented.  However, copying large groups can result in a lot of string checking which
                    // can hurt performance.
                    // Consider copying 100 Sprites with the same texture.  Their names will likely be redball1, redball2,
                    // redball3, ... redball100.  Let's say redball1 gets copied first.  The SpriteEditor increments the
                    // number at the end to redball2, then checks to see if there is already a Sprite with that name.  If
                    // there is, it increments to redball3 and so on.  This must be conducted on average 10,000 times and each
                    // iteration requires string copying, concatenation, and parsing for integers.  To cut this down, the 
                    // appendedNumbers variable associates a given name (in this case redball) with the last integer appended
                    // to that particular name.  Therefore, when the first Sprite is created, it will loop through 1 - 100 and
                    // eventually end up at redball101.  It will then associate the number 101 with the name redball.  The next
                    // Sprite (named redball2) will know to begin at redball101.  This increases the performance of
                    // copying large groups from O(n^2) to O(n).

                    Dictionary<string, int> appendedNumbers = new Dictionary<string, int>();

                    foreach (Sprite s in oldestParents)
                    {
                        if (s is ISpriteEditorObject)
                        {
                            if (GuiData.ToolsWindow.groupHierarchyControlButton.IsPressed)
                            {
                                topSpriteAdded =
                                    GameData.copySpriteHierarchy(
                                        s, s.Parent as Sprite, GameData.EditorProperties.PixelSize, addedSprites, appendedNumbers);
                            }
                            else
                            {
                                topSpriteAdded =
                                    GameData.copySpriteHierarchy(
                                        s.TopParent as Sprite, null, GameData.EditorProperties.PixelSize, addedSprites, appendedNumbers);
                            }
                        }
                        SpriteList tempSpriteArray = new SpriteList();
                        topSpriteAdded.GetAllDescendantsOneWay(tempSpriteArray);
                        tempSpriteArray.Add(topSpriteAdded);

                    }

                    GameData.EditorLogic.EditAxes.CurrentObject =
                        GameData.EditorLogic.CurrentSprites[0];

                    GameData.Cursor.ClickSprite(null);
                    foreach (Sprite s in AttachableList<Sprite>.GetTopParents<Sprite, Sprite>(addedSprites))
                    {
                        // the 2nd true forces selection of all Sprites
                        GameData.Cursor.ClickObject<Sprite>(s, GameData.EditorLogic.CurrentSprites, true, true);
                    }

                    GameData.Cursor.VerifyAndUpdateGrabbedAgainstCurrent();
                }
                #endregion

                #region Copy SpriteGrids
                else if (SpriteEditorSettings.EditingSpriteGrids)
                {
                    SpriteGrid sg = SESpriteGridManager.CurrentSpriteGrid.Clone();


                    FlatRedBall.Utilities.StringFunctions.MakeNameUnique<SpriteGrid>(sg, GameData.Scene.SpriteGrids);


                    this.sesgMan.PopulateAndAddGridToEngine(sg, GameData.EditorLogic.CurrentSprites[0]);

                    sg.RefreshPaint();
                }
                #endregion

                #region Copy SpriteFrames
                else if (SpriteEditorSettings.EditingSpriteFrames)
                {
                    GameData.EditorLogic.EditAxes.CurrentObject = null;

                    AttachableList<SpriteFrame> oldestParents =
                        AttachableList<SpriteFrame>.GetTopParents<SpriteFrame, SpriteFrame>(GameData.EditorLogic.CurrentSpriteFrames);
                    foreach (SpriteFrame sf in oldestParents)
                    {
                        SpriteFrame topSpriteFrameAdded = GameData.CopySpriteFrameHierarchy(sf, null, GameData.EditorProperties.PixelSize);
                        GameData.Cursor.ClickSpriteFrame(topSpriteFrameAdded);
                    }
                }
                #endregion

                #region Copy Models

                else if (SpriteEditorSettings.EditingModels)
                {
                    GameData.EditorLogic.EditAxes.CurrentObject = null;

                    AttachableList<PositionedModel> oldestParents =
                        AttachableList<PositionedModel>.GetTopParents<PositionedModel, PositionedModel>(GameData.EditorLogic.CurrentPositionedModels);
                    foreach (PositionedModel model in oldestParents)
                    {

                        PositionedModel topSpriteFrameAdded =
                            GameData.CopyModelHierarchy(model, null, GameData.EditorProperties.PixelSize);

                        //         GameData.cursor.ClickSpriteFrame(topSpriteFrameAdded);
                    }
                }

                #endregion

                #region Copy Texts

                else if (SpriteEditorSettings.EditingTexts)
                {
                    GameData.EditorLogic.EditAxes.CurrentObject = null;

                    AttachableList<Text> oldestParents =
                        AttachableList<Text>.GetTopParents<Text, Text>(GameData.EditorLogic.CurrentTexts);
                    foreach (Text text in oldestParents)
                    {

                        Text topText =
                            GameData.CopyTextHierarchy(text, null, GameData.EditorProperties.PixelSize);

                        //         GameData.cursor.ClickSpriteFrame(topSpriteFrameAdded);
                    }

                }

                #endregion

            }
        }
예제 #25
0
        private void SplitSpriteClick(Window callingWindow)
        {
            if (ObjectDisplaying != null)
            {
                float textureWidth = ObjectDisplaying.RightTextureCoordinate - ObjectDisplaying.LeftTextureCoordinate;
                int   wide         = (int)(.5 +
                                           Math.Ceiling(textureWidth));

                float textureHeight = ObjectDisplaying.BottomTextureCoordinate - ObjectDisplaying.TopTextureCoordinate;
                int   height        = (int)(.5 +
                                            Math.Ceiling(textureHeight));

                float scaleXOverTextureWidth = ObjectDisplaying.ScaleX / textureWidth;

                float scaleYOverTextureHeight = ObjectDisplaying.ScaleY / textureHeight;

                float currentLeftTextureCoordinate   = ObjectDisplaying.LeftTextureCoordinate;
                float currentRightTextureCoordinate  = Math.Min(ObjectDisplaying.RightTextureCoordinate, 1);
                float currentTopTextureCoordinate    = ObjectDisplaying.TopTextureCoordinate;
                float currentBottomTextureCoordinate = Math.Min(ObjectDisplaying.BottomTextureCoordinate, 1);
                float maxRightTextureCoordinate      = ObjectDisplaying.RightTextureCoordinate;
                float maxBottomTextureCoordinate     = ObjectDisplaying.BottomTextureCoordinate;

                float startLeft = ObjectDisplaying.X - ObjectDisplaying.ScaleX;
                float startTop  = ObjectDisplaying.Y + ObjectDisplaying.ScaleY;

                for (int x = 0; x < wide; x++)
                {
                    currentTopTextureCoordinate    = ObjectDisplaying.TopTextureCoordinate;
                    currentBottomTextureCoordinate = Math.Min(ObjectDisplaying.BottomTextureCoordinate, 1);

                    for (int y = 0; y < height; y++)
                    {
                        Sprite newSprite = null;
                        if (x == 0 && y == 0)
                        {
                            newSprite = ObjectDisplaying;
                        }
                        else
                        {
                            newSprite = ObjectDisplaying.Clone();
                            SpriteManager.AddSprite(newSprite);
                            mSpriteList.Add(newSprite);

                            FlatRedBall.Utilities.StringFunctions.MakeNameUnique <Sprite>(
                                newSprite, mSpriteList);
                        }

                        newSprite.LeftTextureCoordinate   = currentLeftTextureCoordinate;
                        newSprite.RightTextureCoordinate  = currentRightTextureCoordinate;
                        newSprite.TopTextureCoordinate    = currentTopTextureCoordinate;
                        newSprite.BottomTextureCoordinate = currentBottomTextureCoordinate;

                        newSprite.ScaleX = scaleXOverTextureWidth * (newSprite.RightTextureCoordinate - newSprite.LeftTextureCoordinate);
                        newSprite.ScaleY = scaleYOverTextureHeight * (newSprite.BottomTextureCoordinate - newSprite.TopTextureCoordinate);

                        newSprite.X = startLeft +
                                      2 * scaleXOverTextureWidth * (newSprite.LeftTextureCoordinate - ObjectDisplaying.LeftTextureCoordinate) +
                                      newSprite.ScaleX;

                        newSprite.Y = startTop -
                                      2 * scaleYOverTextureHeight * (newSprite.TopTextureCoordinate - ObjectDisplaying.TopTextureCoordinate) -
                                      newSprite.ScaleY;

                        currentTopTextureCoordinate    = currentBottomTextureCoordinate;
                        currentBottomTextureCoordinate = currentTopTextureCoordinate + 1;

                        // Since FSB only allows texture coordinates between 0 and 1, let's make sure that we're not exceeding that.
                        if (newSprite.LeftTextureCoordinate >= 1)
                        {
                            int leftInt = (int)newSprite.LeftTextureCoordinate;
                            newSprite.LeftTextureCoordinate  -= leftInt;
                            newSprite.RightTextureCoordinate -= leftInt;
                        }

                        if (newSprite.TopTextureCoordinate >= 1)
                        {
                            int topInt = (int)newSprite.TopTextureCoordinate;
                            newSprite.TopTextureCoordinate    -= topInt;
                            newSprite.BottomTextureCoordinate -= topInt;
                        }
                    }

                    currentLeftTextureCoordinate  = currentRightTextureCoordinate;
                    currentRightTextureCoordinate = currentLeftTextureCoordinate + 1;
                }

                //// let's just add 3 new Sprites.
                //Sprite sprite = SpriteManager.AddSprite("redball.bmp");
                //mSpriteList.Add(sprite);
                //sprite.XVelocity = 1;
                //sprite.Name = "test";
            }
        }
예제 #26
0
        public void CopyCurrentObjects(Window callingWindow)
        {
            if ((GameData.EditorLogic.CurrentSprites.Count != 0) ||
                (GameData.EditorLogic.CurrentSpriteFrames.Count != 0) ||
                (GameData.EditorLogic.CurrentPositionedModels.Count != 0) ||
                (GameData.EditorLogic.CurrentTexts.Count != 0))
            {
                int instructionNum = 0;

                #region Copy Sprites

                if (SpriteEditorSettings.EditingSprites)
                {
                    // remove the in-screen markers and axes so they don't get touched by the copying
                    GameData.EditorLogic.EditAxes.CurrentObject = null;

                    Sprite topSpriteAdded = null;
                    AttachableList <Sprite> oldestParents = AttachableList <Sprite> .GetTopParents <Sprite, Sprite>(GameData.EditorLogic.CurrentSprites);

                    SpriteList addedSprites = new SpriteList();

                    // The appendedNumbers variable is used for improving performance when copying large groups.  When a Sprite
                    // is copied, it is given a number at the end of its name or if there is already a number present,
                    // it is incremented.  However, copying large groups can result in a lot of string checking which
                    // can hurt performance.
                    // Consider copying 100 Sprites with the same texture.  Their names will likely be redball1, redball2,
                    // redball3, ... redball100.  Let's say redball1 gets copied first.  The SpriteEditor increments the
                    // number at the end to redball2, then checks to see if there is already a Sprite with that name.  If
                    // there is, it increments to redball3 and so on.  This must be conducted on average 10,000 times and each
                    // iteration requires string copying, concatenation, and parsing for integers.  To cut this down, the
                    // appendedNumbers variable associates a given name (in this case redball) with the last integer appended
                    // to that particular name.  Therefore, when the first Sprite is created, it will loop through 1 - 100 and
                    // eventually end up at redball101.  It will then associate the number 101 with the name redball.  The next
                    // Sprite (named redball2) will know to begin at redball101.  This increases the performance of
                    // copying large groups from O(n^2) to O(n).

                    Dictionary <string, int> appendedNumbers = new Dictionary <string, int>();

                    foreach (Sprite s in oldestParents)
                    {
                        if (s is ISpriteEditorObject)
                        {
                            if (GuiData.ToolsWindow.groupHierarchyControlButton.IsPressed)
                            {
                                topSpriteAdded =
                                    GameData.copySpriteHierarchy(
                                        s, s.Parent as Sprite, GameData.EditorProperties.PixelSize, addedSprites, appendedNumbers);
                            }
                            else
                            {
                                topSpriteAdded =
                                    GameData.copySpriteHierarchy(
                                        s.TopParent as Sprite, null, GameData.EditorProperties.PixelSize, addedSprites, appendedNumbers);
                            }
                        }
                        SpriteList tempSpriteArray = new SpriteList();
                        topSpriteAdded.GetAllDescendantsOneWay(tempSpriteArray);
                        tempSpriteArray.Add(topSpriteAdded);
                    }

                    GameData.EditorLogic.EditAxes.CurrentObject =
                        GameData.EditorLogic.CurrentSprites[0];

                    GameData.Cursor.ClickSprite(null);
                    foreach (Sprite s in AttachableList <Sprite> .GetTopParents <Sprite, Sprite>(addedSprites))
                    {
                        // the 2nd true forces selection of all Sprites
                        GameData.Cursor.ClickObject <Sprite>(s, GameData.EditorLogic.CurrentSprites, true, true);
                    }

                    GameData.Cursor.VerifyAndUpdateGrabbedAgainstCurrent();
                }
                #endregion

                #region Copy SpriteGrids
                else if (SpriteEditorSettings.EditingSpriteGrids)
                {
                    SpriteGrid sg = SESpriteGridManager.CurrentSpriteGrid.Clone();


                    FlatRedBall.Utilities.StringFunctions.MakeNameUnique <SpriteGrid>(sg, GameData.Scene.SpriteGrids);


                    this.sesgMan.PopulateAndAddGridToEngine(sg, GameData.EditorLogic.CurrentSprites[0]);

                    sg.RefreshPaint();
                }
                #endregion

                #region Copy SpriteFrames
                else if (SpriteEditorSettings.EditingSpriteFrames)
                {
                    GameData.EditorLogic.EditAxes.CurrentObject = null;

                    AttachableList <SpriteFrame> oldestParents =
                        AttachableList <SpriteFrame> .GetTopParents <SpriteFrame, SpriteFrame>(GameData.EditorLogic.CurrentSpriteFrames);

                    foreach (SpriteFrame sf in oldestParents)
                    {
                        SpriteFrame topSpriteFrameAdded = GameData.CopySpriteFrameHierarchy(sf, null, GameData.EditorProperties.PixelSize);
                        GameData.Cursor.ClickSpriteFrame(topSpriteFrameAdded);
                    }
                }
                #endregion

                #region Copy Models

                else if (SpriteEditorSettings.EditingModels)
                {
                    GameData.EditorLogic.EditAxes.CurrentObject = null;

                    AttachableList <PositionedModel> oldestParents =
                        AttachableList <PositionedModel> .GetTopParents <PositionedModel, PositionedModel>(GameData.EditorLogic.CurrentPositionedModels);

                    foreach (PositionedModel model in oldestParents)
                    {
                        PositionedModel topSpriteFrameAdded =
                            GameData.CopyModelHierarchy(model, null, GameData.EditorProperties.PixelSize);

                        //         GameData.cursor.ClickSpriteFrame(topSpriteFrameAdded);
                    }
                }

                #endregion

                #region Copy Texts

                else if (SpriteEditorSettings.EditingTexts)
                {
                    GameData.EditorLogic.EditAxes.CurrentObject = null;

                    AttachableList <Text> oldestParents =
                        AttachableList <Text> .GetTopParents <Text, Text>(GameData.EditorLogic.CurrentTexts);

                    foreach (Text text in oldestParents)
                    {
                        Text topText =
                            GameData.CopyTextHierarchy(text, null, GameData.EditorProperties.PixelSize);

                        //         GameData.cursor.ClickSpriteFrame(topSpriteFrameAdded);
                    }
                }

                #endregion
            }
        }