public virtual void Update(InputComponent input, FieldCamera camera) { _spriteComponent.Entity.Transform.Position = _unmodifiedPosition; MoveCharacter(); DetermineSprite(camera); _unmodifiedPosition = _spriteComponent.Entity.Transform.Position; _currentTicks += Game.UpdateTime.Elapsed.TotalMilliseconds; if (_currentTicks >= 125) // Each animation takes 0.125 seconds to complete. Only change sprite after this time elapsed { var spriteProvider = _spriteComponent.SpriteProvider as SpriteFromSheet; spriteProvider.CurrentFrame = _nextAnimation.SpriteSheetId; _previousAnimation = _nextAnimation; _nextAnimation = null; _currentTicks = 0; } this.Direction = _previousAnimation.Direction; _spriteComponent.Entity.Transform.Rotation = camera.CameraTarget.Rotation; // Keep sprite rotated towards camera. TODO: Update Sprite's Y Value to scale properly with camera angle. var cameraEntity = Core.Instance.MainCamera.Entity.Transform; var direction = (Entity.Transform.Position - cameraEntity.LocalToWorld(cameraEntity.Position)); direction.Normalize(); _spriteComponent.Entity.Transform.Position -= 0.3f * direction; }
protected virtual SpriteFromSheet BuildSpriteSheet() { var ss = new SpriteSheet(); //Each action has 8 directions * actionCount sprites int spriteSheetId = 0; foreach (var animation in XGCharacter.RawAnimationsData) { FileInfo f = new FileInfo(Path.Combine(_spritesPath, animation.StartSprite)); for (int dir = 0; dir < 5; dir++) { int skip = animation.SkipBetweenFiles * dir; for (int num = 0; num < animation.Count; num++) { var spritePath = f.DirectoryName + "\\" + (Convert.ToInt32(Path.GetFileNameWithoutExtension(f.Name)) + ((dir * animation.Count) + num + skip)).ToString().PadLeft(4, '0') + ".png"; if (File.Exists(spritePath)) // Some sprites missing? { var bytes = File.ReadAllBytes(spritePath); var image = Stride.Graphics.Image.Load(bytes); var texture = Texture.New(this.GraphicsDevice, image, TextureFlags.ShaderResource); var sprite = new Sprite($"{animation.Name}_{dir}_{num}", texture); ss.Sprites.Add(sprite); var animationKey = (animation.Name, (ECameraDirection)dir); if (!this._animations.ContainsKey(animationKey)) { this._animations.Add(animationKey, new List <IndividualAnimation>()); } _animations[animationKey].Add(new IndividualAnimation() { Name = animation.Name, Count = animation.Count, Direction = (ECameraDirection)dir, Frame = num, SpriteSheetId = spriteSheetId++ }); if (dir > 0 && dir < 4) // Get non-north south sprites. Will use for mirror { var bitmap = new Bitmap(spritePath); bitmap.RotateFlip(RotateFlipType.RotateNoneFlipX); bytes = BitmapToByteArray(bitmap); image = Stride.Graphics.Image.Load(bytes); texture = Texture.New(this.GraphicsDevice, image, TextureFlags.ShaderResource); sprite = new Sprite($"{animation.Name}_{dir}_{num}", texture); ss.Sprites.Add(sprite); animationKey = (animation.Name, (ECameraDirection)(8 - dir)); if (!this._animations.ContainsKey(animationKey)) { this._animations.Add(animationKey, new List <IndividualAnimation>()); } _animations[animationKey].Add(new IndividualAnimation() { Name = animation.Name, Count = animation.Count, Direction = (ECameraDirection)(8 - dir), Frame = num, SpriteSheetId = spriteSheetId++ }); } } } } } _previousAnimation = _animations[(EActionTypes.Idle, ECameraDirection.North)][0];