Worked on the sprite class, got texture loading working with sprite class, addad garbage colection to entities and sprites, and also added maintatining aspect ratio in the entity render

This commit is contained in:
Ben
2018-10-01 15:02:23 +01:00
parent 32e44a9018
commit 1b2e620f40
7 changed files with 92 additions and 29 deletions

View File

@@ -129,7 +129,6 @@
<ClCompile Include="game.cpp" />
<ClCompile Include="logger.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="mathHelper.cpp" />
<ClCompile Include="renderer.cpp" />
<ClCompile Include="sprite.cpp" />
</ItemGroup>

View File

@@ -5,7 +5,6 @@
<ClCompile Include="entity.cpp" />
<ClCompile Include="renderer.cpp" />
<ClCompile Include="game.cpp" />
<ClCompile Include="mathHelper.cpp" />
<ClCompile Include="sprite.cpp" />
<ClCompile Include="logger.cpp" />
</ItemGroup>
@@ -33,6 +32,8 @@
<ClInclude Include="timer.h">
<Filter>headers</Filter>
</ClInclude>
<ClInclude Include="logger.h" />
<ClInclude Include="logger.h">
<Filter>headers</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@@ -3,7 +3,8 @@
Entity::Entity(std::string name, SDL_Renderer* SDLRenderer)
: m_rectPos(0, 0),
m_rectSize(0, 0),
m_col(0, 0, 0, 0) {
m_col(0, 0, 0, 0),
Pos(0, 0) {
this->m_name = name;
this->m_SDLRenderer = SDLRenderer;
@@ -12,8 +13,9 @@ Entity::Entity(std::string name, SDL_Renderer* SDLRenderer)
Entity::Entity(std::string name, SDL_Renderer* SDLRenderer, PolyDrawType drawType)
: m_rectPos(0, 0),
m_rectSize(0, 0),
m_col(0, 0, 0, 0) {
m_rectSize(0, 0),
m_col(0, 0, 0, 0),
Pos(0, 0) {
this->m_name = name;
this->m_SDLRenderer = SDLRenderer;
@@ -34,6 +36,9 @@ bool Entity::LoadTexture(std::string path) {
return false;
}
this->m_textureW = loadedSurface->w;
this->m_textureH = loadedSurface->h;
SDL_FreeSurface(loadedSurface);
return true;
}
@@ -69,8 +74,12 @@ void Entity::AddVecPoint(Vec4 point) {
}
void Entity::Render() {
if (Rendertype == RenderType::MODE_TEXTURE)
SDL_RenderCopy(m_SDLRenderer, m_texture, NULL, NULL);
if (Rendertype == RenderType::MODE_TEXTURE) {
SDL_Rect renderQuad = { Pos.x, Pos.y, m_textureW, m_textureH };
SDL_RenderCopy(m_SDLRenderer, m_texture, NULL, &renderQuad);
}
if (Rendertype == RenderType::MODE_POLYGON) {
SDL_SetRenderDrawColor(m_SDLRenderer, m_col.x, m_col.y, m_col.z, m_col.w);
if (Drawtype == PolyDrawType::DRAW_FILLED_RECT)
@@ -87,5 +96,5 @@ void Entity::Render() {
}
Entity::~Entity() {
SDL_DestroyTexture(m_texture);
}

View File

@@ -40,6 +40,11 @@ public:
void Render();
Vec2 Pos;
std::string PATH = "C:/Users/Ben/Desktop/crumpet-engine";
// std::string PATH = "E:/Games/crumpet-engine";
virtual ~Entity();
private:
std::string m_name;
@@ -52,9 +57,8 @@ private:
std::vector<Vec4> m_linePoints;
SDL_Texture* m_texture;
// std::string PATH = "C:/Users/Ben/Desktop/crumpet-engine";
std::string PATH = "E:/Games/crumpet-engine";
int m_textureW;
int m_textureH;
SDL_Renderer* m_SDLRenderer;
};

View File

@@ -12,21 +12,22 @@ int main(int argc, char** argv) {
Entity mario("mario", game.SDLRenderer);
mario.LoadTexture("/resources/mario.png");
Entity box("box", game.SDLRenderer, PolyDrawType::DRAW_FILLED_RECT);
box.SetDrawColour(Vec4(144, 022, 111, 255));
box.SetRect(Vec2(0, 0), Vec2(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2));
// Entity box("box", game.SDLRenderer, PolyDrawType::DRAW_FILLED_RECT);
// box.SetDrawColour(Vec4(144, 022, 111, 255));
// box.SetRect(Vec2(0, 0), Vec2(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2));
Entity boxOutline("box", game.SDLRenderer, PolyDrawType::DRAW_OUTLINE_RECT);
boxOutline.SetDrawColour(Vec4(144, 111, 111, 255));
boxOutline.SetRect(Vec2(100, 100), Vec2(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2));
// Entity boxOutline("box", game.SDLRenderer, PolyDrawType::DRAW_OUTLINE_RECT);
// boxOutline.SetDrawColour(Vec4(144, 111, 111, 255));
// boxOutline.SetRect(Vec2(100, 100), Vec2(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2));
Entity mesh("mesh", game.SDLRenderer, PolyDrawType::DRAW_LINES);
mesh.SetDrawColour(Vec4(255, 244, 111, 255));
mesh.AddVecPoint(Vec4(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
mesh.AddVecPoint(Vec4(SCREEN_WIDTH, 0, 0, SCREEN_HEIGHT));
// Entity mesh("mesh", game.SDLRenderer, PolyDrawType::DRAW_LINES);
// mesh.SetDrawColour(Vec4(255, 244, 111, 255));
// mesh.AddVecPoint(Vec4(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
// mesh.AddVecPoint(Vec4(SCREEN_WIDTH, 0, 0, SCREEN_HEIGHT));
Sprite sans("sans", game.SDLRenderer, SpriteType::SPRITE_ANIMATED);
sans.LoadSpriteTextures("/resources/sans-undertale-spritesheet.png");
// sans.UseSpriteSheet
while (!game.IsDisplayClosed()) {
game.PollEvents();
@@ -39,10 +40,12 @@ int main(int argc, char** argv) {
}
game.RenderClear();
game.RenderEntity(&mario);
game.RenderEntity(&box);
game.RenderEntity(&mesh);
game.RenderEntity(&boxOutline);
// game.RenderEntity(&box);
// game.RenderEntity(&mesh);
// game.RenderEntity(&boxOutline);
game.RenderUpdate();
}

View File

@@ -3,8 +3,28 @@
Sprite::Sprite(std::string name, SDL_Renderer* SDLRenderer, SpriteType mode)
: Entity(name, SDLRenderer) {
this->m_SDLRenderer = SDLRenderer;
this->Spritetype = mode;
}
bool Sprite::LoadSpriteTextures(std::string path) {
SDL_Surface* loadedSurface = IMG_Load((PATH + path).c_str());
if (loadedSurface == NULL) {
std::cout << "Unable to load image from:" << (PATH + path).c_str() << " IMG ERROR: " << IMG_GetError() << std::endl;
return false;
}
this->m_spriteSheetW = loadedSurface->w;
this->m_spriteSheetH = loadedSurface->h;
m_spriteSheetTexture = SDL_CreateTextureFromSurface(m_SDLRenderer, loadedSurface);
SDL_FreeSurface(loadedSurface);
return true;
}
void Sprite::UseSpriteSheet(SpriteState state, int startx, int starty, int width, int height, int seperation, int frames) {
m_spriteMaps[state];
}
Sprite::~Sprite() {
SDL_DestroyTexture(m_spriteSheetTexture);
}

View File

@@ -3,6 +3,7 @@
#include <string>
#include <iostream>
#include <vector>
#include <map>
#include <SDL.h>
#include <SDL_image.h>
#include "entity.h"
@@ -13,16 +14,42 @@ enum struct SpriteType {
SPRITE_STATIC
};
enum struct SpriteState {
STATE_DEFAULT,
STATE_LEFT,
STATE_RIGHT,
STATE_UP,
STATE_DOWN,
STATE_TOP,
STATE_BOTTOM,
STATE_FRONT,
STATE_BACK,
STATE_JUMP,
STATE_CROUCH
};
class Sprite : public Entity {
public:
Sprite(std::string name, SDL_Renderer* SDLRenderer, SpriteType mode);
SpriteType Spritetype = SpriteType::SPRITE_DEFAULT;
SpriteState Spritestate = SpriteState::STATE_DEFAULT;
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 Move();
void Render();
virtual ~Sprite();
private:
SDL_Texture *m_spriteSheetTexture;
std::map<SpriteState, std::vector<SDL_Rect*>> m_spriteMaps;
SDL_Renderer* m_SDLRenderer;
SDL_Texture* m_spriteSheetTexture;
int m_spriteSheetW;
int m_spriteSheetH;
};