Skip to content

Commit bf4fcee

Browse files
author
ryfax
committed
Improvements
- Add KeyboardListener - Add MouseListener - Add new module called 'Button' - Optimized FontRenderer, FontLoader - Recode some methods in Drawer - Test package add examples
1 parent 11b4751 commit bf4fcee

18 files changed

+369
-27
lines changed
22 KB
Loading

src/fr/ryfax/rge/engine/global/Engine.java

+22-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package fr.ryfax.rge.engine.global;
22

33

4+
import fr.ryfax.rge.engine.global.listeners.KeyboardListener;
5+
import fr.ryfax.rge.engine.global.listeners.MouseListener;
46
import fr.ryfax.rge.engine.global.scenes.SceneBuilder;
57
import fr.ryfax.rge.engine.global.scenes.SceneManager;
68
import fr.ryfax.rge.engine.utils.Logger;
79
import fr.ryfax.rge.engine.utils.drawing.Drawer;
810
import fr.ryfax.rge.engine.utils.drawing.font.FontLoader;
911

1012
import java.awt.*;
13+
import java.util.ArrayList;
1114
import java.util.HashMap;
1215

1316
import static fr.ryfax.rge.engine.utils.Sleep.*;
@@ -30,6 +33,11 @@ public class Engine {
3033
private final Logger logger = new Logger(this);
3134
private final Window window;
3235

36+
private final ArrayList<KeyboardListener> keyboardListeners = new ArrayList<>();
37+
private final ArrayList<MouseListener> mouseListeners = new ArrayList<>();
38+
private final ArrayList<Integer> buttonsPressed = new ArrayList<>();
39+
40+
private Point mousePosition = new Point(0, 0);
3341
private boolean isRunning = true, pause = false;
3442
private final double UPDATE_OBJECTIVE = 1/60D;
3543

@@ -95,6 +103,7 @@ private synchronized void loop() {
95103
}
96104

97105
private synchronized void update(int tick) {
106+
mousePosition = window.getCanvas().getMousePosition();
98107
sceneManager.getCurrentScene().update(tick);
99108
}
100109

@@ -111,7 +120,6 @@ private synchronized void draw() {
111120
private void loadText() {
112121
fontLoader.setPath("fr/ryfax/rge/assets/fonts/ascii.png");
113122
fontLoader.setFontColor(new Color(255, 255, 255));
114-
fontLoader.setBackgroundColor(new Color(0, 0, 0, 100));
115123

116124
HashMap<Character, Integer> chars = new HashMap<>();
117125
chars.put('i', 8);
@@ -125,18 +133,30 @@ private void loadText() {
125133

126134
fontLoader.setSpacingChar(4);
127135
fontLoader.setSpecialCharsSize(chars);
128-
fontLoader.load(FontLoader.RGE_DEFAULT_FONT);
136+
fontLoader.load(FontLoader.RGE_DEFAULT);
129137

130138
fontLoader.setShadow(2, 2);
131139
fontLoader.load(FontLoader.RGE_SHADOW);
132140

141+
fontLoader.setBackgroundColor(new Color(0, 0, 0, 100));
142+
fontLoader.load(FontLoader.RGE_SHADOW_BACKGROUND);
143+
144+
fontLoader.setShadow(0, 0);
145+
fontLoader.load(FontLoader.RGE_DEFAULT_BACKGROUND);
133146
}
134147

148+
public void addListener(KeyboardListener keyboardListener) { keyboardListeners.add(keyboardListener); }
149+
public void addListener(MouseListener mouseListener) { mouseListeners.add(mouseListener); }
150+
135151
/*
136152
* Getters
137153
*/
154+
public ArrayList<KeyboardListener> getKeyboardListeners() { return keyboardListeners; }
155+
public ArrayList<MouseListener> getMouseListeners() { return mouseListeners; }
156+
public ArrayList<Integer> getButtonsPressed() { return buttonsPressed; }
138157
public SceneBuilder getSceneBuilder() { return sceneBuilder; }
139158
public SceneManager getSceneManager() { return sceneManager; }
159+
public Point getMousePosition() { return mousePosition; }
140160
public Parameters getParameters() { return parameters; }
141161
public Statistics getStatistics() { return statistics; }
142162
public FontLoader getFontLoader() { return fontLoader; }

src/fr/ryfax/rge/engine/global/Window.java

+7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package fr.ryfax.rge.engine.global;
22

3+
import fr.ryfax.rge.engine.global.listeners.KeyEvents;
4+
import fr.ryfax.rge.engine.global.listeners.MouseEvents;
5+
36
import javax.swing.*;
47
import java.awt.*;
58
import java.awt.event.*;
@@ -29,6 +32,10 @@ public Window(String title, int width, int height, Engine engine) {
2932
frame.setPreferredSize(size);
3033
frame.setResizable(false);
3134

35+
frame.addKeyListener(new KeyEvents(engine));
36+
canvas.addKeyListener(new KeyEvents(engine));
37+
canvas.addMouseListener(new MouseEvents(engine));
38+
3239
frame.addComponentListener(new ComponentAdapter() {
3340
@Override
3441
public void componentMoved(ComponentEvent e) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package fr.ryfax.rge.engine.global.listeners;
2+
3+
import fr.ryfax.rge.engine.global.Engine;
4+
5+
import java.awt.event.KeyEvent;
6+
import java.awt.event.KeyListener;
7+
import java.util.ArrayList;
8+
9+
public class KeyEvents implements KeyListener {
10+
11+
private Engine engine;
12+
13+
private final ArrayList<Character> keysPressed = new ArrayList<>();
14+
15+
public KeyEvents(Engine engine) {
16+
this.engine = engine;
17+
}
18+
19+
public void keyTyped(KeyEvent keyEvent) {}
20+
21+
public void keyPressed(KeyEvent keyEvent) {
22+
if(!keysPressed.contains(keyEvent.getKeyChar())) {
23+
engine.getKeyboardListeners().forEach(list -> list.onKeyPressed(keyEvent));
24+
keysPressed.add(keyEvent.getKeyChar());
25+
}
26+
}
27+
28+
public void keyReleased(KeyEvent keyEvent) {
29+
keysPressed.remove((Object) keyEvent.getKeyChar());
30+
engine.getKeyboardListeners().forEach(list -> list.onKeyReleased(keyEvent));
31+
}
32+
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package fr.ryfax.rge.engine.global.listeners;
2+
3+
import java.awt.event.KeyEvent;
4+
5+
public interface KeyboardListener {
6+
7+
void onKeyPressed(KeyEvent key);
8+
void onKeyReleased(KeyEvent key);
9+
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package fr.ryfax.rge.engine.global.listeners;
2+
3+
import fr.ryfax.rge.engine.global.Engine;
4+
5+
import java.awt.event.KeyEvent;
6+
import java.awt.event.KeyListener;
7+
import java.awt.event.MouseEvent;
8+
import java.awt.event.MouseListener;
9+
import java.util.ArrayList;
10+
11+
public class MouseEvents implements MouseListener {
12+
13+
private Engine engine;
14+
15+
public MouseEvents(Engine engine) {
16+
this.engine = engine;
17+
}
18+
19+
public void mouseClicked(MouseEvent mouseEvent) {
20+
engine.getButtonsPressed().remove((Object) mouseEvent.getButton());
21+
engine.getMouseListeners().forEach(list -> list.onButtonReleased(mouseEvent.getButton()));
22+
}
23+
24+
public void mousePressed(MouseEvent mouseEvent) {
25+
engine.getButtonsPressed().add(mouseEvent.getButton());
26+
engine.getMouseListeners().forEach(list -> list.onButtonPressed(mouseEvent.getButton()));
27+
}
28+
29+
public void mouseReleased(MouseEvent mouseEvent) {}
30+
public void mouseEntered(MouseEvent mouseEvent) {}
31+
public void mouseExited(MouseEvent mouseEvent) {}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package fr.ryfax.rge.engine.global.listeners;
2+
3+
import java.awt.event.KeyEvent;
4+
5+
public interface MouseListener {
6+
7+
void onButtonPressed(int button);
8+
void onButtonReleased(int button);
9+
10+
}

src/fr/ryfax/rge/engine/object/modules/InformationsPanel.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package fr.ryfax.rge.engine.object.modules;
22

3+
import fr.ryfax.rge.engine.global.image.Image;
34
import fr.ryfax.rge.engine.object.VisualGameObject;
45
import fr.ryfax.rge.engine.utils.Tools;
56
import fr.ryfax.rge.engine.global.Engine;
@@ -9,6 +10,7 @@
910
import fr.ryfax.rge.engine.utils.drawing.font.FontLoader;
1011
import fr.ryfax.rge.engine.utils.drawing.font.FontRenderer;
1112

13+
import java.awt.*;
1214
import java.awt.image.BufferedImage;
1315

1416
public class InformationsPanel implements VisualGameObject {
@@ -20,14 +22,14 @@ public class InformationsPanel implements VisualGameObject {
2022
private final FontRenderer fontRenderer;
2123
private int tick = 0;
2224

23-
private final BufferedImage version;
24-
private BufferedImage fpsAndTick = null, ticks = null, time = null, cam = null, ram = null;
25+
private final Image version;
26+
private Image fpsAndTick = null, ticks = null, time = null, cam = null, ram = null;
2527

2628
/*
2729
* Methods
2830
*/
2931
public InformationsPanel(Engine engine) {
30-
Font font = engine.getFontLoader().getLoadedFonts().get(FontLoader.RGE_SHADOW);
32+
Font font = engine.getFontLoader().getLoadedFonts().get(FontLoader.RGE_SHADOW_BACKGROUND);
3133
statistics = engine.getStatistics();
3234
fontRenderer = new FontRenderer(font);
3335

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package fr.ryfax.rge.engine.object.modules.button;
2+
3+
import fr.ryfax.rge.engine.global.Engine;
4+
import fr.ryfax.rge.engine.global.image.Image;
5+
import fr.ryfax.rge.engine.object.VisualGameObject;
6+
import fr.ryfax.rge.engine.utils.drawing.Drawer;
7+
import fr.ryfax.rge.engine.utils.movements.Vector2D;
8+
9+
import java.awt.*;
10+
11+
public class Button implements VisualGameObject {
12+
13+
private final Engine engine;
14+
private final ButtonListener listener;
15+
16+
private Image sprite, text;
17+
private Vector2D position = new Vector2D(0, 0);
18+
private Dimension size = new Dimension(200, 50);
19+
private boolean hover = false, click = false;
20+
21+
public Button(Engine engine, ButtonListener listener) {
22+
this.engine = engine;
23+
this.listener = listener;
24+
listener.init(this);
25+
}
26+
27+
public void update(int tick) {
28+
Point mouse = engine.getMousePosition();
29+
30+
if(mouse != null) {
31+
if(mouse.x <= position.x + size.width
32+
&& mouse.x >= position.x
33+
&& mouse.y <= position.y + size.height
34+
&& mouse.y >= position.y){
35+
if(!hover) {
36+
listener.onMouseEntered();
37+
hover = true;
38+
}
39+
40+
if(!click) {
41+
if(engine.getButtonsPressed().contains(1)) {
42+
listener.onClick();
43+
click = true;
44+
}
45+
}else if(!engine.getButtonsPressed().contains(1)) {
46+
click = false;
47+
}
48+
49+
}else if(hover) {
50+
listener.onMouseExited();
51+
hover = false;
52+
click = false;
53+
}
54+
}
55+
}
56+
57+
public void draw(Drawer drawer) {
58+
drawer.imageNotRelative(sprite, (int) position.x, (int) position.y);
59+
drawer.imageNotRelative(text,
60+
(int) position.x + size.width/2 - text.getBufferedImage().getWidth()/2,
61+
(int) position.y + size.height/2 - text.getBufferedImage().getHeight()/2);
62+
}
63+
64+
65+
/*
66+
* Setters
67+
*/
68+
public void setPosition(Vector2D position) { this.position = position; }
69+
public void setSize(Dimension size) { this.size = size; }
70+
public void setSprite(Image sprite) { this.sprite = sprite; }
71+
public void setText(Image text) { this.text = text; }
72+
73+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package fr.ryfax.rge.engine.object.modules.button;
2+
3+
public interface ButtonListener {
4+
5+
void init(Button button);
6+
void onMouseEntered();
7+
void onMouseExited();
8+
void onClick();
9+
10+
}

src/fr/ryfax/rge/engine/utils/drawing/Drawer.java

+14-5
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,14 @@ public void fillRectNotRelative(int x, int y, int width, int height, Color color
6262
}
6363

6464
/*
65-
* Draw String with a Font at x, y
65+
* Draw Image/BufferedImage at x, y
6666
* x, y relative to camera
6767
*/
68-
public void image(Image image, double x, double y) {
69-
g2d.drawImage(image.getBufferedImage(),
70-
(int) (x - camera.getPosition().x),
71-
(int) (y - camera.getPosition().y), null);
68+
public void image(Image img, double x, double y) {
69+
if(img != null)
70+
g2d.drawImage(img.getBufferedImage(),
71+
(int) (x - camera.getPosition().x),
72+
(int) (y - camera.getPosition().y), null);
7273
}
7374

7475
public void image(BufferedImage img, double x, double y) {
@@ -77,6 +78,14 @@ public void image(BufferedImage img, double x, double y) {
7778
(int) (y - camera.getPosition().y), null);
7879
}
7980

81+
/*
82+
* Draw Image/BufferedImage at x, y
83+
*/
84+
public void imageNotRelative(Image img, int x, int y) {
85+
if(img != null)
86+
g2d.drawImage(img.getBufferedImage(), x , y, null);
87+
}
88+
8089
public void imageNotRelative(BufferedImage img, int x, int y) {
8190
g2d.drawImage(img, x , y, null);
8291
}

src/fr/ryfax/rge/engine/utils/drawing/font/FontLoader.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99

1010
public class FontLoader {
1111

12-
public static final String RGE_DEFAULT_FONT = "RGE_DEFAULT";
12+
public static final String RGE_DEFAULT = "RGE_DEFAULT";
13+
public static final String RGE_DEFAULT_BACKGROUND = "RGE_DEFAULT_BACKGROUND";
1314
public static final String RGE_SHADOW = "RGE_SHADOW";
15+
public static final String RGE_SHADOW_BACKGROUND = "RGE_SHADOW_BACKGROUND";
1416

15-
private Color backgroundColor, fontColor;
17+
private Color backgroundColor = new Color(0, 0, 0, 0), fontColor;
1618
private String path;
1719
private int spaceToRemove = 0;
1820
private final int[] shadow = new int[]{0, 0};
@@ -55,6 +57,6 @@ public void load(String nameFont) {
5557
} catch (IOException e) { e.printStackTrace(); }
5658
}
5759

58-
public Font getDefaultFont() { return fonts.get(RGE_DEFAULT_FONT); }
60+
public Font getDefaultFont() { return fonts.get(RGE_DEFAULT); }
5961
public HashMap<String, Font> getLoadedFonts() { return fonts; }
6062
}

0 commit comments

Comments
 (0)