Package edu.ups.gamedev.terrain.tile

Source Code of edu.ups.gamedev.terrain.tile.TileMap

package edu.ups.gamedev.terrain.tile;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Random;
import java.util.Set;

import javax.imageio.ImageIO;

import com.jme.image.Texture;
import com.jme.math.Vector2f;
import com.jme.math.Vector3f;
import com.jme.renderer.Renderer;
import com.jmex.terrain.util.ImageBasedHeightMap;

public class TileMap {
  private int tilesWide;
  private int tilesHigh;
  private int[][] tileData;
  private Tile[][] tileStore;
  private TileTexture[] tileTextures;
  private ImageBasedHeightMap heightMap;

  private static Hashtable<String,Vector2f> ht = null;
 
  public TileMap(File tileMapFile, ImageBasedHeightMap heightMap, File[] tiles) {
    this.heightMap = heightMap;

    BufferedImage bf;
    try {
      bf = ImageIO.read(tileMapFile);
      tilesHigh = bf.getHeight();
      tilesWide = bf.getWidth();

      tileStore = new Tile[tilesWide][tilesHigh];
      tileData = new int[tilesWide][tilesHigh];

      for (int x = 0; x < tilesWide; x++) {
        for (int y = 0; y < tilesHigh; y++) {
          tileData[x][y] = bf.getRGB(x, y);
        }
      }

    } catch (IOException e) {
      e.printStackTrace();
    }

    tileTextures = new TileTexture[tiles.length];
    int tileOrder = 0;
    for (File tile : tiles) {
      tileTextures[tileOrder] = new TileTexture(tile, tileOrder);
      tileOrder++;
    }
   
    genTileCoords();
  }

  public int getTilesWide() {
    return tilesWide;
  }

  public int getTilesHigh() {
    return tilesHigh;
  }

  public Tile getTileAtPoint(Vector2f point) {
    return getTileAtPoint((int) point.x, (int) point.y);
  }

  public Tile getTileAtPoint(int x, int y) {
    if (tileStore[x][y] == null) {
      tileStore[x][y] = createTileAtPoint(x, y);
    }
    return tileStore[x][y];
  }

  public int tileIndexForColor( int color ){
    switch( color ) {
    case -16776961:
      return 0;
    case -16711936:
      return 1;
    case -65536:
      return 2;
    case -1:
      return 0;
    default:
      System.out.println( "Couldn't handle color " + color );
      return 0;
    }
  }
 
  public Set<String> keys = new HashSet<String>();
 
  public Tile createTileAtPoint(int x, int y) {
    Tile result = null;
    System.out.println( x + ", " + y );
    Vector3f origin = new Vector3f( (float)x * 1.99f, (float)y * 1.99f, 0.0f );
    if (x > 1 && y > 1 && x+1 < tilesWide && y+1 < tilesHigh) {

      int same = tileData[x][y];

      int different = -1;
     
      String key = "";
      for( int k = -1; k < 2; k++ ) {
        for( int j = 1; j >= -1; j-- ) {
          int sample = tileData[x+j][y+k];
          if( sample == same ) {
            key += "S";
          } else {
            key += "D";
            different = sample;
          }
        }
      }
     
      Vector2f coords = ht.get( key );
      int baseTexture = tileIndexForColor( same );
      int overTexture = tileIndexForColor( different );
      if( coords == null || baseTexture > overTexture ) {
        Vector2f newCoord = new Vector2f( 0.0f, 0.0f );
        if( ! key.equals( "SSSSSSSSS" )) {
          System.out.println( key );
          keys.add( key );
        } else {
          Random r = new Random();
          int k = r.nextInt(1000);
          if (k > 700) {
            int t = r.nextInt(3) + 4;
            int b = r.nextInt(4);
            newCoord.x = Math.abs(t) * TileTexture.TILE_WIDTH;
            newCoord.y = Math.abs(b) * TileTexture.TILE_HEIGHT;
          }
        }
       
        result = new Tile( origin, heightMap.getHeightMap(), tileTextures[baseTexture].getTexture(), newCoord );
      } else {
        result = new Tile( origin, heightMap.getHeightMap(), tileTextures[baseTexture].getTexture(), tileTextures[overTexture].getTexture(), new Vector2f(0.0f, 0.0f), coords);
      }
    }
    if( result == null ) {
      result = new Tile( origin, heightMap.getHeightMap(), tileTextures[0].getTexture(), new Vector2f(0.0f, 0.0f));
    }
    return result;
  }
 
