Mercurial > hg > ristipolku
view 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 source
/* * 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); } }