Question

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!

Was it helpful?

Solution

Change

protected var ROW_LENGTH = (MAP_WIDTH/TILE_SIZE); //remove the +1  

Remove

if (tile.x >= MAP_WIDTH)

and you can calculate a tiles x,y from its index (which you can get using tilesInWorld.length before they are added) using:

tile.x = TILE_SIZE * (tilesInWorld.length % ROW_LENGTH);
tile.y = TILE_SIZE * Math.floor(tilesInWorld.length / ROW_LENGTH);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top