Square or Hexagon Cell
- allows to select between square and hexagon representation - remark : this is still a square model
This commit is contained in:
@@ -4,6 +4,7 @@ import org.artisanlogiciel.games.maze.LabyModel;
|
|||||||
import org.artisanlogiciel.games.maze.Maze;
|
import org.artisanlogiciel.games.maze.Maze;
|
||||||
import org.artisanlogiciel.games.maze.MazeParams;
|
import org.artisanlogiciel.games.maze.MazeParams;
|
||||||
import org.artisanlogiciel.games.maze.MazeParamsFixed;
|
import org.artisanlogiciel.games.maze.MazeParamsFixed;
|
||||||
|
import org.artisanlogiciel.games.maze.model.WidthHeightProvider;
|
||||||
import org.artisanlogiciel.games.maze.persist.MazePersistRaw;
|
import org.artisanlogiciel.games.maze.persist.MazePersistRaw;
|
||||||
import org.artisanlogiciel.games.maze.solve.SolvingModel;
|
import org.artisanlogiciel.games.maze.solve.SolvingModel;
|
||||||
import org.artisanlogiciel.graphics.Drawing;
|
import org.artisanlogiciel.graphics.Drawing;
|
||||||
@@ -50,7 +51,7 @@ implements StatusListener
|
|||||||
|
|
||||||
boolean statusEnable = true;
|
boolean statusEnable = true;
|
||||||
boolean mGrow = false;
|
boolean mGrow = false;
|
||||||
boolean mHexagon = false;
|
|
||||||
|
|
||||||
JTextField statusField = null;
|
JTextField statusField = null;
|
||||||
|
|
||||||
@@ -58,11 +59,19 @@ implements StatusListener
|
|||||||
|
|
||||||
MazeFrame mazeFrame;
|
MazeFrame mazeFrame;
|
||||||
|
|
||||||
|
WidthHeightProvider frameSize = null;
|
||||||
|
|
||||||
|
public void setHexagon(boolean hexagon) {
|
||||||
|
addStatus(hexagon ? "hexagon" : "square");
|
||||||
|
maze.resetCellRenderer(hexagon, frameSize);
|
||||||
|
}
|
||||||
|
|
||||||
private class MazeFrame extends JFrame
|
private class MazeFrame extends JFrame
|
||||||
{
|
{
|
||||||
MazeFrame(LabyModel model, int W, int H, MazeParams params) {
|
MazeFrame(LabyModel model, WidthHeightProvider frame, MazeParams params) {
|
||||||
super(MazeDefault.labels.getString("title"));
|
super(MazeDefault.labels.getString("title"));
|
||||||
maze = createMazeComponent(model, W, H);
|
frameSize = frame;
|
||||||
|
maze = createMazeComponent(model, frame);
|
||||||
|
|
||||||
Container con = this.getContentPane();
|
Container con = this.getContentPane();
|
||||||
JScrollPane scrollableMaze = new JScrollPane(maze);
|
JScrollPane scrollableMaze = new JScrollPane(maze);
|
||||||
@@ -85,26 +94,25 @@ implements StatusListener
|
|||||||
|
|
||||||
model.setMazeListener(maze);
|
model.setMazeListener(maze);
|
||||||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||||
setBounds(W, H, W, H);
|
setBounds(frame.getWidth(), frame.getHeight(), frame.getWidth(), frame.getHeight());
|
||||||
setVisible(true);
|
setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Display(LabyModel model, int W, int H, MazeParams params)
|
public Display(LabyModel model, WidthHeightProvider frame, MazeParams params)
|
||||||
{
|
{
|
||||||
super(model);
|
super(model);
|
||||||
mazeFrame = new MazeFrame(model,W,H,params);
|
mazeFrame = new MazeFrame(model, frame,params);
|
||||||
if (params != null) {
|
if (params != null) {
|
||||||
// fixedParams = new MazeParamsFixed(params.getSaveDir(),params.getWidth(),params.getHeight(),params.getMaxDepth());
|
// fixedParams = new MazeParamsFixed(params.getSaveDir(),params.getWidth(),params.getHeight(),params.getMaxDepth());
|
||||||
this.params = params;
|
this.params = params;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private MazeComponent createMazeComponent(LabyModel model, int W, int H) {
|
private MazeComponent createMazeComponent(LabyModel model, WidthHeightProvider frame) {
|
||||||
|
|
||||||
MazeCellRenderer cp = mHexagon ? new HexagonCellRenderer(model.getWidth(), model.getHeight(), W, H, 0, 0) : new MazeCellRenderer(model.getWidth(), model.getHeight(), W, H, 0, 0);
|
MazeComponent comp = new MazeComponent(model, frame , this);
|
||||||
MazeComponent comp = new MazeComponent(model, cp, this);
|
|
||||||
Xpm xpm = new Xpm();
|
Xpm xpm = new Xpm();
|
||||||
try {
|
try {
|
||||||
xpm.parse(new FileInputStream(MazeDefault.getInstance().getXpmBackground()));
|
xpm.parse(new FileInputStream(MazeDefault.getInstance().getXpmBackground()));
|
||||||
@@ -226,8 +234,8 @@ implements StatusListener
|
|||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setupDisplay(LabyModel model, int W, int H, MazeParams params) {
|
private static void setupDisplay(LabyModel model, WidthHeightProvider frame, MazeParams params) {
|
||||||
Display display = new Display(model, W, H, params);
|
Display display = new Display(model, frame, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -251,8 +259,17 @@ implements StatusListener
|
|||||||
|
|
||||||
public static void main(String pArgs[]) {
|
public static void main(String pArgs[]) {
|
||||||
LabyModel model = null;
|
LabyModel model = null;
|
||||||
int W = 600;
|
WidthHeightProvider frame = new WidthHeightProvider() {
|
||||||
int H = 400;
|
@Override
|
||||||
|
public int getWidth() {
|
||||||
|
return 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getHeight() {
|
||||||
|
return 400;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
System.out.println("Default Locale " + Locale.getDefault());
|
System.out.println("Default Locale " + Locale.getDefault());
|
||||||
|
|
||||||
@@ -264,12 +281,12 @@ implements StatusListener
|
|||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
setupDisplay(model, W, H, null);
|
setupDisplay(model, frame, null);
|
||||||
} else {
|
} else {
|
||||||
MazeParamsFixed params = new MazeParamsFixed(MazeDefault.getInstance().getParams());
|
MazeParamsFixed params = new MazeParamsFixed(MazeDefault.getInstance().getParams());
|
||||||
model = new LabyModel(params);
|
model = new LabyModel(params);
|
||||||
|
|
||||||
setupDisplay(model, W, H, params);
|
setupDisplay(model, frame, params);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
model.generateWithEntry(0, 0);
|
model.generateWithEntry(0, 0);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package org.artisanlogiciel.games.maze.gui;
|
package org.artisanlogiciel.games.maze.gui;
|
||||||
|
|
||||||
import org.artisanlogiciel.games.maze.Brick;
|
import org.artisanlogiciel.games.maze.Brick;
|
||||||
|
import org.artisanlogiciel.games.maze.model.WidthHeightProvider;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
|
||||||
@@ -13,15 +14,16 @@ public class HexagonCellRenderer
|
|||||||
extends MazeCellRenderer
|
extends MazeCellRenderer
|
||||||
{
|
{
|
||||||
public final static int SUBCELL = 4;
|
public final static int SUBCELL = 4;
|
||||||
|
public final static int SUBCELLY = 3;
|
||||||
|
|
||||||
public HexagonCellRenderer(int mapw, int maph, int W, int H, int x, int y) {
|
public HexagonCellRenderer(WidthHeightProvider model, WidthHeightProvider frame, int x, int y) {
|
||||||
super(mapw, maph, W, H, x, y);
|
super(model, frame, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawLine(Graphics g, int refx, int refy, int x, int y, int a, int b) {
|
void drawLine(Graphics g, int refx, int refy, int x, int y, int a, int b) {
|
||||||
g.drawLine(
|
g.drawLine(
|
||||||
(int) ((refx + x) * getWidth() / SUBCELL), (int) ((refy + y) * getHeight() / SUBCELL),
|
(int) ((refx + x) * width / SUBCELL), (int) ((refy + y) * height / SUBCELL),
|
||||||
(int) ((refx + a) * getWidth() / SUBCELL),(int) ((refy + b) * getHeight() / SUBCELL));
|
(int) ((refx + a) * width / SUBCELL),(int) ((refy + b) * height / SUBCELL));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -87,4 +89,8 @@ extends MazeCellRenderer
|
|||||||
// E : (4,3) - (4,1)
|
// E : (4,3) - (4,1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getHeight() {
|
||||||
|
return height * SUBCELLY / SUBCELL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package org.artisanlogiciel.games.maze.gui;
|
|||||||
import org.artisanlogiciel.games.maze.Brick;
|
import org.artisanlogiciel.games.maze.Brick;
|
||||||
import org.artisanlogiciel.games.maze.LabyModel;
|
import org.artisanlogiciel.games.maze.LabyModel;
|
||||||
import org.artisanlogiciel.games.maze.Position;
|
import org.artisanlogiciel.games.maze.Position;
|
||||||
|
import org.artisanlogiciel.games.maze.model.WidthHeightProvider;
|
||||||
import org.artisanlogiciel.games.maze.solve.DirectionPosition;
|
import org.artisanlogiciel.games.maze.solve.DirectionPosition;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
@@ -18,17 +19,16 @@ public class MazeCellRenderer {
|
|||||||
double width; // width of one cell in pixels
|
double width; // width of one cell in pixels
|
||||||
double height; // height of one cell in pixels
|
double height; // height of one cell in pixels
|
||||||
|
|
||||||
public MazeCellRenderer(int mapw, int maph, int W, int H, int x, int y) {
|
public MazeCellRenderer(WidthHeightProvider model, WidthHeightProvider frame, int x, int y) {
|
||||||
mapWidth = mapw;
|
resetMazeWidthHeight(model);
|
||||||
mapHeight = maph;
|
|
||||||
offsetX = x;
|
offsetX = x;
|
||||||
offsetY = y;
|
offsetY = y;
|
||||||
adaptTo(W,H);
|
adaptTo(frame.getWidth(), frame.getHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resetMazeWidthHeight(int mapw, int maph) {
|
public void resetMazeWidthHeight(WidthHeightProvider model) {
|
||||||
mapWidth = mapw;
|
mapWidth = model.getWidth();
|
||||||
mapHeight = maph;
|
mapHeight = model.getHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void adaptTo(double W, double H) {
|
public void adaptTo(double W, double H) {
|
||||||
@@ -108,30 +108,31 @@ public class MazeCellRenderer {
|
|||||||
if (dp != null) {
|
if (dp != null) {
|
||||||
boolean arrow = true;
|
boolean arrow = true;
|
||||||
Position dot = dp.getPosition();
|
Position dot = dp.getPosition();
|
||||||
|
double h = getHeight();
|
||||||
if ((dot.getX() >= pX) && (dot.getY() >= pY) && (dot.getX() < mX) && (dot.getY() < mY)) {
|
if ((dot.getX() >= pX) && (dot.getY() >= pY) && (dot.getX() < mX) && (dot.getY() < mY)) {
|
||||||
int x = offsetX + (int) (dot.getX() * width);
|
int x = offsetX + (int) (dot.getX() * width);
|
||||||
int y = offsetY + (int) (dot.getY() * height);
|
int y = offsetY + (int) (dot.getY() * h);
|
||||||
short path = dp.getDirection();
|
short path = dp.getDirection();
|
||||||
int xm = x + (int) (width / 2);
|
int xm = x + (int) (width / 2);
|
||||||
int ym = y + (int) (height / 2);
|
int ym = y + (int) (h / 2);
|
||||||
if (LabyModel.isFlagSet(path,LabyModel.HORIZONTAL)) {
|
if (LabyModel.isFlagSet(path,LabyModel.HORIZONTAL)) {
|
||||||
if (LabyModel.isFlagSet(path, LabyModel.POSITIVE)) {
|
if (LabyModel.isFlagSet(path, LabyModel.POSITIVE)) {
|
||||||
g.drawLine(xm, ym - (int) (height / 4), x + (int) width, ym);
|
g.drawLine(xm, ym - (int) (h / 4), x + (int) width, ym);
|
||||||
if (arrow ) g.drawLine(xm, ym, x + (int) width, ym);
|
if (arrow ) g.drawLine(xm, ym, x + (int) width, ym);
|
||||||
g.drawLine(xm, ym + (int) (height / 4), x + (int) width, ym);
|
g.drawLine(xm, ym + (int) (h / 4), x + (int) width, ym);
|
||||||
}
|
}
|
||||||
// LEFT /_
|
// LEFT /_
|
||||||
if (LabyModel.isFlagSet(path,LabyModel.NEGATIVE)) {
|
if (LabyModel.isFlagSet(path,LabyModel.NEGATIVE)) {
|
||||||
g.drawLine(x, ym, xm, ym + (int) (height / 4));
|
g.drawLine(x, ym, xm, ym + (int) (h / 4));
|
||||||
if (arrow) g.drawLine(x, ym, xm, ym);
|
if (arrow) g.drawLine(x, ym, xm, ym);
|
||||||
g.drawLine(x, ym, xm, ym - (int) (height / 4));
|
g.drawLine(x, ym, xm, ym - (int) (h / 4));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (LabyModel.isFlagSet(path,LabyModel.VERTICAL)) {
|
if (LabyModel.isFlagSet(path,LabyModel.VERTICAL)) {
|
||||||
if (LabyModel.isFlagSet(path ,LabyModel.POSITIVE)) {
|
if (LabyModel.isFlagSet(path ,LabyModel.POSITIVE)) {
|
||||||
g.drawLine(xm + (int) (width / 4), ym, xm, y + (int) height);
|
g.drawLine(xm + (int) (width / 4), ym, xm, y + (int) h);
|
||||||
if (arrow) g.drawLine(xm, ym, xm, y + (int) height);
|
if (arrow) g.drawLine(xm, ym, xm, y + (int) height);
|
||||||
g.drawLine(xm - (int) (width / 4), ym, xm, y + (int) height);
|
g.drawLine(xm - (int) (width / 4), ym, xm, y + (int) h);
|
||||||
}
|
}
|
||||||
// UP |\
|
// UP |\
|
||||||
if (LabyModel.isFlagSet(path,LabyModel.NEGATIVE)) {
|
if (LabyModel.isFlagSet(path,LabyModel.NEGATIVE)) {
|
||||||
@@ -145,11 +146,12 @@ public class MazeCellRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void drawDot(Graphics g, Position dot, int pX, int pY, int mX, int mY) {
|
public void drawDot(Graphics g, Position dot, int pX, int pY, int mX, int mY) {
|
||||||
double radius = (height > width) ? width : height;
|
double h = getHeight();
|
||||||
|
double radius = (h > width) ? width : h;
|
||||||
int a = (int) (radius / 4);
|
int a = (int) (radius / 4);
|
||||||
if ((dot.getX() >= pX) && (dot.getY() >= pY) && (dot.getX() < mX) && (dot.getY() < mY)) {
|
if ((dot.getX() >= pX) && (dot.getY() >= pY) && (dot.getX() < mX) && (dot.getY() < mY)) {
|
||||||
int x = offsetX + (int) (dot.getX() * width);
|
int x = offsetX + (int) (dot.getX() * width);
|
||||||
int y = offsetY + (int) (dot.getY() * height);
|
int y = offsetY + (int) (dot.getY() * h);
|
||||||
int r2 = (int) radius ; //(int) ((radius * 3) / 4);
|
int r2 = (int) radius ; //(int) ((radius * 3) / 4);
|
||||||
g.drawOval(x, y, r2, r2);
|
g.drawOval(x, y, r2, r2);
|
||||||
// g.drawLine(x+a,y+a,x+width-a,y+height-a);
|
// g.drawLine(x+a,y+a,x+width-a,y+height-a);
|
||||||
@@ -157,8 +159,8 @@ public class MazeCellRenderer {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
int x = offsetX + (int) (pX * width);
|
int x = offsetX + (int) (pX * width);
|
||||||
int y = offsetY + (int) (pY * height);
|
int y = offsetY + (int) (pY * h);
|
||||||
g.drawLine(x + 1, y + 1, x + (int) width - 1, y + (int) height - 1);
|
g.drawLine(x + 1, y + 1, x + (int) width - 1, y + (int) h - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.artisanlogiciel.games.maze.gui;
|
|||||||
|
|
||||||
import org.artisanlogiciel.games.maze.*;
|
import org.artisanlogiciel.games.maze.*;
|
||||||
import org.artisanlogiciel.games.maze.model.LabyModelProvider;
|
import org.artisanlogiciel.games.maze.model.LabyModelProvider;
|
||||||
|
import org.artisanlogiciel.games.maze.model.WidthHeightProvider;
|
||||||
import org.artisanlogiciel.games.maze.solve.DirectionPosition;
|
import org.artisanlogiciel.games.maze.solve.DirectionPosition;
|
||||||
import org.artisanlogiciel.games.maze.solve.MazeResolutionListener;
|
import org.artisanlogiciel.games.maze.solve.MazeResolutionListener;
|
||||||
import org.artisanlogiciel.graphics.Drawing;
|
import org.artisanlogiciel.graphics.Drawing;
|
||||||
@@ -27,7 +28,7 @@ public class MazeComponent
|
|||||||
private static final long serialVersionUID = 3163272907991176390L;
|
private static final long serialVersionUID = 3163272907991176390L;
|
||||||
|
|
||||||
LabyModelProvider map;
|
LabyModelProvider map;
|
||||||
final MazeCellRenderer cp;
|
MazeCellRenderer cp;
|
||||||
Position current = null;
|
Position current = null;
|
||||||
LinkedList<DirectionPosition> solvedPath = null;
|
LinkedList<DirectionPosition> solvedPath = null;
|
||||||
LinkedList<DirectionPosition> drawingPath = null;
|
LinkedList<DirectionPosition> drawingPath = null;
|
||||||
@@ -51,6 +52,14 @@ public class MazeComponent
|
|||||||
|
|
||||||
StatusListener statusListener;
|
StatusListener statusListener;
|
||||||
|
|
||||||
|
MazeCellRenderer createCellRenderer(boolean hexagon, WidthHeightProvider model, WidthHeightProvider frame)
|
||||||
|
{
|
||||||
|
MazeCellRenderer cellRenderer = hexagon ?
|
||||||
|
new HexagonCellRenderer(model, frame, 0, 0)
|
||||||
|
: new MazeCellRenderer(model, frame, 0, 0);
|
||||||
|
return cellRenderer;
|
||||||
|
}
|
||||||
|
|
||||||
MazeColorMap colorMap = new MazeColorMap(Color.white, Color.black, Color.blue, Color.green, Color.red);
|
MazeColorMap colorMap = new MazeColorMap(Color.white, Color.black, Color.blue, Color.green, Color.red);
|
||||||
|
|
||||||
public class MazeColorMap
|
public class MazeColorMap
|
||||||
@@ -216,17 +225,22 @@ public class MazeComponent
|
|||||||
* offsetX, offsetY of upper left corner
|
* offsetX, offsetY of upper left corner
|
||||||
**/
|
**/
|
||||||
// public MazeComponent(WallsProvider map, MazeCellParameters cp)
|
// public MazeComponent(WallsProvider map, MazeCellParameters cp)
|
||||||
public MazeComponent(LabyModel map, MazeCellRenderer cp, StatusListener statusListener) {
|
public MazeComponent(LabyModel map, WidthHeightProvider frame, StatusListener statusListener) {
|
||||||
super();
|
super();
|
||||||
this.cp = cp;
|
|
||||||
this.map = map;
|
this.map = map;
|
||||||
setPreferredSize(cp.getDimension());
|
|
||||||
gX = map.getWidth() - 1;
|
gX = map.getWidth() - 1;
|
||||||
gY = map.getHeight() - 1;
|
gY = map.getHeight() - 1;
|
||||||
|
resetCellRenderer(false,frame);
|
||||||
this.statusListener = statusListener;
|
this.statusListener = statusListener;
|
||||||
addMouseMotionListener(this);
|
addMouseMotionListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void resetCellRenderer(boolean hexagon, WidthHeightProvider frame)
|
||||||
|
{
|
||||||
|
cp = createCellRenderer(hexagon,map,frame);
|
||||||
|
setPreferredSize(cp.getDimension());
|
||||||
|
}
|
||||||
|
|
||||||
// public void resetWallsProvider(WallsProvider map)
|
// public void resetWallsProvider(WallsProvider map)
|
||||||
public void resetWallsProvider(LabyModel map) {
|
public void resetWallsProvider(LabyModel map) {
|
||||||
this.map = map;
|
this.map = map;
|
||||||
@@ -235,7 +249,7 @@ public class MazeComponent
|
|||||||
drawingPath = null;
|
drawingPath = null;
|
||||||
sX = 0;
|
sX = 0;
|
||||||
sY = 0;
|
sY = 0;
|
||||||
cp.resetMazeWidthHeight(map.getWidth(), map.getHeight());
|
cp.resetMazeWidthHeight(map);
|
||||||
setPreferredSize(cp.getDimension());
|
setPreferredSize(cp.getDimension());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -388,11 +388,18 @@ public class MazeControler extends JPanel {
|
|||||||
display.setAutoSize(autoSlide.isSelected());
|
display.setAutoSize(autoSlide.isSelected());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
final JCheckBox hexagon = new JCheckBox("hexagon");
|
||||||
|
hexagon.addChangeListener(new ChangeListener() {
|
||||||
|
public void stateChanged(ChangeEvent e) {
|
||||||
|
display.setHexagon(hexagon.isSelected());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
JPanel resizecontrol = new JPanel(new FlowLayout());
|
JPanel resizecontrol = new JPanel(new FlowLayout());
|
||||||
resizecontrol.add(showAll);
|
resizecontrol.add(showAll);
|
||||||
resizecontrol.add(slider);
|
resizecontrol.add(slider);
|
||||||
resizecontrol.add(autoSlide);
|
resizecontrol.add(autoSlide);
|
||||||
|
resizecontrol.add(hexagon);
|
||||||
|
|
||||||
return resizecontrol;
|
return resizecontrol;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user