• FEATURED
• FEATURED
• FEATURED
• FEATURED
• FEATURED

View more

View more

View more

Image of the Day Submit

IOTD | Top Screenshots

The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

XY Map class

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

3 replies to this topic

#1yewbie  Members

Posted 10 March 2011 - 11:00 AM

In the past I have been using a 2 dimensional array to store my map structure like so:

struct MapInfo
{
int tile;
int blah;
}
MapInfo MyMap[x][y];

I want to try to move this into a class so I can easily pass around a pointer to a specific location to various classes that would need it, I started with this, but I cannot figure out how to insert and access the locations properly, I think it may just be too early for me to wrap my mind around what im doing.

Below is sort the route that I was trying to go, but as you see the way X and Y map locations are added, (and accessed) I can't figure out a way to add them in the correct order to my vector, and then be able to access them correctly by just specifying a x and y location.

I know my logic as below is completely flawed but I figured posting what I was trying to do would make more sense than explaining it, thanks!!

Map.h
#ifndef MAPCLASS

#define MAPCLASS

/*------------------------------------------------------------------------------------------------- */
/*  this class Deals with our map data														         */
/*																									*/
/*-------------------------------------------------------------------------------------------------*/
#include <vector>
#include <iostream>
using namespace std;

class MapTile
{
public:
int x;
int y;
int iCurrentTileGraphic;	//Tile in this location
int iOriginalTileGraphic;	//this was the tile we started with (for animation)
int Lighting;				//Lighting value associated with this tile
int Alpha;					//Transparency value
bool Blocked;				//If this tile is blocked or not
};

class MapInfo
{
private:
vector <MapTile> TileLoc;				//this stores all of our map info

public:
MapTile* GetMapLocPtr(int X, int Y);
void CreateMap(int Xsize, int Ysize);	//Creates a map with X*Y size

};

#endif


Map.cpp
#include "Map.h"

MapTile* MapInfo::GetMapLocPtr(int X, int Y)
{
int TileNum = X * Y; //get our tile location (problem here)

if(TileNum < (int) TileLoc.size() || TileNum < 0) //make sure its in bounds
{
return &TileLoc.at(TileNum);
}

else //else this is out of range
{
cout << "Tried to access a out of range map location: " << X << " - " << Y << " = " << TileNum << endl;
}

return NULL;
}

void MapInfo::CreateMap(int Xsize, int Ysize)	//Creates a map with X*Y size
{
int MapSize = Xsize * Ysize; //get our tile location
TileLoc.reserve(MapSize +1); //reserve enough memory space

for(int x=0;x<Xsize+1;x++) //(problem here)
{
for(int y=0;y<Ysize+1;y++)
{
MapTile NewTile;
NewTile.Alpha = 0;
NewTile.Blocked = false;
NewTile.iCurrentTileGraphic = 0;
NewTile.iOriginalTileGraphic = 0;
NewTile.Lighting = 0;
NewTile.x = x;
NewTile.y = y;
}
}

cout << "Created map with: " << MapSize << " Members" << endl;
cout << "TileLoc contains: " << TileLoc.size() << endl;
}


#2xEricx  Members

Posted 10 March 2011 - 11:11 AM

In the past I have been using a 2 dimensional array to store my map structure like so:

struct MapInfo
{
int tile;
int blah;
}
MapInfo MyMap[x][y];

I want to try to move this into a class so I can easily pass around a pointer to a specific location to various classes that would need it, I started with this, but I cannot figure out how to insert and access the locations properly, I think it may just be too early for me to wrap my mind around what im doing.

Below is sort the route that I was trying to go, but as you see the way X and Y map locations are added, (and accessed) I can't figure out a way to add them in the correct order to my vector, and then be able to access them correctly by just specifying a x and y location.

I know my logic as below is completely flawed but I figured posting what I was trying to do would make more sense than explaining it, thanks!!

Map.h

#ifndef MAPCLASS

#define MAPCLASS

/*------------------------------------------------------------------------------------------------- */
/*  this class Deals with our map data													             */
/*																									*/
/*-------------------------------------------------------------------------------------------------*/
#include <vector>
#include <iostream>
using namespace std;

class MapTile
{
public:
int x;
int y;
int iCurrentTileGraphic;	//Tile in this location
int iOriginalTileGraphic;	//this was the tile we started with (for animation)
int Lighting;				//Lighting value associated with this tile
int Alpha;					//Transparency value
bool Blocked;				//If this tile is blocked or not
};

class MapInfo
{
private:
vector <MapTile> TileLoc;				//this stores all of our map info

public:
MapTile* GetMapLocPtr(int X, int Y);
void CreateMap(int Xsize, int Ysize);	//Creates a map with X*Y size

};

#endif


Map.cpp
#include "Map.h"

MapTile* MapInfo::GetMapLocPtr(int X, int Y)
{
int TileNum = X * Y; //get our tile location (problem here)

if(TileNum < (int) TileLoc.size() || TileNum < 0) //make sure its in bounds
{
return &TileLoc.at(TileNum);
}

else //else this is out of range
{
cout << "Tried to access a out of range map location: " << X << " - " << Y << " = " << TileNum << endl;
}

return NULL;
}

void MapInfo::CreateMap(int Xsize, int Ysize)	//Creates a map with X*Y size
{
int MapSize = Xsize * Ysize; //get our tile location
TileLoc.reserve(MapSize +1); //reserve enough memory space

for(int x=0;x<Xsize+1;x++) //(problem here)
{
for(int y=0;y<Ysize+1;y++)
{
MapTile NewTile;
NewTile.Alpha = 0;
NewTile.Blocked = false;
NewTile.iCurrentTileGraphic = 0;
NewTile.iOriginalTileGraphic = 0;
NewTile.Lighting = 0;
NewTile.x = x;
NewTile.y = y;
}
}

cout << "Created map with: " << MapSize << " Members" << endl;
cout << "TileLoc contains: " << TileLoc.size() << endl;
}


Part of your problem (i didn't read the entire code) is that your TileNum should be something like X + Width * Y;

Also, when you reserve your array you can then simply index it so when adding new tiles you'd use the same X + Width(Xsize) * Y to access elements of your vector.

Hope this helps

#3yewbie  Members

Posted 10 March 2011 - 12:02 PM

Part of your problem (i didn't read the entire code) is that your TileNum should be something like X + Width * Y;

Also, when you reserve your array you can then simply index it so when adding new tiles you'd use the same X + Width(Xsize) * Y to access elements of your vector.

Hope this helps

Awesome, yeah I think that will defiantly make it work, I just couldn't put it all together, thanks!
I will give this a try here hopefully soon.

#4yewbie  Members

Posted 10 March 2011 - 02:32 PM

Worked like a charm thanks!

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.