private ISprite CreateSprite( Point position, string status, Func <TObject, Point, Task>?onPointerDown, Func <TObject, Point, Task>?onPointerOut, Func <TObject, Point, Task>?onPointerOver) { var spriteInfo = _spritesSpec.GetSpriteInfo( Model.Id, status); var sprite = Graphics.AddSprite( spriteInfo.AtlasKey, spriteInfo.FrameName, position, options => { options.Depth = position.Y + Model.DepthOffset; options.Origin = new Point(0.5, 1); options.ScrollFactor = Model.ScrollFactor; if (Model.IsTouchable) { if (onPointerDown is not null) { options.OnPointerDown = (pointerPosition) => onPointerDown(Model, pointerPosition); } if (onPointerOut is not null) { options.OnPointerOut = (pointerPosition) => onPointerOut(Model, pointerPosition); } if (onPointerOver is not null) { options.OnPointerOver = (pointerPosition) => onPointerOver(Model, pointerPosition); } } }); // Load animations. if (_spritesSpec.TryGetValue(Model.Id, out SpriteSpec spriteSpec)) { foreach (var animationSpec in spriteSpec.Animations) { sprite.AddAnimation( animationSpec.Key, spriteSpec.AtlasKey, animationSpec.Value); } } return(sprite); }