Skip to content

Commit cf6295f

Browse files
committed
Refactor multi turtle window
1 parent 2f3d01a commit cf6295f

4 files changed

Lines changed: 126 additions & 92 deletions

File tree

src/main/java/org/teachingextensions/WindowUtils/MultiTurtleWindow.java

Lines changed: 40 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,32 @@
44
import org.teachingextensions.logo.Turtle;
55
import org.teachingextensions.logo.Turtle.Animals;
66
import org.teachingextensions.logo.utils.ColorUtils.PenColors;
7-
import org.teachingextensions.logo.utils.LineAndShapeUtils.LineSegment;
7+
import org.teachingextensions.logo.utils.InterfaceUtils.MultiTurtlePainter;
8+
import org.teachingextensions.logo.utils.InterfaceUtils.MultiTurtleTrailPainter;
9+
import org.teachingextensions.logo.utils.LineAndShapeUtils.Paintable;
810

911
import java.awt.*;
10-
import java.awt.geom.AffineTransform;
11-
import java.awt.geom.Line2D;
1212
import java.util.ArrayList;
1313
import java.util.List;
1414

1515
/**
1616
* Use this window when you want to put more than one turtle on the same window
1717
*/
18-
public class MultiTurtleWindow extends TurtlePanel
19-
{
20-
private List<Turtle> turtles = new ArrayList<Turtle>();
21-
private Image image;
22-
private Animals animal = Animals.Turtle;
23-
public MultiTurtleWindow()
24-
{
18+
public class MultiTurtleWindow extends TurtlePanel {
19+
private List<Turtle> turtles = new ArrayList<Turtle>();
20+
private Animals animal = Animals.Turtle;
21+
private Paintable multiTurtlePainter;
22+
private Paintable multiTurtleTrailPainter;
23+
24+
public MultiTurtleWindow() {
2525
super("Turtles, Turtles, Turtles!");
2626
this.image = loadAnimal();
27+
this.getWindow()
28+
.add(this.createTurtlePainter())
29+
.add(this.createTurtleTrailPainter())
30+
.setBackground(PenColors.Blues.DarkSlateBlue);
2731
}
32+
2833
/**
2934
* Adds a turtle instance to a window
3035
* NOTE: this method must be called BEFORE calling any other methods on turtle instances
@@ -33,102 +38,50 @@ public MultiTurtleWindow()
3338
* @param turtle
3439
* A turtle instance
3540
*/
36-
public void addTurtle(Turtle turtle)
37-
{
38-
if (turtle == null) { return; }
39-
this.turtles.add(turtle);
41+
public void addTurtle(Turtle turtle) {
42+
if (turtle == null) {
43+
return;
44+
}
4045
turtle.setFrame(this.getWindow().getFrame());
4146
turtle.setPanel(this);
47+
48+
this.turtles.add(turtle);
49+
this.getWindow()
50+
.remove(this.multiTurtlePainter)
51+
.remove(this.multiTurtleTrailPainter)
52+
.add(this.createTurtlePainter())
53+
.add(this.createTurtleTrailPainter());
4254
}
43-
// @Override
44-
// public void paint(Graphics g)
45-
// {
46-
// // We must call JPanel paint to get the correct behavior on windows...
47-
// super.getWindow().paint(g);
48-
// Graphics2D g2d = TkpPanel.configureGraphics2D(g);
49-
// super.setBackground(PenColors.Blues.DarkSlateBlue);
50-
// paintLines(g2d);
51-
// paintTurtle(g2d);
52-
// g2d.dispose();
53-
// }
54-
@Override
55-
public synchronized Image getImage()
56-
{
57-
return image;
58-
}
59-
/**
60-
* Sets the Animal type on the window
61-
* <p><b>Example:</b> {@code multiTurtlePanel.setAnimal(animal)} </p>
62-
*
63-
* @see Animals
64-
*/
65-
@Override
66-
public synchronized void setAnimal(Animals animal)
67-
{
68-
this.animal = animal;
69-
this.image = loadAnimal();
70-
}
71-
private Image loadAnimal()
72-
{
55+
56+
private Image loadAnimal() {
7357
return ObjectUtils.loadImage(MultiTurtleWindow.class, this.animal + ".png");
7458
}
75-
private void paintLines(Graphics2D g2d)
76-
{
77-
// Paint can be called before the constructor finishes when super() shows the window.
78-
if (this.turtles == null) { return; }
79-
for (Turtle turtle : turtles)
80-
{
81-
paintTrail(g2d, turtle.getTrail());
82-
}
83-
}
84-
private void paintTrail(Graphics2D g2d, LineSegment[] trail)
85-
{
86-
for (LineSegment l : trail)
87-
{
88-
//g2d.setColor(l.getColor());
89-
g2d.setColor(PenColors.Yellows.Gold);
90-
g2d.setStroke(new BasicStroke(l.getWidth(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
91-
g2d.draw(new Line2D.Double(l.getStart().x, l.getStart().y, l.getEnd().x, l.getEnd().y));
92-
}
59+
60+
private Paintable createTurtleTrailPainter() {
61+
return this.multiTurtleTrailPainter = new MultiTurtleTrailPainter(this.turtles);
9362
}
94-
private void paintTurtle(Graphics2D g)
95-
{
96-
for (Turtle turtle : turtles)
97-
{
98-
if (turtle.isHidden())
99-
{
100-
continue;
101-
}
102-
Image image = getImage();
103-
int xCenter = image.getWidth(null) / 2;
104-
int yCenter = image.getHeight(null) / 2;
105-
int x = turtle.getX() - xCenter;
106-
int y = turtle.getY() - yCenter;
107-
AffineTransform rotate = AffineTransform.getRotateInstance(Math.toRadians(turtle.getHeadingInDegrees()),
108-
xCenter, yCenter);
109-
AffineTransform move = AffineTransform.getTranslateInstance(x, y);
110-
move.concatenate(rotate);
111-
g.drawImage(image, move, null);
112-
}
63+
64+
private Paintable createTurtlePainter() {
65+
return this.multiTurtlePainter = new MultiTurtlePainter(this.turtles, this.getImage());
11366
}
114-
public int getTurtleCount()
115-
{
67+
68+
public int getTurtleCount() {
11669
return this.turtles.size();
11770
}
71+
11872
/**
11973
* Adds a turtle instance to a window and shows it on the window
12074
* <p><b>Example:</b> {@code multiTurtleWindow.addAndShowTurtle(myTurtle)}</p>
12175
*
12276
* @param turtle
12377
* A turtle instance
12478
*/
125-
public void addAndShowTurtle(Turtle turtle)
126-
{
79+
public void addAndShowTurtle(Turtle turtle) {
12780
this.addTurtle(turtle);
12881
this.showTurtle(turtle);
12982
}
130-
private void showTurtle(Turtle turtle)
131-
{
83+
84+
private void showTurtle(Turtle turtle) {
13285
turtle.show();
13386
}
13487
}

src/main/java/org/teachingextensions/WindowUtils/TurtlePanel.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
import java.util.ArrayList;
1616

1717
public class TurtlePanel {
18-
private Turtle turtle;
19-
private Image image;
20-
private TurtleWindow window;
21-
private TurtleTrailPainter trailPainter;
22-
private TurtlePainter turtlePainter;
18+
private Turtle turtle;
19+
protected Image image;
20+
private TurtleWindow window;
21+
private TurtleTrailPainter trailPainter;
22+
private TurtlePainter turtlePainter;
2323

2424
public TurtlePanel() {
2525
this(null, null);
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.teachingextensions.logo.utils.InterfaceUtils;
2+
3+
import org.teachingextensions.logo.Turtle;
4+
import org.teachingextensions.logo.utils.LineAndShapeUtils.Paintable;
5+
6+
import javax.swing.*;
7+
import java.awt.*;
8+
import java.awt.geom.AffineTransform;
9+
import java.util.List;
10+
11+
public class MultiTurtlePainter implements Paintable {
12+
private final List<Turtle> turtles;
13+
private final Image image;
14+
15+
public MultiTurtlePainter(List<Turtle> turtles, Image image) {
16+
this.turtles = turtles;
17+
this.image = image;
18+
}
19+
20+
@Override
21+
public void paint(Graphics2D g, JPanel caller) {
22+
for (Turtle turtle : turtles)
23+
{
24+
if (turtle.isHidden())
25+
{
26+
continue;
27+
}
28+
Image image = getImage();
29+
int xCenter = image.getWidth(null) / 2;
30+
int yCenter = image.getHeight(null) / 2;
31+
int x = turtle.getX() - xCenter;
32+
int y = turtle.getY() - yCenter;
33+
AffineTransform rotate = AffineTransform.getRotateInstance(Math.toRadians(turtle.getHeadingInDegrees()),
34+
xCenter, yCenter);
35+
AffineTransform move = AffineTransform.getTranslateInstance(x, y);
36+
move.concatenate(rotate);
37+
g.drawImage(image, move, null);
38+
}
39+
}
40+
41+
public Image getImage() {
42+
return image;
43+
}
44+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.teachingextensions.logo.utils.InterfaceUtils;
2+
3+
import org.teachingextensions.logo.Turtle;
4+
import org.teachingextensions.logo.utils.ColorUtils.PenColors;
5+
import org.teachingextensions.logo.utils.LineAndShapeUtils.LineSegment;
6+
import org.teachingextensions.logo.utils.LineAndShapeUtils.Paintable;
7+
8+
import javax.swing.*;
9+
import java.awt.*;
10+
import java.awt.geom.Line2D;
11+
import java.util.List;
12+
13+
public class MultiTurtleTrailPainter implements Paintable {
14+
private final List<Turtle> turtles;
15+
16+
public MultiTurtleTrailPainter(List<Turtle> turtles) {
17+
this.turtles = turtles;
18+
}
19+
20+
@Override
21+
public void paint(Graphics2D g, JPanel caller) {
22+
if (turtles == null) { return; }
23+
24+
for (Turtle turtle : turtles)
25+
{
26+
paintTrail(turtle.getTrail(), g);
27+
}
28+
}
29+
30+
private void paintTrail(final LineSegment[] trail, Graphics2D g) {
31+
for (LineSegment l : trail) {
32+
g.setColor(PenColors.Yellows.Gold);
33+
g.setStroke(new BasicStroke(l.getWidth(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
34+
g.draw(new Line2D.Double(l.getStart().x, l.getStart().y, l.getEnd().x, l.getEnd().y));
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)