Ver código fonte

Factor Forge and Tiler using the new Dict class.

legacy
Sam Hocevar sam 14 anos atrás
pai
commit
3bb8c8aa2f
12 arquivos alterados com 190 adições e 119 exclusões
  1. +1
    -1
      src/Makefile.am
  2. +1
    -0
      src/core.h
  3. +9
    -8
      src/debugfps.cpp
  4. +111
    -0
      src/dict.cpp
  5. +35
    -0
      src/dict.h
  6. +5
    -0
      src/entity.cpp
  7. +2
    -0
      src/entity.h
  8. +1
    -2
      src/font.h
  9. +13
    -54
      src/forge.cpp
  10. +3
    -2
      src/forge.h
  11. +8
    -50
      src/tiler.cpp
  12. +1
    -2
      src/tileset.h

+ 1
- 1
src/Makefile.am Ver arquivo

@@ -4,7 +4,7 @@ noinst_PROGRAMS = test-map editor
noinst_LIBRARIES = libcommon.a

libcommon_a_SOURCES = \
core.h matrix.h game.cpp game.h tiler.cpp tiler.h \
core.h matrix.h game.cpp game.h tiler.cpp tiler.h dict.cpp dict.h \
scene.cpp scene.h font.cpp font.h layer.cpp layer.h map.cpp map.h \
entity.cpp entity.h ticker.cpp ticker.h tileset.cpp tileset.h \
forge.cpp forge.h video.cpp video.h timer.cpp timer.h bitfield.h \


+ 1
- 0
src/core.h Ver arquivo

@@ -28,6 +28,7 @@
#include "tileset.h"

// Other objects
#include "dict.h"
#include "map.h"
#include "layer.h"



+ 9
- 8
src/debugfps.cpp Ver arquivo

@@ -21,7 +21,7 @@ class DebugFpsData
friend class DebugFps;

private:
Font *font;
int fontid;
int frame;
};

@@ -33,7 +33,7 @@ DebugFps::DebugFps()
{
data = new DebugFpsData();

data->font = Forge::GetFont("gfx/font/ascii.png");
data->fontid = Forge::Register("gfx/font/ascii.png");
data->frame = 0;
}

@@ -49,35 +49,36 @@ void DebugFps::TickRender(float deltams)
data->frame++;

char buf[1024];
Font *font = Forge::GetFont(data->fontid);

sprintf(buf, "%2.2f fps (%i)",
1e3f / Profiler::GetMean(Profiler::STAT_TICK_FRAME), data->frame);
data->font->PrintBold(10, 10, buf);
font->PrintBold(10, 10, buf);

sprintf(buf, "Game % 7.2f % 7.2f",
Profiler::GetMean(Profiler::STAT_TICK_GAME),
Profiler::GetMax(Profiler::STAT_TICK_GAME));
data->font->PrintBold(10, 34, buf);
font->PrintBold(10, 34, buf);

sprintf(buf, "Render % 7.2f % 7.2f",
Profiler::GetMean(Profiler::STAT_TICK_RENDER),
Profiler::GetMax(Profiler::STAT_TICK_RENDER));
data->font->PrintBold(10, 50, buf);
font->PrintBold(10, 50, buf);

sprintf(buf, "Blit % 7.2f % 7.2f",
Profiler::GetMean(Profiler::STAT_TICK_BLIT),
Profiler::GetMax(Profiler::STAT_TICK_BLIT));
data->font->PrintBold(10, 66, buf);
font->PrintBold(10, 66, buf);

sprintf(buf, "Frame % 7.2f % 7.2f",
Profiler::GetMean(Profiler::STAT_TICK_FRAME),
Profiler::GetMax(Profiler::STAT_TICK_FRAME));
data->font->PrintBold(10, 82, buf);
font->PrintBold(10, 82, buf);
}

DebugFps::~DebugFps()
{
Forge::ReleaseFont(data->font);
Forge::Deregister(data->fontid);
delete data;
}


+ 111
- 0
src/dict.cpp Ver arquivo

@@ -0,0 +1,111 @@
//
// Deus Hax (working title)
// Copyright (c) 2010 Sam Hocevar <sam@hocevar.net>
//

#if defined HAVE_CONFIG_H
# include "config.h"
#endif

#include <cstring>
#include <cstdio>
#include <cstdlib>

