diff --git a/client/delta.h b/client/delta.h new file mode 100644 index 0000000..5bbfb8d --- /dev/null +++ b/client/delta.h @@ -0,0 +1,24 @@ +#ifndef DELTA_H_ +#define DELTA_H_ + +#include + +class Delta { +public: + Delta() { + time = tick = 0; + } + int Calculate() { + int c = clock(); + time = c - tick; + tick = c; + return time; + } + int GetDelta() const { + return time; + }; +private: + int time, tick; +}; + +#endif diff --git a/client/makefile b/client/makefile index 16b713a..d9d20a1 100644 --- a/client/makefile +++ b/client/makefile @@ -1,7 +1,7 @@ CXXFLAGS+=-std=c++11 -DDEBUG LIB=-lmingw32 -lSDL_net -lSDLmain -lSDL -lwsock32 -liphlpapi OBJ=base_scene.o scene_manager.o main.o -SRC=test_systems.cpp surface_manager.cpp image.cpp +SRC=test_systems.cpp all: debug @@ -15,4 +15,4 @@ clean: -$(RM) *.o *.a *.exe unit: - $(CXX) $(CXXFLAGS) unit.cpp surface_manager.cpp image.cpp -lmingw32 -lSDLmain -lSDL + $(CXX) $(CXXFLAGS) unit.cpp surface_manager.cpp image.cpp sprite_sheet.cpp -lmingw32 -lSDLmain -lSDL diff --git a/client/sprite_sheet.cpp b/client/sprite_sheet.cpp new file mode 100644 index 0000000..b4d85e9 --- /dev/null +++ b/client/sprite_sheet.cpp @@ -0,0 +1,20 @@ +#include "sprite_sheet.h" + +SpriteSheet::SpriteSheet(SDL_Surface* s, int w, int h) + : Image(s, {0, 0, (Uint16)w, (Uint16)h}) +{ + currentFrame = 0; maxFrames = GetSurface()->w / GetClipW(); + currentStrip = 0; maxStrips = GetSurface()->h / GetClipH(); + interval = ticks = 0; +} + +void SpriteSheet::Update(int delta) { + if ((ticks += delta) > interval) { + if (++currentFrame >= maxFrames) { + currentFrame = 0; + } + ticks = 0; + SetClipX(currentFrame * GetClipW()); + SetClipY(currentStrip * GetClipH()); + } +} diff --git a/client/sprite_sheet.h b/client/sprite_sheet.h new file mode 100644 index 0000000..7b89862 --- /dev/null +++ b/client/sprite_sheet.h @@ -0,0 +1,38 @@ +#ifndef SPRITESHEET_H_ +#define SPRITESHEET_H_ + +#include "image.h" + +#include "SDL/SDL.h" + +class SpriteSheet : public Image { +public: + SpriteSheet(SDL_Surface*, int w, int h); + virtual ~SpriteSheet() {} + + void Update(int delta); + + int SetWidth(int i) { return SetClipW(i); }; + int SetHeight(int i) { return SetClipH(i); }; + int SetFrames(int i) { currentFrame = 0; return maxFrames = i; }; + int SetStrips(int i) { currentStrip = 0; return maxStrips = i; }; + + int GetWidth() const { return GetClipW(); } + int GetHeight() const { return GetClipH(); } + int GetFrames() const { return maxFrames; } + int GetStrips() const { return maxStrips; } + + int SetCurrentFrame(int i) { return currentFrame = i; }; + int SetCurrentStrip(int i) { return currentStrip = i; }; + int SetInterval(int i) { ticks = 0; return interval = i; } + + int GetCurrentFrame() const { return currentFrame; }; + int GetCurrentStrip() const { return currentStrip; }; + int GetInterval() const { return interval; }; +private: + int currentFrame, maxFrames; + int currentStrip, maxStrips; + int interval, ticks; +}; + +#endif diff --git a/client/unit.cpp b/client/unit.cpp index 171a65f..d23cce1 100644 --- a/client/unit.cpp +++ b/client/unit.cpp @@ -1,3 +1,5 @@ +#include "delta.h" +#include "sprite_sheet.h" #include "image.h" #include "surface_manager.h" @@ -5,6 +7,8 @@ #include #include +#include +#include using namespace std; @@ -17,11 +21,23 @@ int go(int, char**) { //load all resources sMgr.Load("player", "rsc/graphics/sprites/elliot2.bmp"); + sMgr.Load("flower", "rsc/graphics/sprites/aniflower.bmp"); sMgr.Load("tileset", "rsc/graphics/tilesets/MishMash.bmp"); - Image player(sMgr.Get("player")); + SpriteSheet player(sMgr.Get("player"), 32, 48); Image tiles(sMgr.Get("tileset")); + player.SetInterval(200); + + vector flowerVector; + for (int i = 0; i < 100; i++) { + SpriteSheet ss(sMgr.Get("flower"), 32, 32); + ss.SetInterval(i%5 + 95); + flowerVector.push_back(ss); + } + + Delta delta; + bool running = true; while (running) { SDL_Event event; @@ -35,15 +51,39 @@ int go(int, char**) { case SDLK_ESCAPE: running = false; break; + case SDLK_1: + player.SetCurrentStrip(0); + break; + case SDLK_2: + player.SetCurrentStrip(1); + break; + case SDLK_3: + player.SetCurrentStrip(2); + break; + case SDLK_4: + player.SetCurrentStrip(3); + break; } } } + delta.Calculate(); + + player.Update(delta.GetDelta()); + + for (int i = 0; i < 100; i++) { + flowerVector[i].Update(delta.GetDelta()); + } + SDL_FillRect(screen, 0, 0); tiles.DrawTo(screen, 0, 0); player.DrawTo(screen, 0, 0); + for (int i = 0; i < 100; i++) { + flowerVector[i].DrawTo(screen, 20+i*4, i*4); + } + SDL_Flip(screen); } diff --git a/rsc/graphics/sprites/aniflower.bmp b/rsc/graphics/sprites/aniflower.bmp new file mode 100644 index 0000000..fbc60f5 Binary files /dev/null and b/rsc/graphics/sprites/aniflower.bmp differ diff --git a/rsc/graphics/sprites/aniflower.png b/rsc/graphics/sprites/aniflower.png deleted file mode 100644 index f0f3696..0000000 Binary files a/rsc/graphics/sprites/aniflower.png and /dev/null differ