/*
* Copyright 2013 MicaByte Systems
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.micabytes.map;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import com.micabytes.gfx.SurfaceRenderer;
import com.micabytes.util.GameLog;
/**
* TileMap superclass
*/
@SuppressWarnings({"unused", "AbstractClassNeverImplemented"})
public abstract class TileMap {
private static int mapWidth;
private static int mapHeight;
private TileMapZone[][] zones;
private Rect tileRect;
private final Point viewPortOrigin = new Point();
private final Point viewPortSize = new Point();
@SuppressWarnings("AssignmentToStaticFieldFromInstanceMethod")
public void setTileMap(TileMapZone[][] map) {
zones = new TileMapZone[map.length][map[0].length];
for (int i = 0; i < map.length; i++) {
System.arraycopy(map[i], 0, zones[i], 0, map[i].length);
}
mapHeight = map[0].length;
mapWidth = map.length;
tileRect = new Rect(0, 0, map[0][0].getWidth(), map[0][0].getHeight());
}
public int getRenderHeight() {
return mapHeight * tileRect.height();
}
public int getRenderWidth() {
return mapWidth * tileRect.width();
}
public int getTileHeight() {
return tileRect.height();
}
public int getTileWidth() {
return tileRect.width();
}
@SuppressWarnings({"MethodWithMultipleLoops", "NumericCastThatLosesPrecision"})
public void drawBase(Context context, SurfaceRenderer.ViewPort p) {
if (p.getBitmap() == null) {
GameLog.e("TileMap", "Viewport bitmap is null in TileMap");
return;
}
Canvas canvas = new Canvas(p.getBitmap());
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
float scaleFactor = p.getZoom();
int tileSize = tileRect.width();
p.getOrigin(viewPortOrigin);
p.getSize(viewPortSize);
int windowLeft = viewPortOrigin.x;
int windowTop = viewPortOrigin.y;
int windowRight = viewPortOrigin.x + viewPortSize.x;
int windowBottom = viewPortOrigin.y + viewPortSize.y;
Rect destRect = new Rect();
// Clip tiles not in view
int iMn = windowLeft / tileSize;
if (iMn < 0) iMn = 0;
int jMn = windowTop / tileSize;
if (jMn < 0) jMn = 0;
int iMx = (windowRight / tileSize) + 1;
if (iMx >= mapWidth) iMx = mapWidth;
int jMx = (windowBottom / tileSize) + 1;
if (jMx >= mapHeight) jMx = mapHeight;
// Draw Tiles
for (int i = iMn; i < iMx; i++) {
for (int j = jMn; j < jMx; j++) {
if (zones[i][j] != null) {
destRect.left = (int) (((i * tileSize) - windowLeft) / scaleFactor);
destRect.top = (int) (((j * tileSize) - windowTop) / scaleFactor);
destRect.right = (int) ((((i * tileSize) + tileSize) - windowLeft) / scaleFactor);
destRect.bottom = (int) ((((j * tileSize) + tileSize) - windowTop) / scaleFactor);
zones[i][j].drawBase(canvas, tileRect, destRect, paint);
}
}
}
}
public abstract void drawLayer(Context context, SurfaceRenderer.ViewPort p);
public abstract void drawFinal(Context context, SurfaceRenderer.ViewPort p);
}