コード例 #1
0
ファイル: Invaders.cs プロジェクト: ninjapretzel/Pixel-Engine
 public InvaderRenderSettings(InvaderRenderSettings o)
 {
     minFrames    = o.minFrames; maxFrames = o.maxFrames;
     minLayers    = o.minLayers; maxLayers = o.maxLayers;
     minSize      = o.minSize; maxSize = o.maxSize;
     hueChange    = o.hueChange;
     minSatChange = o.minSatChange; maxSatChange = o.maxSatChange;
     minValChange = o.minValChange; maxValChange = o.maxValChange;
     minDeco      = o.minDeco; maxDeco = o.maxDeco;
     minAnim      = o.minAnim; maxAnim = o.maxAnim;
 }
コード例 #2
0
ファイル: Invaders.cs プロジェクト: ninjapretzel/Pixel-Engine
            public Invader(int seed, InvaderRenderSettings sets = null)
            {
                this.seed = seed;
                poses     = RenderInvaderPoses(seed, sets);

                sprite = poses[0];
                speed  = Randoms.RandomInt(1, 3);
                if (Randoms.RandomFloat() < .5f)
                {
                    speed *= -1;
                }
                framesPerTick   = Randoms.RandomInt(5, 10);
                framesSinceTick = 0;
                position        = default;
            }
コード例 #3
0
ファイル: Invaders.cs プロジェクト: ninjapretzel/Pixel-Engine
        /// <summary> Create an invader from a <paramref name="seed"/>, rendering a set of sprites for all of its 'poses' </summary>
        static ISprite[] RenderInvaderPoses(int seed, InvaderRenderSettings sets = null)
        {
            if (sets == null)
            {
                sets = InvaderRenderSettings.DEFAULT;
            }

            Randoms.Seed = seed;
            int numFrames = sets.nextFrames;

            ISprite[] poses = new ISprite[numFrames];

            // Sprite spr = new Sprite();
            int numLayers = sets.nextLayers;

            long[]  baseFrame = new long[numLayers];
            Pixel[] colors    = new Pixel[numLayers + 1];

            int width  = sets.nextSize;
            int height = sets.nextSize;

            int fill = (int)Mathf.Sqrt(width * height);

            int  maxBits = height * width - (height * (width / 2));
            long bitMask = (1L << (1 + maxBits)) - 1L;

            Console.WriteLine($"Invader {width:D2}x{height:D2} has {maxBits:D2} bits and mask 0x{bitMask:X16}");

            Vector4 baseColor = Pixel.Random().ToHSVA();

            baseColor.w  = 1.0f;
            baseFrame[0] = PickBits(bitMask, fill);
            colors[1]    = Pixel.HSVA(baseColor);

            for (int i = 1; i < numLayers; i++)
            {
                int numDeco = sets.nextDeco;
                baseFrame[i] = PickBits(bitMask, numDeco);

                Vector4 colorMod = sets.nextHsvChange;

                colors[i + 1] = Pixel.HSVA(baseColor + colorMod);
            }

            for (int k = 0; k < numFrames; k++)
            {
                PalettedSprite spr = new PalettedSprite(width, height, colors);
                for (int i = 0; i < numLayers; i++)
                {
                    long bits = baseFrame[i];

                    if (k != 0)
                    {
                        int  numFlips = sets.nextAnim;
                        long mask     = PickBits(bitMask, numFlips);
                        bits ^= mask;
                    }

                    RenderInvaderSprite(spr, bits, i + 1);
                }
                poses[k] = spr;
            }
            return(poses);
        }
コード例 #4
0
ファイル: Invaders.cs プロジェクト: ninjapretzel/Pixel-Engine
        private void Reset()
        {
            entities.Clear();
            // Create some extra settings.
            // These end up being very colurful.
            InvaderRenderSettings vibrant = new InvaderRenderSettings();

            vibrant.minFrames    = 2; vibrant.maxFrames = 5;
            vibrant.minLayers    = 2; vibrant.maxLayers = 10;
            vibrant.hueChange    = .3f;
            vibrant.minSatChange = 0; vibrant.maxSatChange = 1f;
            vibrant.minValChange = 0; vibrant.maxSatChange = .5f;
            vibrant.minDeco      = 1; vibrant.maxDeco = 1;
            vibrant.minAnim      = 1; vibrant.maxAnim = 1;

            // These are 'simple' designs with short animations
            InvaderRenderSettings simple = new InvaderRenderSettings();

            simple.minFrames = 2; simple.maxFrames = 4;
            simple.minLayers = 1; simple.maxLayers = 2;
            simple.minDeco   = 1; simple.maxDeco = 2;
            simple.minAnim   = 1; simple.maxAnim = 4;

            // These are default designs with long, not repeating animations.
            InvaderRenderSettings spaz = new InvaderRenderSettings();

            spaz.minFrames = 20; spaz.maxFrames = 40;

            InvaderRenderSettings vibrantSpaz = new InvaderRenderSettings(vibrant);

            vibrantSpaz.minFrames = 20; vibrantSpaz.maxFrames = 40;

            InvaderRenderSettings simpleSpaz = new InvaderRenderSettings(simple);

            simpleSpaz.minFrames = 20; simpleSpaz.maxFrames = 40;

            InvaderRenderSettings[] setArr = new InvaderRenderSettings[] {
                vibrant,
                simple,
                spaz,
                simpleSpaz,
                vibrantSpaz,
                // Default settings generate decent 'invaders' with a few decoration layers
                InvaderRenderSettings.DEFAULT
            };

            Randoms.Seed = (int)DateTime.UtcNow.Ticks;

            int numInvaders = Randoms.RandomInt(40, 60);

            int[] seeds      = new int[numInvaders];
            int[] whichSets  = new int[numInvaders];
            int   playerSeed = Randoms.RandomInt(int.MinValue, int.MaxValue);

            for (int i = 0; i < numInvaders; i++)
            {
                seeds[i]     = Randoms.RandomInt(int.MinValue, int.MaxValue);
                whichSets[i] = Randoms.RandomInt(0, setArr.Length);
            }
            for (int i = 0; i < numInvaders; i++)
            {
                int seed = seeds[i];
                InvaderRenderSettings sets = setArr[whichSets[i]];

                Invader invader = new Invader(seed, sets);

                invader.position.x = Random(0, ScreenWidth);
                invader.position.y = Random(0, ScreenHeight / 2);
                entities.Add(invader);
            }

            player          = new Player(playerSeed);
            player.position = new Vector2(ScreenWidth / 2 - 7, ScreenHeight * 3 / 4);

            entities.Add(player);
        }