Mercurial > hg > ristipolku
diff game/Piece.java @ 1:44f1e7b47fcf
Preliminary work ... puuh.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 28 Jan 2011 16:34:53 +0200 |
parents | |
children | 1785f66a7beb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/game/Piece.java Fri Jan 28 16:34:53 2011 +0200 @@ -0,0 +1,174 @@ +/* + * Ristipolku + * (C) Copyright 2011 Matti 'ccr' Hämäläinen <ccr@tnsp.org> + * + * Ohjelmointiprojekti Java-kurssille. + */ +package game; + +import java.awt.*; +import java.awt.geom.*; +import java.awt.event.*; +import javax.swing.*; +import java.util.*; + + +public class Piece +{ + static final int numConnections = 8; + static final int minRotation = 0; + static final int maxRotation = 3; + int currRotation; + int[] connections; + PieceType type, oldType; + + boolean rotationChanged, rotationActive, + typeChanged, typeActive; + double currAngle, newAngle; + + + public Piece(PieceType ptype) + { + // Initialize + connections = new int[numConnections]; + type = ptype; + + rotationChanged = false; + typeChanged = false; + rotationActive = false; + typeActive = false; + + + currRotation = 0; + + // Initialize connections between endpoints of the paths inside the piece + for (int i = 0; i < numConnections; i++) + connections[i] = -1; + + Random rnd = new Random(); + for (int i = 0; i < numConnections; i++) + { + int tmp = rnd.nextInt(numConnections); + if (connections[tmp] < 0 && connections[i] < 0) + { + connections[i] = tmp; + connections[tmp] = i; + } + } + } + + public Piece() + { + this(PieceType.NONE); + } + + public void setType(PieceType ptype) + { + oldType = type; + type = ptype; + } + + public int getConnection(int in) + { + return connections[in]; + } + + public void rotate(boolean dir) + { + if (type != PieceType.NORMAL) + return; + + newRotation = currRotation + (dir ? 1 : -1); + + if (newRotation < minRotation) + newRotation = maxRotation; + else if (currRotation > maxRotation) + newRotation = minRotation; + + rotationDir = dir; + rotationChanged = true; + } + + public Point2D getPoint(double x, double y, double dim, int index) + { + double ox = 0, oy = 0; + double step = dim / 10; + + switch (index) { + case 0: ox = 3.0f; oy = 0.5f; break; + case 1: ox = 7.0f; oy = 0.5f; break; + case 2: ox = 9.5f; oy = 3.0f; break; + case 3: ox = 9.5f; oy = 7.0f; break; + case 4: ox = 7.0f; oy = 9.5f; break; + case 5: ox = 3.0f; oy = 9.5f; break; + case 6: ox = 0.5f; oy = 7.0f; break; + case 7: ox = 0.5f; oy = 3.0f; break; + + case -1: ox = 5; oy = 5; break; + } + + return new Point2D.Double(x + ox * step, y + oy * step); + } + + public void animate(double time) + { + if (rotationChanged) + { + rotationTime = time; + rotationActive = true; + } + + if (rotationActive) + { + double t = time - rotationTime; + rotationAngle = + } + + } + + public void paint(Graphics2D g, double x, double y, double dim) + { + AffineTransform save = g.getTransform(); + + g.setStroke(new BasicStroke(4.0f)); + + switch (type) { + case NORMAL: g.setPaint(Color.green); break; + case ACTIVE: g.setPaint(Color.red); break; + case START: g.setPaint(Color.orange); break; + } + + AffiineTransform tf = new AffineTransform(); + tf.rotate(Math.toRadians(rotationAngle)); + g.transform(tf); + g.fill(new RoundRectangle2D.Double(x, y, dim, dim, dim / 10, dim / 10)); + + g.setPaint(Color.black); + g.setStroke(new BasicStroke(4.0f)); + g.draw(new RoundRectangle2D.Double(x, y, dim, dim, dim / 10, dim / 10)); + + if (type == PieceType.START) + return; + + g.setStroke(new BasicStroke(6.0f)); +// CubicCurve2D c = new CubicCurve2D.Double(); + QuadCurve2D c = new QuadCurve2D.Double(); + + for (int i = 0; i < numConnections / 2; i++) + { + Point2D start, cp1, cp2, end; + + start = getPoint(x, y, dim, i); + end = getPoint(x, y, dim, connections[i]); + +// cp1 = getPoint(x, y, dim, (i + 4) % 8); +// cp2 = getPoint(x, y, dim, (connections[i] + 4) % 8); + cp1 = getPoint(x, y, dim, -1); + + c.setCurve(start, cp1, end); + g.draw(c); + } + + g.setTransform(save); + } +}