com.binarytenshi.nopassing.core.environment.StreetHandler.java Source code

Java tutorial

Introduction

Here is the source code for com.binarytenshi.nopassing.core.environment.StreetHandler.java

Source

/*
 * 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);
    }
}