/
Mr.Stalin
/
FOnline-Engine
Обзор
Документация
Войти
/
Mr.Stalin
/
FOnline-Engine
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Source/Scripting/AngelScript/CoreScripts/Sprite.fos
188 строк
4 KB
cvet
Strong nullable (#164)
25 май 2026, 11:45
Не верифицирован
25 май 2026, 11:45
04a4963
Код
Авторство
О чём код?
namespace Sprite { ///@ Enum SpriteLayout None ///@ Enum SpriteLayout Tile ///@ Enum SpriteLayout Center ///@ Enum SpriteLayout Stretch ///@ Enum SpriteLayout Zoom #if CLIENT class Sprite { Sprite() { // Empty } Sprite(string name) { bool ok = Load(name); verify(ok, "Failed to load sprite", name); } Sprite(hstring name) { bool ok = Load(name); verify(ok, "Failed to load sprite", name); } ~Sprite() { // Game engine may already be gone during shutdown; freeing the sprite then is both impossible and unnecessary if (!IsGameDestroying) { Unload(); } } bool Load(string name, bool separateLoad = false) { return Load(name.hstr(), separateLoad); } bool Load(hstring name, bool separateLoad = false) { if (name == LoadedName) { return true; } Unload(); LoadedName = name; if (LoadedName != EMPTY_HSTRING) { Id = separateLoad ? Game.LoadSeparateSprite(LoadedName) : Game.LoadSprite(LoadedName); if (Id != 0) { Size = Game.GetSpriteSize(Id); } } return Id != 0; } void Unload() { if (Id != 0) { Game.FreeSprite(Id); Id = 0; LoadedName = EMPTY_HSTRING; Size = isize(); } } // alignX/Y = -1 left / top, 0 center, 1 right / bottom void Draw(ipos pos, isize size = isize(), int alignX = -1, int alignY = -1, SpriteLayout layout = SpriteLayout::None, ucolor color = ZERO_UCOLOR) { if (Id == 0 || Hidden) { return; } if (size == isize()) { size = Size; } if (alignX == 0) { pos.x -= size.width / 2; } else if (alignX == 1) { pos.x -= size.width; } if (alignY == 0) { pos.y -= size.height / 2; } else if (alignY == 1) { pos.y -= size.height; } if (color == ZERO_UCOLOR) { color = Color; } switch (layout != SpriteLayout::None ? layout : Layout) { case SpriteLayout::Tile: Game.DrawSpritePattern(Id, pos, size, Size, color); break; case SpriteLayout::Center: Game.DrawSprite(Id, ipos(pos.x + size.width / 2 - Size.width / 2, pos.y + size.height / 2 - Size.height / 2), color, false); break; case SpriteLayout::Stretch: Game.DrawSprite(Id, pos, size, color, false, false); break; case SpriteLayout::Zoom: Game.DrawSprite(Id, pos, size, color, true, false); break; default: Game.DrawSprite(Id, pos, color, false); break; } } void SetFirstFrame() { Game.StopSprite(Id); Game.SetSpriteTime(Id, 0.0); } void SetLastFrame() { Game.StopSprite(Id); Game.SetSpriteTime(Id, 1.0); } void SetFrame(float normalizedTime) { Game.StopSprite(Id); Game.SetSpriteTime(Id, normalizedTime); } void Play(bool loop = true, bool reverse = false) { if (Id == 0) { return; } Game.PlaySprite(Id, EMPTY_HSTRING, loop, reverse); } void Play(string animName, bool loop = true, bool reverse = false) { if (Id == 0) { return; } Game.PlaySprite(Id, animName.hstr(), loop, reverse); } void Play(hstring animName, bool loop = true, bool reverse = false) { if (Id == 0) { return; } Game.PlaySprite(Id, animName, loop, reverse); } private void RefreshData() { if (Id != 0) { Size = Game.GetSpriteSize(Id); } else { Size = isize(); } } uint Id = 0; SpriteLayout Layout = SpriteLayout::None; isize Size; int Ticks = 0; bool Hidden = false; hstring LoadedName; ucolor Color = Color::Neutral; }; #endif }