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; }
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; }
/// <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); }
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); }