int LuaCreateAnimation(lua_State* _State) { struct Sprite* _Sprite = NULL; const char* _File = luaL_checkstring(_State, 1);\ struct Resource* _Resource = ResourceGet(_File); SDL_Point _Pos = {0, 0}; _Sprite = CreateSprite(ResourceGetData(_Resource), 0, &_Pos); LuaCtor(_State, _Sprite, LOBJ_SPRITE); return 1; }
struct Sprite* ConstructSprite(struct Sprite* _Sprite, struct Resource* _Image, int _Layer, const SDL_Point* _TilePos) { SDL_Texture* _Texture = ResourceGetData(_Image); if(_Texture == NULL) { free(_Sprite); return NULL; } _Sprite->Image = _Image; _Sprite->TilePos = *_TilePos; _Sprite->Rect.x = 0; _Sprite->Rect.y = 0; SDL_QueryTexture(_Texture, NULL, NULL, &_Sprite->Rect.w, &_Sprite->Rect.h); _Sprite->SpritePos.w = _Sprite->Rect.w; _Sprite->SpritePos.h = _Sprite->Rect.h; return _Sprite; }
int LuaAnimationCreateFrames(lua_State* _State) { int _Width = luaL_checkinteger(_State, 1); int _Height = luaL_checkinteger(_State, 2); int _FrameCt = luaL_checkinteger(_State, 3); const char* _KeyName = luaL_checkstring(_State, 4); struct AnimationLoading* _Data = NULL; struct Resource* _Image = NULL; lua_pushvalue(_State, LUA_REGISTRYINDEX); lua_pushstring(_State, ANIM_LUASTR); lua_rawget(_State, -2); _Data = lua_touserdata(_State, -1); if(_Data->ImageName == NULL) return luaL_error(_State, "Animation has no image loaded."); _Image = ResourceGet(_Data->ImageName); if(SDL_QueryTexture(ResourceGetData(_Image), NULL, NULL, &_Data->Dims.x, &_Data->Dims.y) != 0) { luaL_error(_State, SDL_GetError()); DestroyResource(_Image); return 0; } DestroyResource(_Image); if(_FrameCt * _Width > _Data->Dims.x || _FrameCt * _Height > _Data->Dims.y) return luaL_error(_State, "Frame exceeds dimensions."); for(int i = _Data->FrameSz; i < _FrameCt && i < ANIM_MAXFRAMES; ++i) { _Data->Frames[i + _Data->FrameSz].Speed = _Data->DefaultSpeed; _Data->Frames[i + _Data->FrameSz].Rect.x = i * _Width; _Data->Frames[i + _Data->FrameSz].Rect.y = i * _Height; _Data->Frames[i + _Data->FrameSz].Rect.w = _Width; _Data->Frames[i + _Data->FrameSz].Rect.h = _Height; ++_Data->FrameSz; } _Data->y = _Data->y + _Height; _Data->Keys[_Data->KeySz].Name = calloc(strlen(_KeyName) + 1, sizeof(char)); strcpy((char*)_Data->Keys[_Data->KeySz].Name, _KeyName); ++_Data->KeySz; return 0; }
int SpriteOnDraw(const struct Sprite* _Sprite) { return SDL_RenderCopy(g_Renderer, ResourceGetData(_Sprite->Image), &_Sprite->Rect, &_Sprite->SpritePos); }