Mercurial > hg > ristipolku
annotate game/Piece.java @ 37:3dc5ae9f1c80
Work on game logic.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 18 Feb 2011 04:58:30 +0200 |
parents | 6f6c551cc14c |
children | e682b623aea9 |
rev | line source |
---|---|
1 | 1 /* |
2 * Ristipolku | |
3 * (C) Copyright 2011 Matti 'ccr' Hämäläinen <ccr@tnsp.org> | |
4 */ | |
5 package game; | |
6 | |
7 import java.awt.*; | |
7 | 8 import java.awt.geom.*; |
1 | 9 import java.util.*; |
6 | 10 import java.math.*; |
1 | 11 |
12 | |
13 public class Piece | |
14 { | |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
15 public enum RotateDir { LEFT, RIGHT } |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
16 |
3 | 17 static final int numConnections = 8; |
9 | 18 static final float maxTime = 50.0f; |
19 | |
3 | 20 int currRotation; |
21 int[] connections; | |
9 | 22 boolean[] active; |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
23 PieceType type, prevType; |
1 | 24 |
3 | 25 boolean rotationChanged, rotationActive, |
9 | 26 typeChanged, typeActive, |
27 activeChanged, activeActive; | |
7 | 28 float currAngle, newAngle, rotationTime, typeTime; |
6 | 29 |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
30 float throbTime; |
7 | 31 Interpolate lerpRotation; |
1 | 32 |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
33 int point; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
34 |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
35 |
3 | 36 public Piece(PieceType ptype) |
37 { | |
38 // Initialize | |
39 connections = new int[numConnections]; | |
9 | 40 active = new boolean[numConnections]; |
3 | 41 type = ptype; |
1 | 42 |
3 | 43 rotationChanged = false; |
6 | 44 rotationActive = false; |
45 currRotation = 0; | |
46 currAngle = 0; | |
47 | |
3 | 48 typeChanged = false; |
49 typeActive = false; | |
1 | 50 |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
51 throbTime = 0; |
1 | 52 |
53 | |
3 | 54 // Initialize connections between endpoints of the paths inside the piece |
55 for (int i = 0; i < numConnections; i++) | |
56 connections[i] = -1; | |
1 | 57 |
26
3d4cc47df31a
Cleanups, fix piece rendering and rotation.
Matti Hamalainen <ccr@tnsp.org>
parents:
21
diff
changeset
|
58 |
6 | 59 // Randomize connections in the piece |
3 | 60 Random rnd = new Random(); |
61 for (int i = 0; i < numConnections; i++) | |
62 { | |
63 while (connections[i] < 0) | |
64 { | |
65 int tmp = rnd.nextInt(numConnections); | |
26
3d4cc47df31a
Cleanups, fix piece rendering and rotation.
Matti Hamalainen <ccr@tnsp.org>
parents:
21
diff
changeset
|
66 if (tmp != i && connections[tmp] < 0) |
3 | 67 { |
68 connections[i] = tmp; | |
69 connections[tmp] = i; | |
70 } | |
71 } | |
72 } | |
73 } | |
74 | |
75 public Piece() | |
76 { | |
77 this(PieceType.NONE); | |
78 } | |
1 | 79 |
3 | 80 public void setType(PieceType ptype) |
81 { | |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
82 typeChanged = (prevType != ptype); |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
83 prevType = type; |
3 | 84 type = ptype; |
85 } | |
1 | 86 |
3 | 87 public int getConnection(int in) |
88 { | |
37 | 89 int offs = (in + (currRotation * 2)) % 8; |
90 if (offs < 0) | |
91 offs = 8 + offs; | |
92 | |
93 return connections[offs]; | |
3 | 94 } |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
95 |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
96 public void rotate(RotateDir dir) |
3 | 97 { |
6 | 98 // Only normal |
99 if (type != PieceType.LOCKED && type != PieceType.ACTIVE) | |
3 | 100 return; |
1 | 101 |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
102 currRotation = (currRotation + (dir == RotateDir.RIGHT ? 1 : -1)) % 4; |
11 | 103 newAngle = (float) ((currRotation * Math.PI) / 2.0f); |
26
3d4cc47df31a
Cleanups, fix piece rendering and rotation.
Matti Hamalainen <ccr@tnsp.org>
parents:
21
diff
changeset
|
104 lerpRotation = new Interpolate(newAngle, currAngle, maxTime); |
3 | 105 rotationChanged = true; |
5 | 106 } |
1 | 107 |
7 | 108 public Point2D getPointCoords(float x, float y, float dim, int index) |
5 | 109 { |
7 | 110 float ox = 0, oy = 0; |
111 float step = dim / 10; | |
1 | 112 |
5 | 113 switch (index) { |
34
6f6c551cc14c
Fix piece connections rendering.
Matti Hamalainen <ccr@tnsp.org>
parents:
32
diff
changeset
|
114 // Normal line starting and ending points |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
115 case 0: ox = 3.0f; oy = 0.4f; break; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
116 case 1: ox = 7.0f; oy = 0.4f; break; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
117 case 2: ox = 9.6f; oy = 3.0f; break; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
118 case 3: ox = 9.6f; oy = 7.0f; break; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
119 case 4: ox = 7.0f; oy = 9.6f; break; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
120 case 5: ox = 3.0f; oy = 9.6f; break; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
121 case 6: ox = 0.4f; oy = 7.0f; break; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
122 case 7: ox = 0.4f; oy = 3.0f; break; |
1 | 123 |
34
6f6c551cc14c
Fix piece connections rendering.
Matti Hamalainen <ccr@tnsp.org>
parents:
32
diff
changeset
|
124 // Matching control points for each point above (+8) |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
125 case 8: ox = 3.0f; oy = 3.0f; break; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
126 case 9: ox = 7.0f; oy = 3.0f; break; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
127 case 10: ox = 7.0f; oy = 3.0f; break; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
128 case 11: ox = 7.0f; oy = 7.0f; break; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
129 case 12: ox = 7.0f; oy = 7.0f; break; |
34
6f6c551cc14c
Fix piece connections rendering.
Matti Hamalainen <ccr@tnsp.org>
parents:
32
diff
changeset
|
130 case 13: ox = 3.0f; oy = 7.0f; break; |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
131 case 14: ox = 3.0f; oy = 7.0f; break; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
132 case 15: ox = 3.0f; oy = 3.0f; break; |
5 | 133 } |
1 | 134 |
7 | 135 return new Point2D.Float(x + ox * step, y + oy * step); |
5 | 136 } |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
137 |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
138 public void clearActiveConnections() |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
139 { |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
140 for (int i = 0; i < numConnections; i++) |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
141 active[i] = false; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
142 |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
143 activeChanged = true; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
144 } |
1 | 145 |
9 | 146 public void setActiveConnection(int index) |
147 { | |
148 active[index] = true; | |
30 | 149 active[connections[index]] = true; |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
150 |
9 | 151 activeChanged = true; |
152 } | |
27 | 153 |
154 public PieceType getType() | |
155 { | |
156 return type; | |
157 } | |
9 | 158 |
7 | 159 public void animate(float time) |
5 | 160 { |
161 if (rotationChanged) | |
162 { | |
163 rotationTime = time; | |
164 rotationActive = true; | |
7 | 165 rotationChanged = false; |
5 | 166 } |
1 | 167 |
5 | 168 if (rotationActive) |
169 { | |
11 | 170 float t = (time - rotationTime) / 2; |
171 | |
9 | 172 if (t < maxTime) |
7 | 173 currAngle = lerpRotation.getValue(t); |
174 else | |
175 { | |
176 currAngle = newAngle; | |
177 rotationActive = false; | |
178 } | |
5 | 179 } |
6 | 180 |
181 if (typeChanged) | |
182 { | |
183 typeTime = time; | |
184 typeActive = true; | |
7 | 185 typeChanged = false; |
6 | 186 } |
187 | |
188 if (typeActive) | |
189 { | |
190 } | |
191 | |
9 | 192 if (activeChanged) |
193 { | |
194 } | |
195 | |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
196 throbTime = (time % 100) / 100.0f; |
5 | 197 } |
1 | 198 |
7 | 199 public void paint(Graphics2D g, float x, float y, float dim) |
5 | 200 { |
11 | 201 g.rotate(currAngle, x + dim / 2.0f, y + dim / 2.0f); |
1 | 202 |
5 | 203 switch (type) { |
6 | 204 case LOCKED: g.setPaint(Color.green); break; |
5 | 205 case ACTIVE: g.setPaint(Color.red); break; |
206 case START: g.setPaint(Color.orange); break; | |
207 } | |
6 | 208 |
7 | 209 g.fill(new RoundRectangle2D.Float(x, y, dim, dim, dim / 10, dim / 10)); |
1 | 210 |
5 | 211 |
212 if (type == PieceType.START) | |
213 return; | |
214 | |
6 | 215 if (type == PieceType.ACTIVE) |
216 { | |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
217 float offs1 = throbTime * 10.0f, |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
218 offs2 = throbTime * 20.0f; |
11 | 219 |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
220 g.setPaint(new Color(0.0f, 0.0f, 0.0f, (float) (1.0f - throbTime) )); |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
221 g.setStroke(new BasicStroke(2.0f + throbTime * 2.0f)); |
11 | 222 g.draw(new RoundRectangle2D.Float(x - offs1, y - offs1, dim + offs2, dim + offs2, dim / 10, dim / 10)); |
6 | 223 } |
224 | |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
225 g.setStroke(new BasicStroke(5.0f)); |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
226 CubicCurve2D c = new CubicCurve2D.Float(); |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
227 // QuadCurve2D c = new QuadCurve2D.Float(); |
9 | 228 boolean[] drawn = new boolean[numConnections]; |
229 for (int i = 0; i < numConnections; i++) | |
230 if (!drawn[i]) | |
5 | 231 { |
232 Point2D start, cp1, cp2, end; | |
27 | 233 |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
234 boolean isActive = active[i] || active[connections[i]]; |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
235 g.setPaint(isActive ? Color.white : Color.black); |
9 | 236 |
6 | 237 start = getPointCoords(x, y, dim, i); |
238 end = getPointCoords(x, y, dim, connections[i]); | |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
239 |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
240 cp1 = getPointCoords(x, y, dim, i + 8); |
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
241 cp2 = getPointCoords(x, y, dim, connections[i] + 8); |
1 | 242 |
32
e480579cc460
More work on debugging the path resolving.
Matti Hamalainen <ccr@tnsp.org>
parents:
30
diff
changeset
|
243 c.setCurve(start, cp1, cp2, end); |
9 | 244 g.draw(c); |
245 | |
246 drawn[i] = true; | |
247 drawn[connections[i]] = true; | |
5 | 248 } |
34
6f6c551cc14c
Fix piece connections rendering.
Matti Hamalainen <ccr@tnsp.org>
parents:
32
diff
changeset
|
249 |
6f6c551cc14c
Fix piece connections rendering.
Matti Hamalainen <ccr@tnsp.org>
parents:
32
diff
changeset
|
250 g.setPaint(Color.black); |
6f6c551cc14c
Fix piece connections rendering.
Matti Hamalainen <ccr@tnsp.org>
parents:
32
diff
changeset
|
251 g.setStroke(new BasicStroke(5.0f)); |
6f6c551cc14c
Fix piece connections rendering.
Matti Hamalainen <ccr@tnsp.org>
parents:
32
diff
changeset
|
252 g.draw(new RoundRectangle2D.Float(x, y, dim, dim, dim / 10, dim / 10)); |
5 | 253 } |
1 | 254 } |