// // Copyright (c) 2008-2015 the Urho3D project. // Copyright (c) 2015 Xamarin Inc // Copyright (c) 2016 THUNDERBEAST GAMES LLC // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System.Collections.Generic; using AtomicEngine; namespace FeatureExamples { public class SpriteSample : Sample { Scene scene; List spriteNodes; const uint NumSprites = 200; public SpriteSample() : base() { } public override void Start() { base.Start(); CreateScene(); SimpleCreateInstructionsWithWasd("\nuse PageUp PageDown keys to zoom."); SetupViewport(); } protected override void Update(float timeStep) { SimpleMoveCamera2D(timeStep); var graphics = GetSubsystem(); float halfWidth = graphics.Width * 0.5f * PixelSize; float halfHeight = graphics.Height * 0.5f * PixelSize; foreach (var nodeInfo in spriteNodes) { Vector3 position = nodeInfo.Node.Position; Vector3 moveSpeed = nodeInfo.MoveSpeed; Vector3 newPosition = position + moveSpeed * timeStep; if (newPosition.X < -halfWidth || newPosition.X > halfWidth) { newPosition.X = position.X; moveSpeed.X = -moveSpeed.X; nodeInfo.MoveSpeed = moveSpeed; } if (newPosition.Y < -halfHeight || newPosition.Y > halfHeight) { newPosition.Y = position.Y; moveSpeed.Y = -moveSpeed.Y; nodeInfo.MoveSpeed = moveSpeed; } nodeInfo.Node.Position = (newPosition); nodeInfo.Node.Roll(nodeInfo.RotateSpeed * timeStep, TransformSpace.TS_LOCAL); } } void SetupViewport() { var renderer = GetSubsystem(); renderer.SetViewport(0, new Viewport(scene, CameraNode.GetComponent())); } void CreateScene() { scene = new Scene(); scene.CreateComponent(); spriteNodes = new List((int) NumSprites); // Create camera node CameraNode = scene.CreateChild("Camera"); // Set camera's position CameraNode.Position = (new Vector3(0.0f, 0.0f, -10.0f)); Camera camera = CameraNode.CreateComponent(); camera.Orthographic = true; var graphics = GetSubsystem(); camera.OrthoSize=(float)graphics.Height * PixelSize; var cache = GetSubsystem(); // Get sprite Sprite2D sprite = cache.Get("Urho2D/Aster.png"); if (sprite == null) return; float halfWidth = graphics.Width * 0.5f * PixelSize; float halfHeight = graphics.Height * 0.5f * PixelSize; for (uint i = 0; i < NumSprites; ++i) { Node spriteNode = scene.CreateChild("StaticSprite2D"); spriteNode.Position = (new Vector3(NextRandom(-halfWidth, halfWidth), NextRandom(-halfHeight, halfHeight), 0.0f)); StaticSprite2D staticSprite = spriteNode.CreateComponent(); // Set random color staticSprite.Color = (new Color(NextRandom(1.0f), NextRandom(1.0f), NextRandom(1.0f), 1.0f)); // Set blend mode staticSprite.BlendMode = BlendMode.BLEND_ALPHA; // Set sprite staticSprite.Sprite=sprite; // Add to sprite node vector spriteNodes.Add(new NodeInfo(spriteNode, new Vector3(NextRandom(-2.0f, 2.0f), NextRandom(-2.0f, 2.0f), 0.0f), NextRandom(-90.0f, 90.0f))); } // Get animation set AnimationSet2D animationSet = cache.Get("Urho2D/GoldIcon.scml"); if (animationSet == null) return; var spriteNode2 = scene.CreateChild("AnimatedSprite2D"); spriteNode2.Position = (new Vector3(0.0f, 0.0f, -1.0f)); AnimatedSprite2D animatedSprite = spriteNode2.CreateComponent(); // Set animation animatedSprite.AnimationSet = animationSet; animatedSprite.SetAnimation("idle", LoopMode2D.LM_DEFAULT); } class NodeInfo { public Node Node { get; set; } public Vector3 MoveSpeed { get; set; } public float RotateSpeed { get; set; } public NodeInfo(Node node, Vector3 moveSpeed, float rotateSpeed) { Node = node; MoveSpeed = moveSpeed; RotateSpeed = rotateSpeed; } } } }