- try to use more Position instead of (x,y) - create PositionWithDpeth for its specific usage in path finding - create a XYGridITerator that walk cells from grid X then Y.
90 lines
2.4 KiB
Java
90 lines
2.4 KiB
Java
package org.artisanlogiciel.games.maze.gui;
|
|
|
|
import org.artisanlogiciel.games.maze.Brick;
|
|
import org.artisanlogiciel.games.maze.Position;
|
|
import org.artisanlogiciel.games.maze.model.WidthHeightProvider;
|
|
|
|
import java.awt.*;
|
|
|
|
/**
|
|
* draw cell as an hexagon
|
|
* using a square model ( LEFT UP only).
|
|
*/
|
|
|
|
public class HexagonCellRenderer
|
|
extends MazeCellRenderer
|
|
{
|
|
public final static int SUBCELL = 4;
|
|
public final static int SUBCELLY = 3;
|
|
|
|
public HexagonCellRenderer(WidthHeightProvider model, WidthHeightProvider frame, int x, int y) {
|
|
super(model, frame, x, y);
|
|
}
|
|
|
|
void drawLine(Graphics g, Position ref, int x, int y, int a, int b) {
|
|
g.drawLine(
|
|
(int) ((ref.getX() + x) * width / SUBCELL), (int) ((ref.getY() + y) * height / SUBCELL),
|
|
(int) ((ref.getX() + a) * width / SUBCELL),(int) ((ref.getY() + b) * height / SUBCELL));
|
|
}
|
|
|
|
@Override
|
|
public void drawBackground(Graphics g, Position cell, short walls) {
|
|
UV uv= new UV(cell);
|
|
int x = offsetX + (int) (uv.getX() * width / SUBCELL);
|
|
int y = offsetY + (int) (uv.getY() * height / SUBCELL);
|
|
Color savecolor = g.getColor();
|
|
int greylevel = walls << 2;
|
|
g.setColor(getGreyedColor(savecolor,greylevel));
|
|
//g.fillRect(x+1,y+1,((int)width) -1,((int)height) - 1);
|
|
g.fillRect(x,y,((int)width),((int)height));
|
|
}
|
|
|
|
class UV
|
|
extends Position
|
|
{
|
|
int u;
|
|
int v;
|
|
|
|
UV(Position p)
|
|
{
|
|
super(p);
|
|
u=p.getX();
|
|
v=p.getY();
|
|
setX(u*4 + 2*(v%2));
|
|
setY(3*v);
|
|
}
|
|
|
|
}
|
|
|
|
@Override
|
|
public void drawWalls(Graphics g, Position cell, short walls) {
|
|
drawHalfNW(g, cell, walls);
|
|
}
|
|
|
|
void drawHalfNW(Graphics g, Position cell, short walls)
|
|
{
|
|
UV uv= new UV(cell);
|
|
// NW : (0,1) - (2,0)
|
|
if (Brick.isFlagSet( Brick.UP, walls))
|
|
drawLine(g,uv, 0,1,2,0);
|
|
// W : (0,1) - (0,3)
|
|
if (Brick.isFlagSet( Brick.LEFT, walls))
|
|
drawLine(g,uv,0,1,0,3);
|
|
// NE : (2,0) - (4,1)
|
|
// if (Brick.isFlagSet( Brick.NE, walls))
|
|
drawLine(g,uv,2,0,4,1);
|
|
}
|
|
|
|
void drawHalfSW(Graphics g)
|
|
{
|
|
// SW : (0,3) - (2,4)
|
|
// SE : (2,4) - (4,3)
|
|
// E : (4,3) - (4,1)
|
|
}
|
|
|
|
@Override
|
|
public double getHeight() {
|
|
return height * SUBCELLY / SUBCELL;
|
|
}
|
|
}
|