Skip to content

Commit 554a73e

Browse files
feat: screen navigation (from @ngocmai3438), server account handler (#51)
* feat(screen): implement screen navigation * feat(server): login + register logic * feat(server): session logic, user info route, friendship manager (not completed) * chore: bump version to 1.0.1, remove unnecessary dependencies --------- Co-authored-by: 24020216@vnu.edu.vn <24020216@vnu.edu.vn>
1 parent debb22f commit 554a73e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+996
-216
lines changed

.github/workflows/build-jar.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ jobs:
3535
with:
3636
name: desktop-jar
3737
path: |
38-
"./desktop/target/*.jar"
38+
./desktop/target/*.jar
3939
!./desktop/target/original-*.jar
4040
4141
- name: Upload Desktop JAR to GitHub Releases
@@ -66,7 +66,7 @@ jobs:
6666
with:
6767
name: server-jar
6868
path: |
69-
"./server/target/*.jar"
69+
./server/target/*.jar
7070
7171
- name: Upload Server JAR to GitHub Releases
7272
if: github.event_name == 'release'

client/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<parent>
88
<groupId>io.exterminator3618</groupId>
99
<artifactId>common</artifactId>
10-
<version>1.0.0</version>
10+
<version>1.0.1</version>
1111
<relativePath>../pom.xml</relativePath>
1212
</parent>
1313

client/src/main/java/io/exterminator3618/client/Exterminator3618.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public void launchScreen(@NotNull Screen screen) {
8080
screenStack.push(screen);
8181
super.setScreen(screen);
8282
}
83-
83+
/**
8484
public void backToPreviousScreen() {
8585
super.getScreen().dispose();
8686
if (screenStack.isEmpty()) {
@@ -91,10 +91,30 @@ public void backToPreviousScreen() {
9191
super.setScreen(screenStack.pop());
9292
}
9393
}
94+
*/
95+
public void backToPreviousScreen () {
96+
super.getScreen().dispose();
97+
if (screenStack.isEmpty()) {
98+
log.warn("Screen stack is empty, cannot go back.");
99+
Gdx.app.exit();
100+
return;
101+
}
102+
screenStack.pop();
103+
if (screenStack.isEmpty()) {
104+
log.warn("Popped the last screen, quiting game.");
105+
Gdx.app.exit();
106+
} else {
107+
log.info("Returning to screen: {}", screenStack.peek().getClass().getSimpleName());
108+
super.setScreen(screenStack.peek());
109+
}
110+
}
94111

95112
public void replaceCurrentScreen(@NotNull Screen screen) {
96113
super.getScreen().dispose();
97-
launchScreen(screen);
114+
screenStack.pop();
115+
screenStack.push(screen);
116+
super.setScreen(screen);
117+
//launchScreen(screen);
98118
}
99119

100120
@Override

client/src/main/java/io/exterminator3618/client/screens/GameOverScreen.java

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,69 @@
44
import com.badlogic.gdx.Input;
55
import com.badlogic.gdx.Screen;
66
import com.badlogic.gdx.graphics.GL20;
7+
import com.badlogic.gdx.graphics.OrthographicCamera;
8+
import com.badlogic.gdx.utils.viewport.FitViewport;
9+
import com.badlogic.gdx.utils.viewport.Viewport;
10+
import com.badlogic.gdx.math.Vector3;
11+
import io.exterminator3618.client.Constants;
712
import io.exterminator3618.client.Exterminator3618;
13+
import io.exterminator3618.client.components.TextButton;
814
import io.exterminator3618.client.utils.Renderer;
915

1016
public final class GameOverScreen implements Screen {
1117

1218
private final Exterminator3618 game;
1319
private final Renderer renderer;
1420

21+
private OrthographicCamera camera;
22+
private Viewport viewport;
23+
private Vector3 touchPos = new Vector3();
24+
25+
private TextButton playAgainButton;
26+
private TextButton backButton;
27+
1528
public GameOverScreen(Exterminator3618 game) {
1629
this.game = game;
1730
this.renderer = game.getRenderer();
31+
camera = new OrthographicCamera();
32+
viewport = new FitViewport(Constants.WINDOW_WIDTH, Constants.WINDOW_HEIGHT, camera);
33+
backButton = new TextButton("Main Menu", 100, 300, 200, 50);
34+
playAgainButton = new TextButton("Play Again", 100, 240, 200, 50);
1835
}
1936

2037
@Override
2138
public void show() {
22-
39+
camera.position.set(Constants.WINDOW_WIDTH / 2, Constants.WINDOW_HEIGHT / 2, 0);
2340
}
2441

2542
@Override
2643
public void render(float delta) {
2744
// Render game over screen
2845
Gdx.gl.glClearColor(0.2f, 0, 0, 1);
2946
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
30-
renderer.begin();
47+
renderer.begin(camera);
3148
// Draw game over text here
3249
renderer.drawTextMiddle("Day la Game Over Screen", Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);
50+
camera.update();
51+
viewport.apply();
52+
//renderer.begin(camera);
53+
playAgainButton.draw(renderer);
54+
backButton.draw(renderer);
55+
3356
renderer.end();
3457

58+
if (Gdx.input.justTouched()) {
59+
touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
60+
viewport.unproject(touchPos);
61+
62+
if (backButton.isClicked(touchPos.x, touchPos.y)) {
63+
game.backToPreviousScreen();
64+
}
65+
66+
if (playAgainButton.isClicked(touchPos.x, touchPos.y)) {
67+
game.replaceCurrentScreen(new GameScreen(game));
68+
}
69+
}
3570
if (Gdx.input.isKeyJustPressed(Input.Keys.ENTER) || Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) {
3671
game.getSoundManager().stop(); // Stop any playing music
3772
game.launchScreen(new MainMenuScreen(game));
@@ -40,7 +75,7 @@ public void render(float delta) {
4075

4176
@Override
4277
public void resize(int width, int height) {
43-
78+
viewport.update(width, height);
4479
}
4580

4681
@Override

client/src/main/java/io/exterminator3618/client/screens/GameScreen.java

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
import java.util.List;
66
import java.util.Random;
77

8+
import com.badlogic.gdx.graphics.OrthographicCamera;
9+
import com.badlogic.gdx.utils.viewport.FitViewport;
10+
import com.badlogic.gdx.utils.viewport.Viewport;
11+
import com.badlogic.gdx.math.Vector3;
12+
import io.exterminator3618.client.components.*;
813
import org.slf4j.Logger;
914
import org.slf4j.LoggerFactory;
1015

@@ -24,6 +29,7 @@
2429
import io.exterminator3618.client.components.PowerUpBrick;
2530
import io.exterminator3618.client.components.StrongBrick;
2631
import io.exterminator3618.client.managers.SoundManager;
32+
2733
import io.exterminator3618.client.utils.Assets;
2834
import io.exterminator3618.client.utils.LevelLoader;
2935
import io.exterminator3618.client.utils.Renderer;
@@ -53,6 +59,13 @@ public final class GameScreen implements Screen {
5359
private List<PowerUp> powerUps;
5460
private List<PowerUp> activePowerUps;
5561

62+
private OrthographicCamera camera;
63+
private Viewport viewport;
64+
private Vector3 touchPos = new Vector3();
65+
66+
private TextButton pauseButton;
67+
68+
5669
public GameScreen(Exterminator3618 game) {
5770
this.game = game;
5871
this.renderer = game.getRenderer();
@@ -63,7 +76,6 @@ public GameScreen(Exterminator3618 game) {
6376
soundManager.play("sound/gameplay_bgm.mp3", true);
6477
}
6578

66-
6779
public void loadLevel(int levelNumber, Ball oldball) {
6880
log.info("Loading level {}", levelNumber);
6981
// Initialize ball
@@ -99,13 +111,6 @@ public void loadLevel(int levelNumber, Ball oldball) {
99111
PADDLE_REGION_NAME
100112
);
101113

102-
/*
103-
104-
bricks = new ArrayList<>();
105-
int rows = 5;
106-
int cols = 17;
107-
int startX = 50;
108-
int startY = WINDOW_HEIGHT - 100;*/
109114
bricks = LevelLoader.load(getClass().getResourceAsStream(
110115
String.format("/levels/level%d.dat", levelNumber)
111116
));
@@ -114,6 +119,11 @@ public void loadLevel(int levelNumber, Ball oldball) {
114119

115120
@Override
116121
public void show() {
122+
camera = new OrthographicCamera();
123+
viewport = new FitViewport(Constants.WINDOW_WIDTH, Constants.WINDOW_HEIGHT, camera);
124+
camera.position.set(Constants.WINDOW_WIDTH / 2, Constants.WINDOW_HEIGHT / 2, 0);
125+
touchPos = new Vector3();
126+
pauseButton = new TextButton("Pause", 100, 300, 200, 50);
117127
}
118128

119129
/**
@@ -179,7 +189,7 @@ public void render(float deltaTime) {
179189
}
180190

181191
// Render game objects
182-
renderer.begin();
192+
renderer.begin(camera);
183193
renderer.draw(ball);
184194
renderer.draw(paddle);
185195
for (PowerUp powerUp : powerUps) {
@@ -203,7 +213,9 @@ public void render(float deltaTime) {
203213
for (int i = 0; i < lives; i++) {
204214
renderer.drawLives(20 + i * 30, WINDOW_HEIGHT - 70);
205215
}
206-
216+
camera.update();
217+
viewport.apply();
218+
pauseButton.draw(renderer);
207219
// (Optional) Could display active power-up timers here if desired
208220

209221
renderer.end();
@@ -226,11 +238,21 @@ public void render(float deltaTime) {
226238
if (Gdx.input.isKeyJustPressed(Input.Keys.P) || Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) {
227239
game.launchScreen(new PauseScreen(game, this));
228240
}
241+
242+
if (Gdx.input.justTouched()) {
243+
touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
244+
viewport.unproject(touchPos);
245+
246+
if (pauseButton.isClicked(touchPos.x, touchPos.y)) {
247+
game.launchScreen(new PauseScreen(game, this));
248+
}
249+
}
250+
229251
}
230252

231253
@Override
232254
public void resize(int width, int height) {
233-
255+
viewport.update(width, height);
234256
}
235257

236258
@Override
@@ -255,7 +277,7 @@ public void hide() {
255277
public void dispose() {
256278
bricks.clear();
257279
extraBalls.clear();
258-
Assets.dispose();
280+
//Assets.dispose();
259281
log.info("Game disposed");
260282
}
261283

@@ -264,8 +286,9 @@ private void gotoVictoryScreen() {
264286
}
265287

266288
private void gotoGameOverScreen() {
267-
soundManager.dispose();
268-
game.launchScreen(new GameOverScreen(game));
289+
//game.launchScreen(new GameOverScreen(game));
290+
soundManager.dispose();
291+
game.replaceCurrentScreen(new GameOverScreen(game));
269292
}
270293

271294
/**

client/src/main/java/io/exterminator3618/client/screens/MainMenuScreen.java

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import com.badlogic.gdx.graphics.GL20;
77

88
import com.badlogic.gdx.graphics.OrthographicCamera;
9-
import com.badlogic.gdx.math.Vector2;
9+
import com.badlogic.gdx.utils.viewport.FitViewport;
10+
import com.badlogic.gdx.utils.viewport.Viewport;
1011
import com.badlogic.gdx.math.Vector3;
12+
import io.exterminator3618.client.Constants;
1113
import io.exterminator3618.client.Exterminator3618;
1214
import io.exterminator3618.client.managers.SoundManager;
1315
import io.exterminator3618.client.components.TextButton;
@@ -20,25 +22,37 @@ public final class MainMenuScreen implements Screen {
2022
private final SoundManager soundManager;
2123
private final OrthographicCamera camera;
2224
private final Vector3 touchPos;
25+
private Viewport viewport;
2326

24-
private final TextButton startButton;
25-
private final TextButton settingsButton;
27+
private TextButton startButton;
28+
private TextButton settingsButton;
29+
private TextButton exitButton;
30+
31+
final int BUTTON_WIDTH = 220;
32+
final int BUTTON_HEIGHT = 50;
33+
final int PADDING = 20;
2634

2735
public MainMenuScreen(Exterminator3618 game) {
2836
this.game = game;
2937
renderer = game.getRenderer();
3038
soundManager = game.getSoundManager();
3139

3240
camera = new OrthographicCamera();
33-
camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
34-
41+
viewport = new FitViewport(Constants.WINDOW_WIDTH, Constants.WINDOW_HEIGHT, camera);
3542
touchPos = new Vector3();
36-
startButton = new TextButton("Start Game", 100, 300, 200, 50);
37-
settingsButton = new TextButton("Options", 100, 240, 200, 50);
43+
44+
final int CENTER_X = (Constants.WINDOW_WIDTH / 2) - (BUTTON_WIDTH / 2);
45+
final int START_Y = (Constants.WINDOW_HEIGHT / 2) + BUTTON_HEIGHT + PADDING;
46+
final int SETTINGS_Y = START_Y - BUTTON_HEIGHT - PADDING;
47+
final int EXIT_Y = SETTINGS_Y - BUTTON_HEIGHT - PADDING;
48+
startButton = new TextButton("Start Game", CENTER_X, START_Y, BUTTON_WIDTH, BUTTON_HEIGHT);
49+
settingsButton = new TextButton("Options", CENTER_X, SETTINGS_Y, BUTTON_WIDTH, BUTTON_HEIGHT);
50+
// exitButton = new TextButton("Exit", CENTER_X, EXIT_Y, BUTTON_WIDTH, BUTTON_HEIGHT);
3851
}
3952

4053
@Override
4154
public void show() {
55+
camera.position.set(Constants.WINDOW_WIDTH / 2, Constants.WINDOW_HEIGHT / 2, 0);
4256
soundManager.setVolume(0.1f);
4357
soundManager.play("sound/main_menu.mp3", true);
4458

@@ -50,10 +64,10 @@ public void render(float delta) {
5064
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
5165

5266
camera.update();
67+
viewport.apply();
5368
renderer.begin(camera);
5469
// Draw text here
5570
renderer.drawLogo(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2 + 50);
56-
renderer.drawTextMiddle("Day la Main Screen", Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);
5771
startButton.draw(renderer);
5872
settingsButton.draw(renderer);
5973

@@ -70,13 +84,16 @@ public void render(float delta) {
7084
if (Gdx.input.justTouched()) { // Chỉ kiểm tra khi người dùng vừa nhấp
7185
// Lấy tọa độ nhấp chuột trên màn hình
7286
touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
87+
viewport.unproject(touchPos);
7388

74-
// Chuyển đổi tọa độ màn hình -> tọa độ thế giới game (quan trọng!)
75-
camera.unproject(touchPos);
89+
if (Gdx.input.isKeyJustPressed(Input.Keys.SPACE)) {
90+
soundManager.stop(); // Stop main menu music
91+
game.launchScreen(new GameScreen(game));
92+
} else if (Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) {
93+
Gdx.app.exit();
94+
}
7695

77-
// Transition to game screen on input
7896
if (startButton.isClicked(touchPos.x, touchPos.y)) {
79-
soundManager.stop(); // Stop main menu music
8097
game.launchScreen(new GameScreen(game));
8198
}
8299

@@ -89,7 +106,7 @@ public void render(float delta) {
89106

90107
@Override
91108
public void resize(int width, int height) {
92-
109+
viewport.update(width, height);
93110
}
94111

95112
@Override

0 commit comments

Comments
 (0)