Skip to content

Instantly share code, notes, and snippets.

@Geolykt
Created October 9, 2022 14:20
Show Gist options
  • Save Geolykt/62078a1041fe9390a2b317122614f5e4 to your computer and use it in GitHub Desktop.
Save Geolykt/62078a1041fe9390a2b317122614f5e4 to your computer and use it in GitHub Desktop.
package render.tile.geom;
public class DimetricGeometry implements Geometry {
private static final int TILE_WIDTH = 64;
private static final int TILE_HEIGHT = 31;
@Override
public void render(int centerX, int centerY, float screenWidth, float screenHeight, float screenOffsetX, float screenOffsetY, float zoomFactor, GeometryTileVisitor visitor) {
final float actualHeight = TILE_HEIGHT * zoomFactor;
final float actualWidth = TILE_WIDTH * zoomFactor;
final int upTiles = (int) (screenHeight / 2 / actualHeight + 2 / zoomFactor) + 2;
final int leftTiles = (int) (screenWidth / 2 / actualWidth + 2 / zoomFactor) + 2;
// for the upper left corner
final int diagonalTilesX = upTiles + leftTiles;
final int diagonalTilesY = upTiles - leftTiles;
screenOffsetX += screenWidth / 2; // Geolykt being lazy
screenOffsetY += screenHeight / 2;
int x = diagonalTilesX;
int y = diagonalTilesY;
int i = 0;
while (x != -diagonalTilesY && y != -diagonalTilesX) {
while (x != (diagonalTilesY - i + 1) && y != (diagonalTilesX - i + 1)) {
// A strange little trick: By altering the render height here we can get some funky behaviour
float renderX = screenOffsetX + (y - x) * (actualWidth / 2);
float renderY = screenOffsetY + (y + x) * (actualHeight / 2);
visitor.visit(centerX + x, centerY + y, renderX, renderY);
x--;
renderX = screenOffsetX + (y - x) * (actualWidth / 2);
renderY = screenOffsetY + (y + x) * (actualHeight / 2);
visitor.visit(centerX + x, centerY + y, renderX, renderY);
y++;
}
x = diagonalTilesX - i;
y = diagonalTilesY - i;
i++;
}
}
@Override
public int getBaseTileRenderHeight() {
return TILE_HEIGHT;
}
@Override
public int getBaseTileRenderWidth() {
return TILE_WIDTH;
}
@Override
public void readjustScreenOffset() {
float actualTileWidth = TILE_WIDTH * Game.zoomFactor;
int moveLeft = (int) (Game.screenRenderOffsetX / actualTileWidth);
Game.screenRenderOffsetX %= actualTileWidth;
Game.rtileX += moveLeft;
Game.rtileY -= moveLeft;
float actualTileHeight = TILE_HEIGHT * Game.zoomFactor;
int moveUp = (int) (Game.screenRenderOffsetY / actualTileHeight);
Game.screenRenderOffsetY %= actualTileHeight;
Game.rtileX -= moveUp;
Game.rtileY -= moveUp;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment