Map editor: Fill Command help
#1 Members - Reputation: 209
Posted 01 July 2012 - 04:55 AM
#4 Members - Reputation: 209
Posted 01 July 2012 - 11:03 PM
Ive debugged it and i cant seems to find why it keeps continuing even after its passed the maps width and height values.
private void FloodFill(Point q, Tile seed, Tile replacement)
{
int h = maps[clbLevels.SelectedIndex].YLevels[clbYLevels.SelectedIndex].Layers[clbLayers.SelectedIndex].Height;
int w = maps[clbLevels.SelectedIndex].YLevels[clbYLevels.SelectedIndex].Layers[clbLayers.SelectedIndex].Width;
if (q.Y < 0 || q.Y > h - 1 || q.X < 0 || q.X > w - 1)
return;
Stack<Point> stack = new Stack<Point>();
stack.Push(q);
while (stack.Count > 0)
{
Point p = stack.Pop();
int x = p.X;
int y = p.Y;
if (y < 0 || y > h - 1 || x < 0 || x > w - 1)
continue;
Tile val = new Tile(maps[clbLevels.SelectedIndex].YLevels[clbYLevels.SelectedIndex].Layers[clbLayers.SelectedIndex].GetTile(x, y).TileIndex, maps[clbLevels.SelectedIndex].YLevels[clbYLevels.SelectedIndex].Layers[clbLayers.SelectedIndex].GetTile(x, y).TileSetIndex);
if (val.TileIndex == seed.TileIndex && val.Tileset == val.Tileset)
{
maps[clbLevels.SelectedIndex].YLevels[clbYLevels.SelectedIndex].Layers[clbLayers.SelectedIndex].SetTile(x, y, replacement.TileIndex, replacement.Tileset, replacement.CollisionType);
stack.Push(new Point(x + 1, y));
stack.Push(new Point(x - 1, y));
stack.Push(new Point(x, y + 1));
stack.Push(new Point(x, y - 1));
}
}
}
Thanks for reading
-Thekill
Edited by Thekill473, 01 July 2012 - 11:04 PM.
#5 Members - Reputation: 809
Posted 02 July 2012 - 02:29 AM
Edited by RulerOfNothing, 02 July 2012 - 02:51 AM.
#6 Members - Reputation: 269
Posted 02 July 2012 - 03:11 AM
I'm not at all familiar with that language, so I those 'new' statements are pretty confusing for a C++ programmer.. They wouldn't compile in the first place, and if they did they'd be a source for a memory leak!
But since that's probably not the case..
C# seems to have the same operator precedence, but I'd probably reinforce your intent here anyway. You're also using it twice. Make it a function!
bool OutOfBounds( Point p, int w, int h )
{
return
(p.Y < 0) ||
(p.Y > (h - 1)) ||
(p.X < 0) ||
(p.X > (w - 1));
}
I don't think that would change much though...
On row 16, what is the purpose of the comma separating the new statement and the map access? I agree with RulerOfNothing.. some of those statements are just too big to make much sense out of.
Edited by Zoomulator, 02 July 2012 - 03:14 AM.
#7 Members - Reputation: 185
Posted 02 July 2012 - 08:54 AM
[source lang="csharp"] void fillMap(int mapWidth, int mapHight, int tileSet, int texture) { for (int x = 0; x < mapWidth; x++) { for (int y = 0; y < mapHight; y++) { map.tilesLayer0[x, y].tileSet = tileSet; map.tilesLayer0[x, y].texture = texture; } } }[/source]
Or am I misunderstanding what you are trying to do?
#9 Staff - Reputation: 8897
Posted 02 July 2012 - 11:14 PM
Could you share your solution for the benefit of anyone who has a similar problem in future?I got it working.
- Jason Astle-Adams.
From my blog: 20 ways to advertise your game | What next? Intermediate to advanced C++
How to make games WITHOUT programming | 4 reasons you aren't a successful indie developer
#10 Members - Reputation: 957
Posted 02 July 2012 - 11:47 PM
That draws a filled rectangle, what he's doing is more akin to the flood fill tool (e.g. bucket) from painting programs. Although a filled rectangle is probably an useful thing to have in such an editor too.I think you are over complicating it? I use the following in my editor to fill entire maps with the same tile:
[source lang="csharp"] void fillMap(int mapWidth, int mapHight, int tileSet, int texture) { for (int x = 0; x < mapWidth; x++) { for (int y = 0; y < mapHight; y++) { map.tilesLayer0[x, y].tileSet = tileSet; map.tilesLayer0[x, y].texture = texture; } } }[/source]
Or am I misunderstanding what you are trying to do?
#11 Members - Reputation: 209
Posted 03 July 2012 - 06:26 AM
if (val.TileIndex == seed.TileIndex && val.Tileset == val.Tileset)
Is meant to be
if (val.TileIndex == seed.TileIndex && val.Tileset == seed.Tileset)
And here is the original i found online.
private static void Floodfill(byte[,] vals, Point q, byte SEED_COLOR, byte COLOR)
{
int h = vals.GetLength(0);
int w = vals.GetLength(1);
if (q.Y < 0 || q.Y > h - 1 || q.X < 0 || q.X > w - 1)
return;
Stack<Point> stack = new Stack<Point>();
stack.Push(q);
while (stack.Count > 0)
{
Point p = stack.Pop();
int x = p.X;
int y = p.Y;
if (y < 0 || y > h - 1 || x < 0 || x > w - 1)
continue;
byte val = vals[y, x];
if (val == SEED_COLOR)
{
vals[y, x] = COLOR;
stack.Push(new Point(x + 1, y));
stack.Push(new Point(x - 1, y));
stack.Push(new Point(x, y + 1));
stack.Push(new Point(x, y - 1));
}
}
}
At
http://stackoverflow.com/questions/1257117/does-anyone-have-a-working-non-recursive-floodfill-algorithm-written-in-c
Hope this post helps anybody else in the future looking for a flood fill algorithm.






