Re: When can one use "bare" procedural code?
On Mar 31, 8:51 am, "Daniel T." <danie...@earthlink.net> wrote:
mike3 <mike4...@yahoo.com> wrote:
On Mar 30, 9:10 pm, "Daniel T." <danie...@earthlink.net> wrote:
What about the LevelMap class? I'm wondering if "GenerateLevel" shoul=
d
be in LevelMap instead of a separate function.
What code have you written so far?
LevelMap looks like this:
class LevelMap {
private:
...
public:
u16 getWidth() const
<inline>
u16 getHeight() const
<inline>
LevelTile& operator()(u16 y, u16 x)
<inline>
LevelTile operator()(u16 y, u16 x) const
<inline>
LevelMap();
LevelMap(u16, u16, int);
~LevelMap();
};
Not all that much, just wraps up a 2D grid of tiles (stored with
std::vector), with operators to access it like a matrix and get
the size (with guaranteed boundschecking enabled on debug builds
by using std::vector::at() in the operators for such builds).
Not yet implemented but will be at some point: save/load a map
to/from a disk file, load a predefined map template.
Even if I were to put GenerateLevel in LevelMap, what about the
whole RoomMaker thing?
The LevelMap interface you show above is nothing more than a container
for LevelTiles. IMHO it doesn't even deserve mention in a design
diagram. Maybe you can show me the LevelTile class or one of the classes
that use this LevelMap class?
LevelTile looks like this:
class LevelTile {
private:
XCHAR intrinsicChar; /* Character intrinsic to this tile
*/
XCHAR displayedChar; /* Character displayed for this tile
*/
u8 flags; /* Flags (see above) */
u8 trapType; /* Type of trap on this tile */
u8 roomEffect; /* Permanent room effect */
u8 oneTimeEffect; /* One-time room effect */
u16 roomY, roomX; /* Coordinates of this tile in its
room
* (if part of a room).
*/
u8 moveFunc; /* Function triggered upon moving to
this
* tile.
*/
u8 aux1, aux2; /* Auxiliary data fields */
u8 buildaux; /* Auxiliary field used when
* building the level
*/
//std::vector<Item> items;
//std::auto_ptr<Monster> Monster;
public:
/* Inlined members */
XCHAR getIntrinsicChar() const
{ return(intrinsicChar); }
XCHAR getDisplayedChar() const
{ return(displayedChar); }
u8 getFlags() const
{ return(flags); }
u8 getTrapType() const
{ return(trapType); }
u8 getRoomEffect() const
{ return(roomEffect); }
u8 getOneTimeEffect() const
{ return(oneTimeEffect); }
u8 getRoomY() const
{ return(roomY); }
u8 getRoomX() const
{ return(roomX); }
u8 getMoveFunc() const
{ return(moveFunc); }
u8 getAux1() const
{ return(aux1); }
u8 getAux2() const
{ return(aux2); }
u8 getBuildAux() const
{ return(buildaux); }
void setTrapType(u8 trapType_)
{ trapType = trapType_; }
void clearOneTimeEffect()
{ oneTimeEffect = 0; }
void setMoveFunc(u8 moveFunc_)
{ moveFunc = moveFunc_; }
void setBuildAux(u8 buildaux_)
{ buildaux = buildaux_; }
/* Routines defined in leveltile.cpp */
LevelTile(); /* Default constructor */
LevelTile(const XCHAR&); /* Construct to specific intrinsic
char */
LevelTile(const XCHAR&, const XCHAR&); /* Construct with both
intrinsic
* and displayed chars specified
*/
LevelTile(const XCHAR&, u16, u16); /* Construct to specific
intrinsic char
* and room y/x coordinates
*/
LevelTile(const XCHAR&, const XCHAR&,
u16, u16); /* Construct to specific intrinsic/
displayed
* chars and room y/x coordinates
*/
LevelTile(const XCHAR&, const XCHAR&,
u8, u8, u8,
u8, u16, u16, u8,
u8, u8, u8); /* Construct with all fields specified */
~LevelTile(); /* Destructor */
};
It just holds various data fields. Due to that, I've wondered
whether it'd be better to just eliminate all the accessors and
just making it a "struct" instead (or "public") w/constructors
to fill in default values for various prefabbed tile types. Is
that a good idea or not? I've heard this stuff about "don't use
structs", etc. (which is the only reason it's the way it is) but
in this case I can't really think of anything else this should be.
Except there's going to be routines at some point that open/close
doors, handle trap triggering, etc. and I'm not sure if those
could/should go in there or not.