- Eclilpse 3.2.1で開いたらいろいろ怒られたので、黄色い波線が出ないように修正しました。
- 削除モードでチェックポイントも削除できるようにしました。
- ファイルを開くときに、ディレクトリが表示されない不具合を修正しました。
M Editor$1.class
M Editor$3.class
M Editor$5.class
M Editor$7.class
M Editor$9.class
M Editor$20.class
M Editor$22.class
M Editor$Mode.class
M Editor$24.class
M Editor$26.class
M Editor$28.class
M ShortSCurveRail.java
M Stage.java
M Editor.class
M Editor$10.class
M Editor$12.class
M Editor$31.class
M Editor$14.class
M Editor$33.class
M Editor$16.class
M Editor.java
M Rail.java
M Editor$18.class
M Editor$2.class
M Util.class
M Editor$4.class
M Editor$6.class
M Editor$8.class
M Rail.class
M Editor$21.class
M Editor$23.class
M Editor$25.class
M Editor$27.class
M Editor$29.class
M NetKartFileFilter.class
M Const.class
M Util.java
M NetKartFileFilter.java
M Editor$11.class
M Editor$30.class
M Editor$13.class
M Editor$32.class
M Editor$15.class
M Editor$17.class
M Const.java
M CheckPoint.java
M Editor$19.class
M Point.java
@@ -24,7 +24,7 @@ | ||
24 | 24 | |
25 | 25 | public Shape getShape() { |
26 | 26 | final GeneralPath path = new GeneralPath(); |
27 | - final float fatness = (float) (Const.RAIL_WIDTH / 4); | |
27 | + final float fatness = Const.RAIL_WIDTH / 4; | |
28 | 28 | path.moveTo(0, -Const.RAIL_WIDTH / 2); |
29 | 29 | path.curveTo(50 + fatness, -Const.RAIL_WIDTH / 2, 50 + fatness, 50 - Const.RAIL_WIDTH / 2, 100, 50 - Const.RAIL_WIDTH / 2); |
30 | 30 | path.moveTo(100, 50 + Const.RAIL_WIDTH / 2); |
@@ -34,7 +34,7 @@ | ||
34 | 34 | |
35 | 35 | public Shape getFill() { |
36 | 36 | final GeneralPath path = new GeneralPath(); |
37 | - final float fatness = (float) (Const.RAIL_WIDTH / 4); | |
37 | + final float fatness = Const.RAIL_WIDTH / 4; | |
38 | 38 | path.moveTo(0, -Const.RAIL_WIDTH / 2); |
39 | 39 | path.curveTo(50 + fatness, -Const.RAIL_WIDTH / 2, 50 + fatness, 50 - Const.RAIL_WIDTH / 2, 100, 50 - Const.RAIL_WIDTH / 2); |
40 | 40 | path.lineTo(100, 50 + Const.RAIL_WIDTH / 2); |
@@ -94,7 +94,7 @@ | ||
94 | 94 | * @return チェックポイントの一覧 |
95 | 95 | */ |
96 | 96 | public List<CheckPoint> getCheckPoints() { |
97 | - return checkPoints; | |
97 | + return this.checkPoints; | |
98 | 98 | } |
99 | 99 | |
100 | 100 | /** |
@@ -49,10 +49,6 @@ | ||
49 | 49 | /** |
50 | 50 | * ステージエディタです。 |
51 | 51 | * @author zenjiro |
52 | - * | |
53 | - * - スタート位置を作りたい。 | |
54 | - * - ステージの大きさを固定にしたい。 | |
55 | - * - 表示倍率を変更できるようにしたい。 | |
56 | 52 | */ |
57 | 53 | public class Editor { |
58 | 54 | /** |
@@ -65,9 +61,9 @@ | ||
65 | 61 | */ |
66 | 62 | ADD_RAIL, |
67 | 63 | /** |
68 | - * レールを削除するモード | |
64 | + * 削除するモード | |
69 | 65 | */ |
70 | - DELETE_RAIL, | |
66 | + DELETE, | |
71 | 67 | /** |
72 | 68 | * チェックポイントを追加するモード |
73 | 69 | */ |
@@ -77,22 +73,27 @@ | ||
77 | 73 | /** |
78 | 74 | * モード |
79 | 75 | */ |
80 | - private static Mode mode; | |
76 | + static Mode mode; | |
81 | 77 | |
82 | 78 | /** |
83 | 79 | * 削除するレール |
84 | 80 | */ |
85 | - private static Rail deleteRail; | |
81 | + static Rail deleteRail; | |
86 | 82 | |
87 | 83 | /** |
84 | + * 削除するチェックポイント | |
85 | + */ | |
86 | + static CheckPoint deleteCheckPoint; | |
87 | + | |
88 | + /** | |
88 | 89 | * 編集中のファイル |
89 | 90 | */ |
90 | - private static File file; | |
91 | + static File file; | |
91 | 92 | |
92 | 93 | /** |
93 | 94 | * 変更されたかどうか |
94 | 95 | */ |
95 | - private static boolean isModified; | |
96 | + static boolean isModified; | |
96 | 97 | |
97 | 98 | /** |
98 | 99 | * メインメソッドです。 |
@@ -144,15 +145,14 @@ | ||
144 | 145 | { |
145 | 146 | int i = 0; |
146 | 147 | for (final CheckPoint checkPoint : stage.getCheckPoints()) { |
147 | - final AffineTransform transform = new AffineTransform(); | |
148 | - transform.translate(checkPoint.location.getX(), checkPoint.location.getY()); | |
149 | - transform.rotate(checkPoint.angle); | |
150 | - final Shape rectangle = transform.createTransformedShape(new Rectangle2D.Double(-10, | |
151 | - -Const.RAIL_WIDTH / 2, 20, Const.RAIL_WIDTH)); | |
148 | + final Shape rectangle = Util.getFill(checkPoint); | |
152 | 149 | g2.setColor(new Color(250, 250, 250)); |
153 | 150 | g2.fill(rectangle); |
154 | 151 | g2.setColor(Color.BLACK); |
155 | 152 | g2.draw(rectangle); |
153 | + final AffineTransform transform = new AffineTransform(); | |
154 | + transform.translate(checkPoint.location.getX(), checkPoint.location.getY()); | |
155 | + transform.rotate(checkPoint.angle); | |
156 | 156 | if (i == 0) { |
157 | 157 | final GeneralPath arrow = new GeneralPath(); |
158 | 158 | arrow.moveTo(-20, 0); |
@@ -165,13 +165,15 @@ | ||
165 | 165 | arrow.closePath(); |
166 | 166 | g2.fill(transform.createTransformedShape(arrow)); |
167 | 167 | } |
168 | - final Shape string = g2.getFont().createGlyphVector(g2.getFontRenderContext(), | |
169 | - String.valueOf(i)).getOutline(); | |
170 | - transform.rotate(-checkPoint.angle); | |
171 | - transform | |
172 | - .translate(-string.getBounds2D().getWidth() / 2, -string.getBounds2D().getHeight() / 2); | |
173 | - transform.scale(1, -1); | |
174 | - g2.fill(transform.createTransformedShape(string)); | |
168 | + if (checkPoint != deleteCheckPoint) { | |
169 | + final Shape string = g2.getFont().createGlyphVector(g2.getFontRenderContext(), | |
170 | + String.valueOf(i)).getOutline(); | |
171 | + transform.rotate(-checkPoint.angle); | |
172 | + transform.translate(-string.getBounds2D().getWidth() / 2, | |
173 | + -string.getBounds2D().getHeight() / 2); | |
174 | + transform.scale(1, -1); | |
175 | + g2.fill(transform.createTransformedShape(string)); | |
176 | + } | |
175 | 177 | i++; |
176 | 178 | } |
177 | 179 | } |
@@ -191,7 +193,7 @@ | ||
191 | 193 | g2.draw(transform.createTransformedShape(temporaryRail.type.getShape())); |
192 | 194 | } |
193 | 195 | break; |
194 | - case DELETE_RAIL: | |
196 | + case DELETE: | |
195 | 197 | g2.setStroke(new BasicStroke(2)); |
196 | 198 | if (deleteRail != null) { |
197 | 199 | final AffineTransform transform = new AffineTransform(); |
@@ -204,6 +206,12 @@ | ||
204 | 206 | g2.fill(transform.createTransformedShape(deleteRail.type.getFill())); |
205 | 207 | g2.setColor(Const.COLOR_DELETE_DRAW); |
206 | 208 | g2.draw(transform.createTransformedShape(deleteRail.type.getShape())); |
209 | + } else if (deleteCheckPoint != null) { | |
210 | + final Shape rectangle = Util.getFill(deleteCheckPoint); | |
211 | + g2.setColor(Const.COLOR_DELETE_FILL); | |
212 | + g2.fill(rectangle); | |
213 | + g2.setColor(Const.COLOR_DELETE_DRAW); | |
214 | + g2.draw(rectangle); | |
207 | 215 | } |
208 | 216 | break; |
209 | 217 | case ADD_CHECK_POINT: |
@@ -309,14 +317,23 @@ | ||
309 | 317 | } |
310 | 318 | } |
311 | 319 | break; |
312 | - case DELETE_RAIL: | |
320 | + case DELETE: | |
321 | + deleteCheckPoint = null; | |
313 | 322 | deleteRail = null; |
314 | - for (final Rail rail : stage.getRails()) { | |
315 | - if (Util.getFill(rail).contains(mouseLocation.toPoint2D())) { | |
316 | - deleteRail = rail; | |
323 | + for (final CheckPoint checkPoint : stage.getCheckPoints()) { | |
324 | + if (Util.getFill(checkPoint).contains(mouseLocation.toPoint2D())) { | |
325 | + deleteCheckPoint = checkPoint; | |
317 | 326 | break; |
318 | 327 | } |
319 | 328 | } |
329 | + if (deleteCheckPoint == null) { | |
330 | + for (final Rail rail : stage.getRails()) { | |
331 | + if (Util.getFill(rail).contains(mouseLocation.toPoint2D())) { | |
332 | + deleteRail = rail; | |
333 | + break; | |
334 | + } | |
335 | + } | |
336 | + } | |
320 | 337 | break; |
321 | 338 | case ADD_CHECK_POINT: |
322 | 339 | minDistance = Const.EDITOR_GRID; |
@@ -380,12 +397,17 @@ | ||
380 | 397 | } |
381 | 398 | } |
382 | 399 | break; |
383 | - case DELETE_RAIL: | |
400 | + case DELETE: | |
384 | 401 | if (deleteRail != null) { |
385 | 402 | stage.getRails().remove(deleteRail); |
386 | 403 | deleteRail = null; |
387 | 404 | isModified = true; |
388 | 405 | frame.setTitle(Util.getTitle(file, isModified)); |
406 | + } else if (deleteCheckPoint != null) { | |
407 | + stage.getCheckPoints().remove(deleteCheckPoint); | |
408 | + deleteCheckPoint = null; | |
409 | + isModified = true; | |
410 | + frame.setTitle(Util.getTitle(file, isModified)); | |
389 | 411 | } |
390 | 412 | break; |
391 | 413 | case ADD_CHECK_POINT: |
@@ -850,7 +872,7 @@ | ||
850 | 872 | deleteItem.addActionListener(new ActionListener() { |
851 | 873 | public void actionPerformed(ActionEvent e) { |
852 | 874 | deleteRadio.setSelected(true); |
853 | - mode = Mode.DELETE_RAIL; | |
875 | + mode = Mode.DELETE; | |
854 | 876 | panel.repaint(); |
855 | 877 | } |
856 | 878 | }); |
@@ -890,7 +912,7 @@ | ||
890 | 912 | * @param title ダイアログボックスのタイトルバーに表示する文字列 |
891 | 913 | * @return 次に進んでも良いかどうか |
892 | 914 | */ |
893 | - private static boolean askIfSave(final JFrame frame, final JMenuItem saveItem, final String title) { | |
915 | + static boolean askIfSave(final JFrame frame, final JMenuItem saveItem, final String title) { | |
894 | 916 | if (isModified) { |
895 | 917 | switch (JOptionPane.showConfirmDialog(frame, "\"" + (file == null ? "新規ステージ" : file) |
896 | 918 | + "\"は修正されています。保存しますか?", title, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE)) { |
@@ -59,6 +59,17 @@ | ||
59 | 59 | this.isReverse = rail.isReverse; |
60 | 60 | } |
61 | 61 | |
62 | + /** | |
63 | + * レールをコピーします。 | |
64 | + * @param rail レール | |
65 | + */ | |
66 | + public void setRail(final Rail rail) { | |
67 | + this.type = rail.type; | |
68 | + this.location = rail.location; | |
69 | + this.angle = rail.angle; | |
70 | + this.isReverse = rail.isReverse; | |
71 | + } | |
72 | + | |
62 | 73 | @Override |
63 | 74 | public String toString() { |
64 | 75 | return "(" + this.type.getClass().getName() + ", " + this.location + ", " + this.angle + ", " + this.isReverse |
@@ -1,5 +1,6 @@ | ||
1 | 1 | import java.awt.Shape; |
2 | 2 | import java.awt.geom.AffineTransform; |
3 | +import java.awt.geom.Rectangle2D; | |
3 | 4 | import java.io.File; |
4 | 5 | |
5 | 6 | /** |
@@ -48,7 +49,7 @@ | ||
48 | 49 | public static String getTitle(final File file, final boolean isModified) { |
49 | 50 | return (isModified ? "*" : "") + (file == null ? "新規ステージ" : file.toString()) + " - NetKartステージエディタ"; |
50 | 51 | } |
51 | - | |
52 | + | |
52 | 53 | /** |
53 | 54 | * @param rail レール |
54 | 55 | * @return レールの塗りつぶし |
@@ -63,4 +64,16 @@ | ||
63 | 64 | return transform.createTransformedShape(rail.type.getFill()); |
64 | 65 | } |
65 | 66 | |
67 | + /** | |
68 | + * @param checkPoint チェックポイント | |
69 | + * @return チェックポイントの塗りつぶし | |
70 | + */ | |
71 | + public static Shape getFill(final CheckPoint checkPoint) { | |
72 | + final AffineTransform transform = new AffineTransform(); | |
73 | + transform.translate(checkPoint.location.getX(), checkPoint.location.getY()); | |
74 | + transform.rotate(checkPoint.angle); | |
75 | + return transform.createTransformedShape(new Rectangle2D.Double(-Const.EDITOR_CHECK_POINT_WIDTH / 2, | |
76 | + -Const.RAIL_WIDTH / 2, Const.EDITOR_CHECK_POINT_WIDTH, Const.RAIL_WIDTH)); | |
77 | + } | |
78 | + | |
66 | 79 | } |
@@ -9,7 +9,7 @@ | ||
9 | 9 | public class NetKartFileFilter extends FileFilter { |
10 | 10 | @Override |
11 | 11 | public boolean accept(final File file) { |
12 | - return file.getName().toLowerCase().endsWith(".netkart"); | |
12 | + return file.isDirectory() || file.getName().toLowerCase().endsWith(".netkart"); | |
13 | 13 | } |
14 | 14 | |
15 | 15 | @Override |
@@ -42,4 +42,9 @@ | ||
42 | 42 | */ |
43 | 43 | public static final Font EDITOR_FONT = new Font("Sans", Font.BOLD, 50); |
44 | 44 | |
45 | + /** | |
46 | + * チェックポイントの幅 | |
47 | + */ | |
48 | + public static final int EDITOR_CHECK_POINT_WIDTH = 20; | |
49 | + | |
45 | 50 | } |
@@ -40,7 +40,7 @@ | ||
40 | 40 | * @return 向き |
41 | 41 | */ |
42 | 42 | public double getAngle() { |
43 | - return angle; | |
43 | + return this.angle; | |
44 | 44 | } |
45 | 45 | |
46 | 46 | /** |
@@ -54,7 +54,7 @@ | ||
54 | 54 | * @return 位置 |
55 | 55 | */ |
56 | 56 | public Point getLocation() { |
57 | - return location; | |
57 | + return this.location; | |
58 | 58 | } |
59 | 59 | |
60 | 60 | /** |
@@ -36,7 +36,7 @@ | ||
36 | 36 | * @return x座標 |
37 | 37 | */ |
38 | 38 | public double getX() { |
39 | - return x; | |
39 | + return this.x; | |
40 | 40 | } |
41 | 41 | |
42 | 42 | /** |
@@ -50,7 +50,7 @@ | ||
50 | 50 | * @return y座標 |
51 | 51 | */ |
52 | 52 | public double getY() { |
53 | - return y; | |
53 | + return this.y; | |
54 | 54 | } |
55 | 55 | |
56 | 56 | /** |