#include "core.h"

/*
* Dict implementation class
*/

class DictData
{
friend class Dict;

public:
DictData() :
entities(0),
nentities(0)
{
/* Nothing to do */
}

~DictData()
{
if (nentities)
fprintf(stderr, "ERROR: still %i entities in dict\n", nentities);
free(entities);
}

private:
Entity **entities;
int nentities;
};

/*
* Public Dict class
*/

Dict::Dict()
{
data = new DictData();
}

Dict::~Dict()
{
delete data;
}

int Dict::MakeSlot(char const *name)
{
int id, empty = -1;

/* If the entry is already registered, remember its ID. Look for an
* empty slot at the same time. */
for (id = 0; id < data->nentities; id++)
{
Entity *e = data->entities[id];
if (!e)
empty = id;
else if (!strcasecmp(name, e->GetName()))
break;
}

/* If this is a new entry, create a new slot for it. */
if (id == data->nentities)
{
if (empty == -1)
{
empty = data->nentities++;
data->entities = (Entity **)realloc(data->entities,
data->nentities * sizeof(Entity *));
}

data->entities[empty] = NULL;
id = empty;
}
else
{
data->entities[id]->Ref();
}

return id;
}

void Dict::RemoveSlot(int id)
{
if (data->entities[id]->Unref() == 0)
data->entities[id] = NULL;
}


void Dict::SetEntity(int id, Entity *entity)
{
entity->Ref();
data->entities[id] = entity;
}

Entity *Dict::GetEntity(int id)
{
return data->entities[id];
}


+ 35
- 0
src/dict.h Ver arquivo

@@ -0,0 +1,35 @@
//
// Deus Hax (working title)
// Copyright (c) 2010 Sam Hocevar <sam@hocevar.net>
//

//
// The Dict class
// --------------
//

#if !defined __DH_DICT_H__
#define __DH_DICT_H__

#include "entity.h"

class DictData;

class Dict
{
public:
Dict();
~Dict();

int MakeSlot(char const *name);
void RemoveSlot(int id);

void SetEntity(int id, Entity *entity);
Entity *GetEntity(int id);

private:
DictData *data;
};

#endif // __DH_DICT_H__


+ 5
- 0
src/entity.cpp Ver arquivo

@@ -35,6 +35,11 @@ Entity::~Entity()
#endif
}

char const *Entity::GetName()
{
return "Generic entity";
}

