diff --git a/crumpet-engine/entity.cpp b/crumpet-engine/entity.cpp index 505bbdf..0861df0 100644 --- a/crumpet-engine/entity.cpp +++ b/crumpet-engine/entity.cpp @@ -4,7 +4,8 @@ Entity::Entity(std::string name, SDL_Renderer* SDLRenderer) : m_rectPos(0, 0), m_rectSize(0, 0), m_col(0, 0, 0, 0), - Pos(0, 0) { + Pos(0, 0), + Size(0, 0) { this->m_name = name; this->m_SDLRenderer = SDLRenderer; @@ -15,7 +16,8 @@ Entity::Entity(std::string name, SDL_Renderer* SDLRenderer, PolyDrawType drawTyp : m_rectPos(0, 0), m_rectSize(0, 0), m_col(0, 0, 0, 0), - Pos(0, 0) { + Pos(0, 0), + Size(0, 0) { this->m_name = name; this->m_SDLRenderer = SDLRenderer; @@ -39,6 +41,9 @@ bool Entity::LoadTexture(std::string path) { this->m_textureW = loadedSurface->w; this->m_textureH = loadedSurface->h; + this->Size.x = loadedSurface->w; + this->Size.y = loadedSurface->h; + SDL_FreeSurface(loadedSurface); return true; } @@ -56,7 +61,7 @@ bool Entity::LoadTexture(SDL_Surface* image) { void Entity::SetDrawColour(Vec4 col) { this->m_col = col; - // SDL_SetRenderDrawColor(m_SDLRenderer, col.x, col.y, col.z, col.w); + SDL_SetRenderDrawColor(m_SDLRenderer, col.x, col.y, col.z, col.w); } void Entity::SetRect(Vec2 pos, Vec2 size) { @@ -75,7 +80,7 @@ void Entity::AddVecPoint(Vec4 point) { void Entity::Render() { if (Rendertype == RenderType::MODE_TEXTURE) { - SDL_Rect renderQuad = { Pos.x, Pos.y, m_textureW, m_textureH }; + SDL_Rect renderQuad = { Pos.x, Pos.y, Size.x, Size.y }; SDL_RenderCopy(m_SDLRenderer, m_texture, NULL, &renderQuad); } diff --git a/crumpet-engine/entity.h b/crumpet-engine/entity.h index 5fa39be..d593a35 100644 --- a/crumpet-engine/entity.h +++ b/crumpet-engine/entity.h @@ -41,12 +41,12 @@ public: void Render(); Vec2 Pos; - + Vec2 Size; virtual ~Entity(); protected: - //std::string PATH = "C:/Users/Ben/Desktop/crumpet-engine"; - std::string PATH = "E:/Games/crumpet-engine"; + std::string PATH = "C:/Users/Ben/Desktop/crumpet-engine"; + //std::string PATH = "E:/Games/crumpet-engine"; private: std::string m_name; diff --git a/crumpet-engine/main.cpp b/crumpet-engine/main.cpp index 4d8024c..6975d51 100644 --- a/crumpet-engine/main.cpp +++ b/crumpet-engine/main.cpp @@ -2,66 +2,38 @@ #undef main -#define SCREEN_WIDTH 1920 // 800 -#define SCREEN_HEIGHT 1080 // 600 +#define SCREEN_WIDTH 800 +#define SCREEN_HEIGHT 600 int main(int argc, char** argv) { Game game("Crumpet engine", SCREEN_WIDTH, SCREEN_HEIGHT, 1, 1000 / 60); Timer timer; - Entity mario("mario", game.SDLRenderer); - mario.LoadTexture("/resources/charicter.png"); - Sprite sans("sans", game.SDLRenderer, SpriteType::SPRITE_ANIMATED); sans.LoadSpriteTextures("/resources/sans-undertale-spritesheet.png"); - // sans.UseSpriteSheet - - int ground = 300; - bool isOnGround = false; - float vY = 0; - float g = 9.81; + sans.UseSpriteSheet(SpriteState::STATE_RIGHT, 10, 10, 200, 200, 50, 4); + sans.Spritestate = SpriteState::STATE_RIGHT; while (!game.IsDisplayClosed()) { // game.PollEvents(); if (timer.GetTimeElapsed() >= game.TargetMsPerUpdate) { // Constant update rate, despite framerate // game logic - std::cout << "Is Mario on ground: "; - std::cout << isOnGround << std::endl; - std::cout << "Mario's velocity: "; - std::cout << vY << std::endl; - - if (!isOnGround) { - vY += g; - mario.Pos.y += vY; - if (mario.Pos.y >= ground) { - isOnGround = true; - mario.Pos.y = ground; - } - } const Uint8 *state = SDL_GetKeyboardState(NULL); - - if (state[SDL_SCANCODE_A]) mario.Pos.x -= 10; - if (state[SDL_SCANCODE_D]) mario.Pos.x += 10; + // if (state[SDL_SCANCODE_A]) mario.Pos.x -= 10; while (SDL_PollEvent(&game.m_event) != 0) { if (game.m_event.type == SDL_QUIT) game.CloseDisplay(); - - if (game.m_event.key.keysym.sym == SDLK_SPACE) { - if (isOnGround) { - isOnGround = false; - vY = -100; - } - } }; + + sans.AnimateSprite(); timer.Tick(); } game.RenderClear(); - game.RenderEntity(&dave); - game.RenderEntity(&mario); + game.RenderSprite(&sans); game.RenderUpdate(); } diff --git a/crumpet-engine/renderer.cpp b/crumpet-engine/renderer.cpp index 81cbab7..1af4174 100644 --- a/crumpet-engine/renderer.cpp +++ b/crumpet-engine/renderer.cpp @@ -22,6 +22,15 @@ void Renderer::RenderEntity(Entity* entity) { entity->Render(); } +void Renderer::RenderSprite(Sprite* sprite, SpriteState state) { + sprite->Spritestate = state; + sprite->Render(); +} + +void Renderer::RenderSprite(Sprite* sprite) { + sprite->Render(); +} + void Renderer::RenderUpdate() { SDL_SetRenderDrawColor(SDLRenderer, 66, 134, 244, 255); SDL_RenderPresent(SDLRenderer); diff --git a/crumpet-engine/renderer.h b/crumpet-engine/renderer.h index 8d1fe44..7428b11 100644 --- a/crumpet-engine/renderer.h +++ b/crumpet-engine/renderer.h @@ -4,14 +4,20 @@ #include #include #include "entity.h" +#include "sprite.h" class Renderer { public: Renderer(std::string title, int width, int height, int targetFramerate); SDL_Renderer *SDLRenderer; + void RenderEntity(Entity* entity); + void TickSpriteAnimation(Sprite* sprite); + void RenderSprite(Sprite* sprite, SpriteState state); + void RenderSprite(Sprite* sprite); + void RenderUpdate(); void RenderClear(); diff --git a/crumpet-engine/sprite.cpp b/crumpet-engine/sprite.cpp index e754b92..398319d 100644 --- a/crumpet-engine/sprite.cpp +++ b/crumpet-engine/sprite.cpp @@ -2,7 +2,8 @@ Sprite::Sprite(std::string name, SDL_Renderer* SDLRenderer, SpriteType mode) : Entity(name, SDLRenderer), - Pos(0, 0) { + Pos(0, 0), + Size(0, 0) { this->m_SDLRenderer = SDLRenderer; this->Spritetype = mode; @@ -23,13 +24,34 @@ bool Sprite::LoadSpriteTextures(std::string path) { } void Sprite::UseSpriteSheet(SpriteState state, int startX, int startY, int width, int height, int seperation, int frames) { - for (auto i = 1; i <= frames; i++) { - m_spriteMaps[state].push_back(SpriteClip(startX, startY, &SDL_Rect())); + for (int i = 1; i <= frames; i++) { + int x = startX * (i + seperation); + SDL_Rect temp1 = { x, startY, width, height }; + SDL_Rect* temp = new SDL_Rect(temp1); + m_spriteMaps[state][i] = temp; + //temp = { NULL, NULL, NULL, NULL }; } + Vec2 temp1(width, height); + Vec2* temp = new Vec2(temp1); + m_spriteSize[state] = temp; +} + +void Sprite::AnimateSprite() { + if (m_lastSpritestate == Spritestate) { + m_currentFrame++; + } else { + m_lastSpritestate = Spritestate; + m_currentFrame = 0; + } + if (m_currentFrame >= m_spriteMaps[Spritestate].size()) m_currentFrame = 0; } void Sprite::Render() { - + SDL_Rect* currentFrameClip = m_spriteMaps[Spritestate][m_currentFrame]; + Vec2* currentRenderSize = m_spriteSize[Spritestate]; + SDL_Rect currentFrameDest = { Pos.x, Pos.y, currentRenderSize->x, currentRenderSize->y}; + + SDL_RenderCopy(m_SDLRenderer, m_spriteSheetTexture, currentFrameClip, ¤tFrameDest); } Sprite::~Sprite() { diff --git a/crumpet-engine/sprite.h b/crumpet-engine/sprite.h index a4d0a4c..c57d81d 100644 --- a/crumpet-engine/sprite.h +++ b/crumpet-engine/sprite.h @@ -27,6 +27,11 @@ enum struct SpriteState { STATE_JUMP, STATE_CROUCH, STATE_ATTACKING, + STATE_MISC1, + STATE_MISC2, + STATE_MISC3, + STATE_MISC4, + STATE_MISC5 }; class Sprite : public Entity { @@ -39,27 +44,23 @@ public: bool LoadSpriteTextures(std::string path); void UseSpriteSheet(SpriteState state, int startX, int startY, int width, int height, int seperation, int frames); void AnimateSprite(SpriteState state); + void AnimateSprite(); void Move(); Vec2 Pos; + Vec2 Size; void Render(); virtual ~Sprite(); private: - std::map > m_spriteMaps; + std::map > m_spriteMaps; + std::map m_spriteSize; SDL_Renderer* m_SDLRenderer; SDL_Texture* m_spriteSheetTexture; + SpriteState m_lastSpritestate = SpriteState::STATE_DEFAULT; int m_spriteSheetW; int m_spriteSheetH; -}; - -struct SpriteClip { - int x, y; - SDL_Rect* clip; - - SpriteClip(int x, int y, SDL_Rect* clip) - : x(x), y(y), clip(clip) { - } + int m_currentFrame; };