| @@ -6,7 +6,7 @@ noinst_LIBRARIES = libcommon.a | |||
| libcommon_a_SOURCES = \ | |||
| game.cpp game.h tiler.cpp tiler.h tileset.cpp tileset.h \ | |||
| scene.cpp scene.h font.cpp font.h layer.cpp layer.h map.cpp map.h \ | |||
| joystick.cpp joystick.h asset.cpp asset.h ticker.cpp ticker.h \ | |||
| joystick.cpp joystick.h entity.cpp entity.h ticker.cpp ticker.h \ | |||
| forge.cpp forge.h video.cpp video.h timer.cpp timer.h \ | |||
| profiler.cpp profiler.h \ | |||
| debugfps.cpp debugfps.h debugsprite.cpp debugsprite.h \ | |||
| @@ -38,14 +38,14 @@ DebugFps::DebugFps() | |||
| data->frame = 0; | |||
| } | |||
| Asset::Group DebugFps::GetGroup() | |||
| Entity::Group DebugFps::GetGroup() | |||
| { | |||
| return GROUP_AFTER; | |||
| } | |||
| void DebugFps::TickRender(float delta_time) | |||
| { | |||
| Asset::TickRender(delta_time); | |||
| Entity::TickRender(delta_time); | |||
| data->frame++; | |||
| @@ -11,11 +11,11 @@ | |||
| #if !defined __DH_DEBUGFPS_H__ | |||
| #define __DH_DEBUGFPS_H__ | |||
| #include "asset.h" | |||
| #include "entity.h" | |||
| class DebugFpsData; | |||
| class DebugFps : public Asset | |||
| class DebugFps : public Entity | |||
| { | |||
| public: | |||
| DebugFps(); | |||
| @@ -42,19 +42,19 @@ DebugRecord::DebugRecord(char const *path) | |||
| data->sequence = NULL; | |||
| } | |||
| Asset::Group DebugRecord::GetGroup() | |||
| Entity::Group DebugRecord::GetGroup() | |||
| { | |||
| return GROUP_RENDER_CAPTURE; | |||
| } | |||
| void DebugRecord::TickGame(float delta_time) | |||
| { | |||
| Asset::TickGame(delta_time); | |||
| Entity::TickGame(delta_time); | |||
| } | |||
| void DebugRecord::TickRender(float delta_time) | |||
| { | |||
| Asset::TickRender(delta_time); | |||
| Entity::TickRender(delta_time); | |||
| int width = Video::GetWidth(); | |||
| int height = Video::GetHeight(); | |||
| @@ -11,11 +11,11 @@ | |||
| #if !defined __DH_DEBUGRECORD_H__ | |||
| #define __DH_DEBUGRECORD_H__ | |||
| #include "asset.h" | |||
| #include "entity.h" | |||
| class DebugRecordData; | |||
| class DebugRecord : public Asset | |||
| class DebugRecord : public Entity | |||
| { | |||
| public: | |||
| DebugRecord(char const *path); | |||
| @@ -38,19 +38,19 @@ DebugSprite::DebugSprite(Game *game) | |||
| data->tiler = Tiler::Register("art/test/character-dress.png"); | |||
| } | |||
| Asset::Group DebugSprite::GetGroup() | |||
| Entity::Group DebugSprite::GetGroup() | |||
| { | |||
| return GROUP_DEFAULT; | |||
| } | |||
| void DebugSprite::TickGame(float delta_time) | |||
| { | |||
| Asset::TickGame(delta_time); | |||
| Entity::TickGame(delta_time); | |||
| } | |||
| void DebugSprite::TickRender(float delta_time) | |||
| { | |||
| Asset::TickRender(delta_time); | |||
| Entity::TickRender(delta_time); | |||
| data->game->GetScene()->AddTile((data->tiler << 16) | 15, 320, 240, 32, 1); | |||
| data->game->GetScene()->AddTile((data->tiler << 16) | 31, 320, 240, 0, 1); | |||
| @@ -11,12 +11,12 @@ | |||
| #if !defined __DH_DEBUGSPRITE_H__ | |||
| #define __DH_DEBUGSPRITE_H__ | |||
| #include "asset.h" | |||
| #include "entity.h" | |||
| #include "game.h" | |||
| class DebugSpriteData; | |||
| class DebugSprite : public Asset | |||
| class DebugSprite : public Entity | |||
| { | |||
| public: | |||
| DebugSprite(Game *game); | |||
| @@ -10,14 +10,14 @@ | |||
| #include <cstdlib> | |||
| #include <cstdio> | |||
| #include "asset.h" | |||
| #include "entity.h" | |||
| #include "ticker.h" | |||
| /* | |||
| * Public Asset class | |||
| * Public Entity class | |||
| */ | |||
| Asset::Asset() : | |||
| Entity::Entity() : | |||
| next(0), | |||
| ref(0), | |||
| destroy(0) | |||
| @@ -28,43 +28,43 @@ Asset::Asset() : | |||
| Ticker::Register(this); | |||
| } | |||
| Asset::~Asset() | |||
| Entity::~Entity() | |||
| { | |||
| #if !FINAL_RELEASE | |||
| if (!destroy) | |||
| fprintf(stderr, "ERROR: asset destructor called directly\n"); | |||
| fprintf(stderr, "ERROR: entity destructor called directly\n"); | |||
| #endif | |||
| } | |||
| Asset::Group Asset::GetGroup() | |||
| Entity::Group Entity::GetGroup() | |||
| { | |||
| return GROUP_DEFAULT; | |||
| } | |||
| void Asset::TickGame(float delta_time) | |||
| void Entity::TickGame(float delta_time) | |||
| { | |||
| #if !FINAL_RELEASE | |||
| if (state != STATE_PRETICK_GAME) | |||
| fprintf(stderr, "ERROR: invalid asset game tick\n"); | |||
| fprintf(stderr, "ERROR: invalid entity game tick\n"); | |||
| state = STATE_POSTTICK_GAME; | |||
| #endif | |||
| } | |||
| void Asset::TickRender(float delta_time) | |||
| void Entity::TickRender(float delta_time) | |||
| { | |||
| #if !FINAL_RELEASE | |||
| if (state != STATE_PRETICK_RENDER) | |||
| fprintf(stderr, "ERROR: invalid asset render tick\n"); | |||
| fprintf(stderr, "ERROR: invalid entity render tick\n"); | |||
| state = STATE_POSTTICK_RENDER; | |||
| #endif | |||
| } | |||
| void Asset::Ref() | |||
| void Entity::Ref() | |||
| { | |||
| ref++; | |||
| } | |||
| int Asset::Unref() | |||
| int Entity::Unref() | |||
| { | |||
| return --ref; | |||
| } | |||
| @@ -4,19 +4,19 @@ | |||
| // | |||
| // | |||
| // The Asset class | |||
| // The Entity class | |||
| // --------------- | |||
| // Assets are objects that can be ticked by the game loop and/or the render | |||
| // loop. Assets are implemented as one or several linked lists. See the | |||
| // Entities are objects that can be ticked by the game loop and/or the render | |||
| // loop. Entities are implemented as one or several linked lists. See the | |||
| // Ticker class for the ticking logic and the linked list implementation. | |||
| // | |||
| #if !defined __DH_ASSET_H__ | |||
| #define __DH_ASSET_H__ | |||
| #if !defined __DH_ENTITY_H__ | |||
| #define __DH_ENTITY_H__ | |||
| #include <stdint.h> | |||
| class Asset | |||
| class Entity | |||
| { | |||
| friend class Ticker; | |||
| friend class TickerData; | |||
| @@ -37,15 +37,15 @@ protected: | |||
| } | |||
| Group; | |||
| Asset(); | |||
| virtual ~Asset(); | |||
| Entity(); | |||
| virtual ~Entity(); | |||
| virtual Group GetGroup(); | |||
| virtual void TickGame(float delta_time); | |||
| virtual void TickRender(float delta_time); | |||
| Asset *next; | |||
| Entity *next; | |||
| int ref, destroy; | |||
| #if !FINAL_RELEASE | |||
| @@ -61,5 +61,5 @@ protected: | |||
| #endif | |||
| }; | |||
| #endif // __DH_ASSET_H__ | |||
| #endif // __DH_ENTITY_H__ | |||
| @@ -76,14 +76,14 @@ Font::~Font() | |||
| delete data; | |||
| } | |||
| Asset::Group Font::GetGroup() | |||
| Entity::Group Font::GetGroup() | |||
| { | |||
| return GROUP_BEFORE; | |||
| } | |||
| void Font::TickRender(float delta_time) | |||
| { | |||
| Asset::TickRender(delta_time); | |||
| Entity::TickRender(delta_time); | |||
| } | |||
| char const *Font::GetName() | |||
| @@ -11,18 +11,18 @@ | |||
| #if !defined __DH_FONT_H__ | |||
| #define __DH_FONT_H__ | |||
| #include "asset.h" | |||
| #include "entity.h" | |||
| class FontData; | |||
| class Font : public Asset | |||
| class Font : public Entity | |||
| { | |||
| public: | |||
| Font(char const *path); | |||
| ~Font(); | |||
| protected: | |||
| /* Inherited from Asset */ | |||
| /* Inherited from Entity */ | |||
| virtual Group GetGroup(); | |||
| virtual void TickRender(float delta_time); | |||
| @@ -48,19 +48,19 @@ Game::~Game() | |||
| delete data; | |||
| } | |||
| Asset::Group Game::GetGroup() | |||
| Entity::Group Game::GetGroup() | |||
| { | |||
| return Asset::GetGroup(); | |||
| return Entity::GetGroup(); | |||
| } | |||
| void Game::TickGame(float delta_time) | |||
| { | |||
| Asset::TickGame(delta_time); | |||
| Entity::TickGame(delta_time); | |||
| } | |||
| void Game::TickRender(float delta_time) | |||
| { | |||
| Asset::TickRender(delta_time); | |||
| Entity::TickRender(delta_time); | |||
| GetScene(); | |||
| @@ -11,19 +11,19 @@ | |||
| #if !defined __DH_GAME_H__ | |||
| #define __DH_GAME_H__ | |||
| #include "asset.h" | |||
| #include "entity.h" | |||
| #include "scene.h" | |||
| class GameData; | |||
| class Game : public Asset | |||
| class Game : public Entity | |||
| { | |||
| public: | |||
| Game(char const *mapname); | |||
| ~Game(); | |||
| protected: | |||
| /* Inherited from Asset */ | |||
| /* Inherited from Entity */ | |||
| virtual Group GetGroup(); | |||
| virtual void TickGame(float delta_time); | |||
| virtual void TickRender(float delta_time); | |||
| @@ -38,7 +38,7 @@ static gboolean tick(void *widget) | |||
| { | |||
| // FIXME: do not do anything if the previous tick was too recent? | |||
| // FIXME: only quit if all assets have been cleaned | |||
| // FIXME: only quit if all entities have been cleaned | |||
| if (quit) | |||
| return FALSE; | |||
| @@ -83,6 +83,16 @@ void Scene::AddTile(uint32_t code, int x, int y, int z, int o) | |||
| void Scene::Render() // XXX: rename to Blit() | |||
| { | |||
| #if 0 | |||
| // Randomise, then sort. | |||
| for (int i = 0; i < data->ntiles; i++) | |||
| { | |||
| Tile tmp = data->tiles[i]; | |||
| int j = rand() % data->ntiles; | |||
| data->tiles[i] = data->tiles[j]; | |||
| data->tiles[j] = tmp; | |||
| } | |||
| #endif | |||
| qsort(data->tiles, data->ntiles, sizeof(Tile), SceneData::Compare); | |||
| // XXX: debug stuff | |||
| @@ -91,9 +101,10 @@ void Scene::Render() // XXX: rename to Blit() | |||
| f += 0.05f; | |||
| glTranslatef(320.0f, 240.0f, 0.0f); | |||
| glRotatef(45.0f, 1.0f, 0.0f, 0.0f); | |||
| //glRotatef(5.0f + 3.0f * sinf(f), 1.0f, 0.0f, 0.0f); | |||
| //glRotatef(20.0f * cosf(f), 0.0f, 0.0f, 1.0f); | |||
| //glRotatef(30.0f, 0.0f, 0.0f, 1.0f); | |||
| #if 0 | |||
| glRotatef(3.0f * sinf(f), 1.0f, 0.0f, 0.0f); | |||
| glRotatef(8.0f * cosf(f), 0.0f, 0.0f, 1.0f); | |||
| #endif | |||
| glTranslatef(-320.0f, -240.0f, 0.0f); | |||
| for (int i = 0; i < data->ntiles; i++) | |||
| @@ -35,14 +35,14 @@ SdlInput::SdlInput(Game *game) | |||
| data->game = game; | |||
| } | |||
| Asset::Group SdlInput::GetGroup() | |||
| Entity::Group SdlInput::GetGroup() | |||
| { | |||
| return GROUP_BEFORE; | |||
| } | |||
| void SdlInput::TickGame(float delta_time) | |||
| { | |||
| Asset::TickGame(delta_time); | |||
| Entity::TickGame(delta_time); | |||
| if (data->game->Finished()) | |||
| destroy = 1; | |||
| @@ -11,12 +11,12 @@ | |||
| #if !defined __DH_SDLINPUT_H__ | |||
| #define __DH_SDLINPUT_H__ | |||
| #include "asset.h" | |||
| #include "entity.h" | |||
| #include "game.h" | |||
| class SdlInputData; | |||
| class SdlInput : public Asset | |||
| class SdlInput : public Entity | |||
| { | |||
| public: | |||
| SdlInput(Game *game); | |||
| @@ -13,7 +13,7 @@ | |||
| #include "profiler.h" | |||
| #include "ticker.h" | |||
| #include "asset.h" | |||
| #include "entity.h" | |||
| #include "timer.h" | |||
| /* | |||
| @@ -27,9 +27,9 @@ static class TickerData | |||
| public: | |||
| TickerData() : | |||
| todo(0), | |||
| nassets(0) | |||
| nentities(0) | |||
| { | |||
| for (int i = 0; i < Asset::GROUP_COUNT; i++) | |||
| for (int i = 0; i < Entity::GROUP_COUNT; i++) | |||
| list[i] = NULL; | |||
| bias = 0.0f; | |||
| } | |||
| @@ -37,16 +37,16 @@ public: | |||
| ~TickerData() | |||
| { | |||
| #if !FINAL_RELEASE | |||
| if (nassets) | |||
| fprintf(stderr, "ERROR: still %i assets in ticker\n", nassets); | |||
| if (nentities) | |||
| fprintf(stderr, "ERROR: still %i entities in ticker\n", nentities); | |||
| #endif | |||
| } | |||
| private: | |||
| /* Asset management */ | |||
| Asset *todo; | |||
| Asset *list[Asset::GROUP_COUNT]; | |||
| int nassets; | |||
| /* Entity management */ | |||
| Entity *todo; | |||
| Entity *list[Entity::GROUP_COUNT]; | |||
| int nentities; | |||
| /* Fixed framerate management */ | |||
| Timer timer; | |||
| @@ -60,13 +60,13 @@ static TickerData * const data = &tickerdata; | |||
| * Ticker public class | |||
| */ | |||
| void Ticker::Register(Asset *asset) | |||
| void Ticker::Register(Entity *entity) | |||
| { | |||
| /* If we are called from its constructor, the object's vtable is not | |||
| * ready yet, so we do not know which group this asset belongs to. Wait | |||
| * ready yet, so we do not know which group this entity belongs to. Wait | |||
| * until the first tick. */ | |||
| asset->next = data->todo; | |||
| data->todo = asset; | |||
| entity->next = data->todo; | |||
| data->todo = entity; | |||
| } | |||
| void Ticker::TickGame() | |||
| @@ -82,8 +82,8 @@ void Ticker::TickGame() | |||
| /* Garbage collect objects that can be destroyed. We can do this | |||
| * before inserting awaiting objects, because there is no way these | |||
| * are already marked for destruction. */ | |||
| for (int i = 0; i < Asset::GROUP_COUNT; i++) | |||
| for (Asset *a = data->list[i], *prev = NULL; a; prev = a, a = a->next) | |||
| for (int i = 0; i < Entity::GROUP_COUNT; i++) | |||
| for (Entity *a = data->list[i], *prev = NULL; a; prev = a, a = a->next) | |||
| if (a->destroy) | |||
| { | |||
| if (prev) | |||
| @@ -91,37 +91,37 @@ void Ticker::TickGame() | |||
| else | |||
| data->list[i] = a->next; | |||
| data->nassets--; | |||
| data->nentities--; | |||
| delete a; | |||
| } | |||
| /* Insert waiting objects into the appropriate lists */ | |||
| while (data->todo) | |||
| { | |||
| Asset *a = data->todo; | |||
| Entity *a = data->todo; | |||
| data->todo = a->next; | |||
| int i = a->GetGroup(); | |||
| a->next = data->list[i]; | |||
| data->list[i] = a; | |||
| data->nassets++; | |||
| data->nentities++; | |||
| } | |||
| /* Tick objects for the game loop */ | |||
| for (int i = 0; i < Asset::GROUP_COUNT; i++) | |||
| for (Asset *a = data->list[i]; a; a = a->next) | |||
| for (int i = 0; i < Entity::GROUP_COUNT; i++) | |||
| for (Entity *a = data->list[i]; a; a = a->next) | |||
| if (!a->destroy) | |||
| { | |||
| #if !FINAL_RELEASE | |||
| if (a->state != Asset::STATE_IDLE) | |||
| fprintf(stderr, "ERROR: asset not idle for game tick\n"); | |||
| a->state = Asset::STATE_PRETICK_GAME; | |||
| if (a->state != Entity::STATE_IDLE) | |||
| fprintf(stderr, "ERROR: entity not idle for game tick\n"); | |||
| a->state = Entity::STATE_PRETICK_GAME; | |||
| #endif | |||
| a->TickGame(data->delta_time); | |||
| #if !FINAL_RELEASE | |||
| if (a->state != Asset::STATE_POSTTICK_GAME) | |||
| fprintf(stderr, "ERROR: asset missed super game tick\n"); | |||
| a->state = Asset::STATE_IDLE; | |||
| if (a->state != Entity::STATE_POSTTICK_GAME) | |||
| fprintf(stderr, "ERROR: entity missed super game tick\n"); | |||
| a->state = Entity::STATE_IDLE; | |||
| #endif | |||
| } | |||
| @@ -133,20 +133,20 @@ void Ticker::TickRender() | |||
| Profiler::Start(Profiler::STAT_TICK_RENDER); | |||
| /* Tick objects for the render loop */ | |||
| for (int i = 0; i < Asset::GROUP_COUNT; i++) | |||
| for (Asset *a = data->list[i]; a; a = a->next) | |||
| for (int i = 0; i < Entity::GROUP_COUNT; i++) | |||
| for (Entity *a = data->list[i]; a; a = a->next) | |||
| if (!a->destroy) | |||
| { | |||
| #if !FINAL_RELEASE | |||
| if (a->state != Asset::STATE_IDLE) | |||
| fprintf(stderr, "ERROR: asset not idle for render tick\n"); | |||
| a->state = Asset::STATE_PRETICK_RENDER; | |||
| if (a->state != Entity::STATE_IDLE) | |||
| fprintf(stderr, "ERROR: entity not idle for render tick\n"); | |||
| a->state = Entity::STATE_PRETICK_RENDER; | |||
| #endif | |||
| a->TickRender(data->delta_time); | |||
| #if !FINAL_RELEASE | |||
| if (a->state != Asset::STATE_POSTTICK_RENDER) | |||
| fprintf(stderr, "ERROR: asset missed super render tick\n"); | |||
| a->state = Asset::STATE_IDLE; | |||
| if (a->state != Entity::STATE_POSTTICK_RENDER) | |||
| fprintf(stderr, "ERROR: entity missed super render tick\n"); | |||
| a->state = Entity::STATE_IDLE; | |||
| #endif | |||
| } | |||
| @@ -6,7 +6,7 @@ | |||
| // | |||
| // The Ticker class | |||
| // ---------------- | |||
| // The Ticker is a static class that registers assets and ticks them. | |||
| // The Ticker is a static class that registers entities and ticks them. | |||
| // | |||
| #if !defined __DH_TICKER_H__ | |||
| @@ -14,12 +14,12 @@ | |||
| #include <stdint.h> | |||
| #include "asset.h" | |||
| #include "entity.h" | |||
| class Ticker | |||
| { | |||
| public: | |||
| static void Register(Asset *asset); | |||
| static void Register(Entity *entity); | |||
| static void TickGame(); | |||
| static void TickRender(); | |||
| @@ -74,14 +74,14 @@ TileSet::~TileSet() | |||
| delete data; | |||
| } | |||
| Asset::Group TileSet::GetGroup() | |||
| Entity::Group TileSet::GetGroup() | |||
| { | |||
| return GROUP_BEFORE; | |||
| } | |||
| void TileSet::TickRender(float delta_time) | |||
| { | |||
| Asset::TickRender(delta_time); | |||
| Entity::TickRender(delta_time); | |||
| if (data->img) | |||
| { | |||
| @@ -16,18 +16,18 @@ | |||
| #include <stdint.h> | |||
| #include "asset.h" | |||
| #include "entity.h" | |||
| class TileSetData; | |||
| class TileSet : public Asset | |||
| class TileSet : public Entity | |||
| { | |||
| public: | |||
| TileSet(char const *path); | |||
| virtual ~TileSet(); | |||
| protected: | |||
| /* Inherited from Asset */ | |||
| /* Inherited from Entity */ | |||
| virtual Group GetGroup(); | |||
| virtual void TickRender(float delta_time); | |||