protected override void Update() { if (!Enabled) { return; } base.Update(); var currentTime = Time.Current; var isCreateShow = !Children.Any() || (Children.LastOrDefault() as SnowSprite)?.CreateTime + 1000 / SnowGenerateParSecond < currentTime; // If can generate new snow if (isCreateShow && EnableNewSnow) { var currentAlpha = (float)random.Next(0, 255) / 255; var width = (int)DrawWidth; var newFlake = new SnowSprite { Anchor = Anchor.TopCentre, Origin = Anchor.Centre, Colour = Color4.White, Position = new Vector2(random.Next(-width / 2, width / 2), -40), Depth = 1, CreateTime = currentTime, Size = new Vector2(50, 50), Scale = new Vector2(1, 1) * SnowSize, Alpha = currentAlpha, HorizontalSpeed = random.Next(-100, 100) + WingAffection * 10 }; Add(newFlake); } // Update each snow position foreach (var drawable in Children) { if (!(drawable is SnowSprite snow)) { continue; } snow.X += snow.HorizontalSpeed / 1000f; snow.Y += 1 * Speed; // Recycle if (snow.CreateTime + SnowExpireTime < currentTime) { Children.ToList().Remove(snow); } } }
public void SnowFallingAnimation(int numberOfSnowflakes) { int FrameWidth = 95; int FrameHeight = 95; // Create a NameScope for this page so that // Storyboards can be used. NameScope.SetNameScope(this, new NameScope()); Canvas containerCanvas = new Canvas(); List <string> sprites = new List <string>(); for (int i = 1; i <= numberOfSnowflakes; i++) { string spriteName = "SnowSprite" + i.ToString("0000"); AnimatingSprites.Add(spriteName); RectangleGeometry myRectangleGeometry = new RectangleGeometry(); var randomStartY = RandomNumber(0, (int)this.MainGrid.ActualWidth - FrameWidth); int randomStartX = -RandomNumber(FrameHeight, FrameHeight * 4); var randomDuration = RandomNumber(1000, 4000); myRectangleGeometry.Rect = new Rect(randomStartY, randomStartX, FrameWidth, FrameHeight); // Assign the geometry a name so that // it can be targeted by a Storyboard. this.RegisterName( spriteName, myRectangleGeometry); Sprite sprite = new SnowSprite(FrameWidth, FrameHeight, 1000, 4000, "SnowSprite.png", randomStartY, randomStartX); var p = sprite.DoThing(myRectangleGeometry, this.MainGrid, spriteName, this); sprite.AnimationComplete += HalloweenSpiderRectAnimation_Completed; // Start the storyboard when the Path loads. containerCanvas.Children.Add(p); Content = containerCanvas; } }
private async Task OnCreateResourcesAsync(EngineCreateResourcesEventArgs e) { var grass = GrassSprite.Resolve(Entity); var snow = SnowSprite.Resolve(Entity); var rock = RockSprite.Resolve(Entity); var heightMap = _terrain.HeightMap.Resolve(Entity); if (!heightMap.IsPreScaled || !grass.IsPreScaled || !snow.IsPreScaled || !rock.IsPreScaled) { throw new ArgumentException("The heightmap, grass, snow and rock textures must be prescaled in order to be used for terrain rendering"); } // Calculate average colors (these are used at small zoom levels) _grassColor = GetAverageColor(e.Sender, grass.Image); _snowColor = GetAverageColor(e.Sender, snow.Image); _rockColor = GetAverageColor(e.Sender, rock.Image); _normalHeightMap = await RenderNormalHeightMapAsync(e.Sender, heightMap.Image, _terrain.Height - _terrain.BaseHeight); var wrap = CanvasEdgeBehavior.Wrap; var grassTiled = new BorderEffect { Source = grass.Image, ExtendX = wrap, ExtendY = wrap, CacheOutput = true }; var snowTiled = new BorderEffect { Source = snow.Image, ExtendX = wrap, ExtendY = wrap, CacheOutput = true }; var rockTiled = new BorderEffect { Source = rock.Image, ExtendX = wrap, ExtendY = wrap, CacheOutput = true }; var shaderBytes = await Utilities.ReadBytesFromUriAsync(new Uri("ms-appx:///Shaders/TerrainShader.bin")); _terrainMap = new PixelShaderEffect(shaderBytes) { Source1 = _normalHeightMap, Source2 = grassTiled, Source3 = snowTiled, Source4 = rockTiled, CacheOutput = true }; }