Java tutorial
/* * Copyright: * This file was created by BinaryTENSHi and distributed * as part of NoPassing. * * NoPassing lies under a license which can be * found in the LICENSE file in the root directory * File created @ [26.12.2013, 19:04:40 CH timezone] */ package com.binarytenshi.nopassing.core.environment; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector2; import com.binarytenshi.nopassing.core.MapHandler; import com.binarytenshi.nopassing.lib.FileHelper; import com.binarytenshi.nopassing.lib.Path; import com.binarytenshi.nopassing.lib.TextureLib; public abstract class StreetHandler { private static boolean[][] streetMap = null; private static Texture streetTexture = null; private static Vector2 highlight; public static void initialize() { streetMap = new boolean[(int) MapHandler.getMapSize().x][(int) MapHandler.getMapSize().y]; streetTexture = new Texture(FileHelper.getFile(Path.Buildings, "street.png")); } public static void draw(SpriteBatch batch) { for (int x = 0; x < MapHandler.getMapSize().x; x++) { for (int y = 0; y < MapHandler.getMapSize().y; y++) { Sprite sprite = getSprite(x, y); if (highlight != null && highlight.x == x && highlight.y == y) { batch.setColor(1f, 1f, 1f, .5f); batch.draw(sprite, x * TextureLib.tileSide, y * TextureLib.tileSide, TextureLib.tileSide / 2, TextureLib.tileSide / 2, TextureLib.tileSide, TextureLib.tileSide, 1f, 1f, 90 - sprite.getRotation(), true); batch.setColor(1f, 1f, 1f, 1f); } if (streetMap[x][y]) { batch.draw(sprite, x * TextureLib.tileSide, y * TextureLib.tileSide, TextureLib.tileSide / 2, TextureLib.tileSide / 2, TextureLib.tileSide, TextureLib.tileSide, 1f, 1f, 90 - sprite.getRotation(), true); } } } } private static boolean getAt(int x, int y) { if (x < 0 || x >= MapHandler.getMapSize().x || y < 0 || y >= MapHandler.getMapSize().y) { return false; } return streetMap[x][y]; } private static byte getOrientation(int x, int y) { byte o = 0b0000; if (getAt(x + 1, y)) { o ^= 0b0100; } if (getAt(x - 1, y)) { o ^= 0b0001; } if (getAt(x, y + 1)) { o ^= 0b1000; } if (getAt(x, y - 1)) { o ^= 0b0010; } return o; } private static Sprite getSprite(int x, int y) { Sprite sprite = new Sprite(streetTexture, 0, 0, TextureLib.tileSide, TextureLib.tileSide); // up, right, down, left (0b0000) byte orientation = getOrientation(x, y); switch (orientation) { // DEFAULT; UP DOWN case 0b0000: case 0b1000: case 0b0010: case 0b1010: sprite.setRegion(0, 0, TextureLib.tileSide, TextureLib.tileSide); break; // LEFT RIGHT case 0b0101: case 0b0100: case 0b0001: sprite.setRegion(0, 0, TextureLib.tileSide, TextureLib.tileSide); sprite.setRotation(90f); break; // DOWN LEFT case 0b0011: sprite.setRegion(TextureLib.tileSide, 0, TextureLib.tileSide, TextureLib.tileSide); break; // RIGHT DOWN case 0b0110: sprite.setRegion(TextureLib.tileSide, 0, TextureLib.tileSide, TextureLib.tileSide); sprite.rotate(-90f); break; // UP RIGHT case 0b1100: sprite.setRegion(TextureLib.tileSide, 0, TextureLib.tileSide, TextureLib.tileSide); sprite.rotate(180f); break; // UP LEFT case 0b1001: sprite.setRegion(TextureLib.tileSide, 0, TextureLib.tileSide, TextureLib.tileSide); sprite.rotate(90f); break; // UP RIGHT DOWN case 0b1110: sprite.setRegion(0, TextureLib.tileSide, TextureLib.tileSide, TextureLib.tileSide); break; // UP RIGHT LEFT case 0b1101: sprite.setRegion(0, TextureLib.tileSide, TextureLib.tileSide, TextureLib.tileSide); sprite.rotate(-90f); break; // RIGHT DOWN LEFT case 0b0111: sprite.setRegion(0, TextureLib.tileSide, TextureLib.tileSide, TextureLib.tileSide); sprite.rotate(90f); break; // UP DOWN LEFT case 0b1011: sprite.setRegion(0, TextureLib.tileSide, TextureLib.tileSide, TextureLib.tileSide); sprite.rotate(180f); break; // UP RIGHT DOWN LEFT case 0b1111: sprite.setRegion(TextureLib.tileSide, TextureLib.tileSide, TextureLib.tileSide, TextureLib.tileSide); break; } return sprite; } public static void addRoadAt(int x, int y) { if (x < 0 || x >= MapHandler.getMapSize().x || y < 0 || y >= MapHandler.getMapSize().y) { return; } streetMap[x][y] = true; } public static void removeRoadAt(int x, int y) { if (x < 0 || x >= MapHandler.getMapSize().x || y < 0 || y >= MapHandler.getMapSize().y) { return; } streetMap[x][y] = false; } public static void highlightAt(int x, int y) { highlight = new Vector2(x, y); } }