Sprite class coming along, spritemap rendering almost working as intended, just gotta clean up and deallocate variables properly now
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -4,14 +4,20 @@
|
||||
#include <string>
|
||||
#include <SDL.h>
|
||||
#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();
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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 <SpriteState, std::vector<SpriteClip>> m_spriteMaps;
|
||||
std::map <SpriteState, std::map<int, SDL_Rect*>> m_spriteMaps;
|
||||
std::map <SpriteState, Vec2*> 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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user