comparison 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
comparison
equal deleted inserted replaced
0:f930f72ed0f5 1:44f1e7b47fcf
1 /*
2 * Ristipolku
3 * (C) Copyright 2011 Matti 'ccr' Hämäläinen <ccr@tnsp.org>
4 *
5 * Ohjelmointiprojekti Java-kurssille.
6 */
7 package game;
8
9 import java.awt.*;
10 import java.awt.geom.*;
11 import java.awt.event.*;
12 import javax.swing.*;
13 import java.util.*;
14
15
16 public class Piece
17 {
18 static final int numConnections = 8;
19 static final int minRotation = 0;
20 static final int maxRotation = 3;
21 int currRotation;
22 int[] connections;
23 PieceType type, oldType;
24
25 boolean rotationChanged, rotationActive,
26 typeChanged, typeActive;
27 double currAngle, newAngle;
28
29
30 public Piece(PieceType ptype)
31 {
32 // Initialize
33 connections = new int[numConnections];
34 type = ptype;
35
36 rotationChanged = false;
37 typeChanged = false;
38 rotationActive = false;
39 typeActive = false;
40
41
42 currRotation = 0;
43
44 // Initialize connections between endpoints of the paths inside the piece
45 for (int i = 0; i < numConnections; i++)
46 connections[i] = -1;
47
48 Random rnd = new Random();
49 for (int i = 0; i < numConnections; i++)
50 {
51 int tmp = rnd.nextInt(numConnections);
52 if (connections[tmp] < 0 && connections[i] < 0)
53 {
54 connections[i] = tmp;
55 connections[tmp] = i;
56 }
57 }
58 }
59
60 public Piece()
61 {
62 this(PieceType.NONE);
63 }
64
65 public void setType(PieceType ptype)
66 {
67 oldType = type;
68 type = ptype;
69 }
70
71 public int getConnection(int in)
72 {
73 return connections[in];
74 }
75
76 public void rotate(boolean dir)
77 {
78 if (type != PieceType.NORMAL)
79 return;
80
81 newRotation = currRotation + (dir ? 1 : -1);
82
83 if (newRotation < minRotation)
84 newRotation = maxRotation;
85 else if (currRotation > maxRotation)
86 newRotation = minRotation;
87
88 rotationDir = dir;
89 rotationChanged = true;
90 }
91
92 public Point2D getPoint(double x, double y, double dim, int index)
93 {
94 double ox = 0, oy = 0;
95 double step = dim / 10;
96
97 switch (index) {
98 case 0: ox = 3.0f; oy = 0.5f; break;
99 case 1: ox = 7.0f; oy = 0.5f; break;
100 case 2: ox = 9.5f; oy = 3.0f; break;
101 case 3: ox = 9.5f; oy = 7.0f; break;
102 case 4: ox = 7.0f; oy = 9.5f; break;
103 case 5: ox = 3.0f; oy = 9.5f; break;
104 case 6: ox = 0.5f; oy = 7.0f; break;
105 case 7: ox = 0.5f; oy = 3.0f; break;
106
107 case -1: ox = 5; oy = 5; break;
108 }
109
110 return new Point2D.Double(x + ox * step, y + oy * step);
111 }
112
113 public void animate(double time)
114 {
115 if (rotationChanged)
116 {
117 rotationTime = time;
118 rotationActive = true;
119 }
120
121 if (rotationActive)
122 {
123 double t = time - rotationTime;
124 rotationAngle =
125 }
126
127 }
128
129 public void paint(Graphics2D g, double x, double y, double dim)
130 {
131 AffineTransform save = g.getTransform();
132
133 g.setStroke(new BasicStroke(4.0f));
134
135 switch (type) {
136 case NORMAL: g.setPaint(Color.green); break;
137 case ACTIVE: g.setPaint(Color.red); break;
138 case START: g.setPaint(Color.orange); break;
139 }
140
141 AffiineTransform tf = new AffineTransform();
142 tf.rotate(Math.toRadians(rotationAngle));
143 g.transform(tf);
144 g.fill(new RoundRectangle2D.Double(x, y, dim, dim, dim / 10, dim / 10));
145
146 g.setPaint(Color.black);
147 g.setStroke(new BasicStroke(4.0f));
148 g.draw(new RoundRectangle2D.Double(x, y, dim, dim, dim / 10, dim / 10));
149
150 if (type == PieceType.START)
151 return;
152
153 g.setStroke(new BasicStroke(6.0f));
154 // CubicCurve2D c = new CubicCurve2D.Double();
155 QuadCurve2D c = new QuadCurve2D.Double();
156
157 for (int i = 0; i < numConnections / 2; i++)
158 {
159 Point2D start, cp1, cp2, end;
160
161 start = getPoint(x, y, dim, i);
162 end = getPoint(x, y, dim, connections[i]);
163
164 // cp1 = getPoint(x, y, dim, (i + 4) % 8);
165 // cp2 = getPoint(x, y, dim, (connections[i] + 4) % 8);
166 cp1 = getPoint(x, y, dim, -1);
167
168 c.setCurve(start, cp1, end);
169 g.draw(c);
170 }
171
172 g.setTransform(save);
173 }
174 }