Entity::Group Entity::GetGroup()
{
return GROUP_DEFAULT;


+ 2
- 0
src/entity.h Ver arquivo

@@ -20,6 +20,7 @@ class Entity
{
friend class Ticker;
friend class TickerData;
friend class Dict;

public:
virtual void Ref();
@@ -40,6 +41,7 @@ protected:
Entity();
virtual ~Entity();

virtual char const *GetName();
virtual Group GetGroup();

virtual void TickGame(float deltams);


+ 1
- 2
src/font.h Ver arquivo

@@ -23,13 +23,12 @@ public:

protected:
/* Inherited from Entity */
virtual char const *GetName();
virtual Group GetGroup();
virtual void TickRender(float deltams);

public:
/* New methods */
char const *GetName();

void Print(int x, int y, char const *str);
void PrintBold(int x, int y, char const *str);



+ 13
- 54
src/forge.cpp Ver arquivo

@@ -7,10 +7,6 @@
# include "config.h"
#endif

#include <cstring>
#include <cstdio>
#include <cstdlib>

#include "core.h"

#if defined WIN32
@@ -26,23 +22,7 @@ static class ForgeData
friend class Forge;

public:
ForgeData() :
fonts(0),
nfonts(0)
{
/* Nothing to do */
}

~ForgeData()
{
if (nfonts)
fprintf(stderr, "ERROR: still %i fonts in forge\n", nfonts);
free(fonts);
}

private:
Font **fonts;
int nfonts;
Dict fonts;
}
forgedata;

@@ -52,47 +32,26 @@ static ForgeData * const data = &forgedata;
* Public Forge class
*/

Font *Forge::GetFont(char const *path)
int Forge::Register(char const *path)
{
int id, empty = -1;
int id = data->fonts.MakeSlot(path);

/* If the font is already registered, remember its ID. Look for an
* empty slot at the same time. */
for (id = 0; id < data->nfonts; id++)
if (!data->fonts.GetEntity(id))
{
Font *t = data->fonts[id];
if (!t)
empty = id;
else if (!strcasecmp(path, t->GetName()))
break;
Font *font = new Font(path);
data->fonts.SetEntity(id, font);
}

/* If this is a new font, create a new one. */
if (id == data->nfonts)
{
if (empty == -1)
{
empty = data->nfonts++;
data->fonts = (Font **)realloc(data->fonts,
data->nfonts * sizeof(Font *));
}

data->fonts[empty] = new Font(path);
id = empty;
}
return id;
}

data->fonts[id]->Ref();
return data->fonts[id];
void Forge::Deregister(int id)
{
data->fonts.RemoveSlot(id);
}

void Forge::ReleaseFont(Font *font)
Font *Forge::GetFont(int id)
{
if (font->Unref() == 0)
for (int id = 0; id < data->nfonts; id++)
if (font == data->fonts[id])
{
data->fonts[id] = NULL;
break;
}
return (Font *)data->fonts.GetEntity(id);
}


+ 3
- 2
src/forge.h Ver arquivo

@@ -17,8 +17,9 @@
class Forge
{
public:
static Font *GetFont(char const *path);
static void ReleaseFont(Font *font);
static int Register(char const *path);
static void Deregister(int id);
static Font *GetFont(int id);
};

#endif // __DH_FORGE_H__


+ 8
- 50
src/tiler.cpp Ver arquivo

@@ -7,10 +7,6 @@
# include "config.h"
#endif

#include <cstring>
#include <cstdio>
#include <cstdlib>

#include "core.h"

#if defined WIN32
@@ -26,23 +22,7 @@ static class TilerData
friend class Tiler;

public:
TilerData() :
tilesets(0),
ntilesets(0)
{
/* Nothing to do */
}

~TilerData()
{
if (ntilesets)
fprintf(stderr, "ERROR: still %i tilesets in tiler\n", ntilesets);
free(tilesets);
}

private:
TileSet **tilesets;
int ntilesets;
Dict tilesets;
}
tilerdata;

@@ -54,49 +34,27 @@ static TilerData * const data = &tilerdata;

int Tiler::Register(char const *path)
{
int id, empty = -1;

/* If the tileset is already registered, remember its ID. Look for an
* empty slot at the same time. */
for (id = 0; id < data->ntilesets; id++)
{
TileSet *t = data->tilesets[id];
if (!t)
empty = id;
else if (!strcasecmp(path, t->GetName()))
break;
}
int id = data->tilesets.MakeSlot(path);

/* If this is a new tileset, create a new one. */
if (id == data->ntilesets)
if (!data->tilesets.GetEntity(id))
{
if (empty == -1)
{
empty = data->ntilesets++;
data->tilesets = (TileSet **)realloc(data->tilesets,
data->ntilesets * sizeof(TileSet *));
}

data->tilesets[empty] = new TileSet(path);
id = empty;
TileSet *tileset = new TileSet(path);
data->tilesets.SetEntity(id, tileset);
}

data->tilesets[id]->Ref();
return id + 1; /* ID 0 is for the empty tileset */
}

void Tiler::Deregister(int id)
{
--id; /* ID 0 is for the empty tileset */

if (data->tilesets[id]->Unref() == 0)
data->tilesets[id] = NULL;
data->tilesets.RemoveSlot(id - 1); /* ID 0 is for the empty tileset */
}

void Tiler::BlitTile(uint32_t code, int x, int y, int z, int o)
{
int id = (code >> 16) - 1; /* ID 0 is for the empty tileset */

data->tilesets[id]->BlitTile(code & 0xffff, x, y, z, o);
TileSet *tileset = (TileSet *)data->tilesets.GetEntity(id);
tileset->BlitTile(code & 0xffff, x, y, z, o);
}


+ 1
- 2
src/tileset.h Ver arquivo

@@ -28,13 +28,12 @@ public:

protected:
/* Inherited from Entity */
virtual char const *GetName();
virtual Group GetGroup();
virtual void TickRender(float deltams);

public:
/* New methods */
char const *GetName();

void BlitTile(uint32_t id, int x, int y, int z, int o);

private:


Carregando…
Cancelar
Salvar