Created
October 9, 2022 14:20
-
-
Save Geolykt/62078a1041fe9390a2b317122614f5e4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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