  public void genTileCoords() {
    if( ht == null ) {
      ht = new Hashtable<String,Vector2f>();
    }
   

    // autogen
    ht.put("SDD" +"SSD" +"SDD",new Vector2f( 4 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
    ht.put("DDS" +"DSS" +"DDD",new Vector2f( 5 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
    ht.put("SSD" +"SSS" +"SSD",new Vector2f( 5 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
    ht.put("DSD" +"DSS" +"DDS",new Vector2f( 6 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
    ht.put("DDD" +"SSS" +"SDD",new Vector2f( 7 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
   
   
    ht.put("SDD" +"SSS" +"SSD",new Vector2f( 4 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
    ht.put("DSD" +"DSD" +"DDS",new Vector2f( 5 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
    ht.put("DSS" +"SSS" +"DDS",new Vector2f( 5 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
    ht.put("SDD" +"SSD" +"DSD",new Vector2f( 5 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
    ht.put("SSS" +"SSS" +"DDD",new Vector2f( 6 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
    ht.put("SDD" +"DSD" +"DSD",new Vector2f( 4 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
    ht.put("DDD" +"SSD" +"DDD",new Vector2f( 5 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
    ht.put("SSD" +"SSS" +"DDD",new Vector2f( 6 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
   
   
    ht.put("DSD" +"DSD" +"DSS",new Vector2f( 5 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
    ht.put("SSD" +"DSD" +"DSS",new Vector2f( 6 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
    ht.put("DSS" +"DSD" +"DDD",new Vector2f( 4 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
    ht.put("SSD" +"SSD" +"SSD",new Vector2f( 5 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
    ht.put("SDD" +"SSD" +"DDD",new Vector2f( 7 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
    ht.put("DDD" +"SSS" +"SSS",new Vector2f( 4 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
   
   
    ht.put("SSD" +"DSD" +"DSD",new Vector2f( 6 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
    ht.put("DSS" +"DSS" +"DSD",new Vector2f( 4 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
    ht.put("DSD" +"DSS" +"DSS",new Vector2f( 7 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
    ht.put("DSS" +"DSS" +"DSS",new Vector2f( 4 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
    ht.put("SSD" +"SSS" +"DDS",new Vector2f( 7 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));

    // RIGHT EDGE
    ht.put("SSD" +
         "SSD" +
         "SSD",
        new Vector2f( 2 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
    ht.put("SSS" +"SSD" +"SSS",new Vector2f( 2 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));

   
    ht.put("SSD" +"SSD" +"SDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT)); // RIGHT HAND TURN
    ht.put("SSS" +"SSS" +"SSD",new Vector2f( 2 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
    ht.put("SSS" +"SSD" +"SSD",new Vector2f( 2 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));

    ht.put("SSD" +"SSD" +"DDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));// RIGHT HAND TURN
    ht.put("SSS" +"SSS" +"SDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
    ht.put("SSS" +"SSD" +"SDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));

    ht.put("SSS" +"SSD" +"DDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));

    // LEFT SMALL
    ht.put("SSS" +"SSS" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));

    ht.put("SSS" +"DSS" +"DDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));

    ht.put("SSS" +"SSS" +"DDS",new Vector2f( 3 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));

   
    ht.put("DSS" +"SSS" +"SSS",new Vector2f( 0 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
    ht.put("DDS" +"SSS" +"SSS",new Vector2f( 0 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
    ht.put("DDD" +"DSS" +"SSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));

   
    //back towards right
    ht.put("DSS" +"DSS" +"DDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
    ht.put("SSS" +"DSS" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
    ht.put("DSS" +"DSS" +"DDS",new Vector2f( 3 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));

   
    ht.put("DDS" +"DSS" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
    ht.put("DSS" +"DSS" +"SSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));

   
    ht.put("DDD" +"SSD" +"SSS",new Vector2f( 2 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
    ht.put("SSD" +"SSS" +"SSS",new Vector2f( 0 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
    ht.put("SDD" +"SSS" +"SSS",new Vector2f( 0 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));

    ht.put("DDD" +"DSS" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));

    ht.put("DDS" +"DSS" +"SSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));

    ht.put("SSS" +"DSS" +"DDS",new Vector2f( 3 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));

    ht.put("SSD" +"SSD" +"SSS",new Vector2f( 2 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));

    ht.put("DDD" +"SSD" +"SSD",new Vector2f( 2 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
    ht.put("SDD" +"SSD" +"SSD",new Vector2f( 2 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
    ht.put("SDD" +"SSD" +"SSS",new Vector2f( 2 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));

   
    ht.put("SSD" +"SSS" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
    ht.put("SSD" +"SSD" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));

    ht.put("SSD" +"DSS" +"DDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));

    ht.put("SDD" +"SSS" +"DDS",new Vector2f( 3 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
    ht.put("DDD" +"SSD" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));

    ht.put("SSD" +"DSS" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));

   
    // BOTTOM EDGE
    ht.put("SSS" +
         "SSS" +
         "DDD",
        new Vector2f( 3 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
   
    // LEFT EDGE
    ht.put("DSS" +
         "DSS" +
         "DSS",
         new Vector2f( 1 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
    ht.put("SSS" +"DSS" +"SSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));

    // TOP EDGE
    ht.put("DDD" +
         "SSS" +
         "SSS",
        new Vector2f( 0 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
    ht.put("SDS" +"SSS" +"SSS",new Vector2f( 0 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));

    // corner A
  /*  ht.put( "SSD" +
        "SSD" +
        "SDD",
        new Vector2f( 2 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));

    // corner (above A)
    ht.put( "SSS" +
        "SSD" +
        "SSD",
        new Vector2f( 2 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));

    ht.put( "SSD" +
        "SSD" +
        "DDD",
        new Vector2f( 2 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));

    ht.put( "DDSSSSSSS" +
        "" +
        "",
        new Vector2f( 6 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
*/



    /*
     *
     *
     * SSSSSSSSD
SSDSSDDDD
DDSSSSSSS

     */
   
  }
TOP

Related Classes of edu.ups.gamedev.terrain.tile.TileMap

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.