Repository navigation
Expand file tree
/
Copy pathGameVisualizer.java
More file actions
147 lines (133 loc) · 4.71 KB
/
Copy pathGameVisualizer.java
File metadata and controls
147 lines (133 loc) · 4.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package gui;
import game.FilterName;
import game.RobotModel;
import game.TargetModel;
import sound.Equaliser;
import sound.MusicPlayer;
import sound.algorithms.FilterMode;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.io.Serializable;
import java.net.URL;
import java.util.Observable;
import java.util.Observer;
public class GameVisualizer extends JPanel implements Serializable, Observer
{
private TargetModel targetModel;
private RobotModel robotModel;
private transient MusicPlayer musicPlayer;
protected ClosingHandler closingHandler;
private Equaliser equaliser;
public GameVisualizer(RobotModel robotModel, TargetModel targetModel, FilterMode filter)
{
this.targetModel = targetModel;
this.robotModel = robotModel;
this.robotModel.setFieldSize(getWidth(), getHeight());
closingHandler = new ClosingHandler();
// TODO: change song
var url = getClass().getResource("/robotSounds/RobotMoving.wav");
musicPlayer = new MusicPlayer((new URL[] {url}));
equaliser = new Equaliser(filter, musicPlayer);
targetModel.addObserver(this);
robotModel.addObserver(this);
addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
targetModel.setTargetPosition(e.getPoint());
}
});
addComponentListener(new ResizeListener());
setDoubleBuffered(true);
musicPlayer.play();
musicPlayer.setVolumeLevel(0.9f);
}
class ResizeListener extends ComponentAdapter {
public void componentResized(ComponentEvent e) {
robotModel.setFieldSize(getWidth(), getHeight());
}
}
public void stopMusic(){
musicPlayer.stop();
}
public void setMetadata() {
var url = getClass().getResource("/robotSounds/RobotMoving.wav");
musicPlayer = new MusicPlayer((new URL[] {url}));
musicPlayer.play();
musicPlayer.setVolumeLevel(0.9f);
equaliser.setMetadata(musicPlayer);
robotModel.setMetadata();
targetModel.addObserver(this);
robotModel.addObserver(this);
addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
targetModel.setTargetPosition(e.getPoint());
}
});
setDoubleBuffered(true);
addComponentListener(new ResizeListener());
onRedrawEvent();
}
protected void onRedrawEvent()
{
EventQueue.invokeLater(this::repaint);
}
@Override
public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2d = (Graphics2D)g;
drawRobot(g2d, robotModel.getRobotPositionX(), robotModel.getRobotPositionY(), robotModel.getRobotDirection());
drawTarget(g2d, targetModel.getTargetPositionX(), targetModel.getTargetPositionY());
}
private static void fillOval(Graphics g, int centerX, int centerY, int diam1, int diam2)
{
g.fillOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2);
}
private static void drawOval(Graphics g, int centerX, int centerY, int diam1, int diam2)
{
g.drawOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2);
}
private void drawRobot(Graphics2D g, int x, int y, double direction)
{
int robotCenterX = robotModel.getRobotPositionX();
int robotCenterY = robotModel.getRobotPositionY();
AffineTransform t = AffineTransform.getRotateInstance(direction, robotCenterX, robotCenterY);
g.setTransform(t);
g.setColor(Color.MAGENTA);
fillOval(g, robotCenterX, robotCenterY, 30, 10);
g.setColor(Color.BLACK);
drawOval(g, robotCenterX, robotCenterY, 30, 10);
g.setColor(Color.WHITE);
fillOval(g, robotCenterX + 10, robotCenterY, 5, 5);
g.setColor(Color.BLACK);
drawOval(g, robotCenterX + 10, robotCenterY, 5, 5);
}
private void drawTarget(Graphics2D g, int x, int y)
{
AffineTransform t = AffineTransform.getRotateInstance(0, 0, 0);
g.setTransform(t);
g.setColor(Color.GREEN);
fillOval(g, x, y, 5, 5);
g.setColor(Color.BLACK);
drawOval(g, x, y, 5, 5);
}
@Override
public void update(Observable observable, Object state) {
if (state == null) {
onRedrawEvent();
return;
}
onRedrawEvent();
equaliser.transformateCurrentSong((FilterName) state);
}
}