Iv managed to get a somewhat working procedural generated terrain. But.. for some reason my tiles get placed 1 square to the left on the screen on the second row on, and then makes 2 extra tiles at the end :D
Im sure it has something to do with
tile.y += TILE_SIZE *(Math.floor(tilesInWorld.length/ROW_LENGTH));
tile.x = TILE_SIZE * (tilesInWorld.length-(ROW_LENGTH*Math.floor(tilesInWorld.length/ROW_LENGTH)));
but im not sure...
heres the code for the generated terrain tho
package
{
import flash.display.*;
import flash.events.Event;
public class World
{
protected var tilesInWorld:Vector.<MovieClip> = new Vector.<MovieClip>();
public var worldTiles:Sprite;
protected var tile:MovieClip;
protected var TILE_SIZE = 25;
protected var MAP_WIDTH = 800;
protected var MAP_HEIGHT = 600;
protected var ROW_LENGTH = (MAP_WIDTH/TILE_SIZE)+1;
protected var COL_LENGTH = (MAP_HEIGHT/TILE_SIZE);
protected var MAX_WATER = 100;
protected var waterTiles;
protected var nextTile:String;
protected var maxTiles = ROW_LENGTH * COL_LENGTH;
protected var waterChain:int;
protected var waterBuffer:int;
public function World(parentMC:MovieClip)
{
waterBuffer = Math.random()*(maxTiles-MAX_WATER);
waterTiles = 0;
waterChain = 5;
nextTile = "";
parentMC.addEventListener(Event.ENTER_FRAME, update);
worldTiles = new Sprite();
parentMC.addChild(worldTiles);
}
protected function generateTile()
{
if (tilesInWorld.length > 0)
{
if (waterTiles >= MAX_WATER)
{
tile = new Grass();
nextTile = "grass";
trace(waterTiles);
}
else
{
if(tilesInWorld.length + 1 < waterBuffer){
nextTile = "grass";
}
for (var i:int = 0; i < tilesInWorld.length; i++)
{
if (tilesInWorld[i].x == (tilesInWorld[tilesInWorld.length-1].x + TILE_SIZE) && tilesInWorld[i].y == (tilesInWorld[tilesInWorld.length-1].y-TILE_SIZE) && tilesInWorld[i].type == "water")
{
nextTile = "water";
}
}
if (nextTile == "grass")
{
tile = new Grass();
nextTile = "";
waterChain = 0;
}
else if (nextTile == "water")
{
waterTiles += 1;
waterChain += 1;
tile = new Water();
if (waterChain > 5)
{
nextTile = "";
}
else
{
nextTile = "water";
}
}
else
{
if (Math.random() * 1 >= 0.25)
{
waterChain = 0;
tile = new Grass();
nextTile = "grass";
}
else
{
waterTiles += 1;
waterChain += 1;
tile = new Water();
nextTile = "water";
}
}
}
}
else
{
if (Math.random() * 1 >= 0.5)
{
waterChain = 0;
nextTile = "grass";
tile = new Grass();
}
else
{
waterTiles += 1;
waterChain += 1;
nextTile = "water";
tile = new Water();
}
}
this is where the actual coding for placing the X and Y potion of the tiles is located, in other words, this is the place where i believe the error is at
tilesInWorld.push(tile);
tile.width = TILE_SIZE;
tile.height = TILE_SIZE;
worldTiles.x = 0-(tile.width/2);
worldTiles.y = 0+(tile.height/2);
tile.x = TILE_SIZE * tilesInWorld.length;
if (tile.x >= MAP_WIDTH)
{
tile.y += TILE_SIZE * (Math.floor(tilesInWorld.length/ROW_LENGTH));
tile.x = TILE_SIZE * (tilesInWorld.length-(ROW_LENGTH*Math.floor(tilesInWorld.length/ROW_LENGTH)));
}
worldTiles.addChild(tile);
}
protected function allowTile():Boolean
{
//if()
if (tilesInWorld.length > maxTiles)
{
return false;
}
return true;
}
protected function update(e:Event)
{
if (allowTile())
{
generateTile();
}
}
}
}
heres a link to the game for you can actually see what it is doing
http://www.fastswf.com/p13LrYA
just realized you cant see what its doing because its off the screen lolol :D
Also, if anyone could help make a better way of making random lakes in the terrain?
But thanks ahead of time for the help!