Skip to content

Commit e5ee84f

Browse files
committed
Add name entry for high scores
1 parent 839e198 commit e5ee84f

File tree

5 files changed

+83
-6
lines changed

5 files changed

+83
-6
lines changed

src/components/Game.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ConnectDevice } from "./ConnectDevice";
55
import { GameScene } from "../game/scenes/GameScene";
66
import { MenuScene } from "../game/scenes/MenuScene";
77
import { GameOverScene } from "../game/scenes/GameOverScene";
8+
import { NameEntryScene } from "../game/scenes/NameEntryScene";
89

910
const Game = () => {
1011
const [device, setDevice] = useState<HIDDevice | null>(null);
@@ -26,7 +27,7 @@ const Game = () => {
2627
const initTimer = setTimeout(() => {
2728
gameRef.current = new Phaser.Game({
2829
...config,
29-
scene: [MenuScene, GameScene, GameOverScene],
30+
scene: [MenuScene, GameScene, GameOverScene, NameEntryScene],
3031
});
3132
}, 50);
3233

src/game/config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Phaser from "phaser";
22
import { GameScene } from "./scenes/GameScene";
33
import { GameOverScene } from "./scenes/GameOverScene";
44
import { MenuScene } from "./scenes/MenuScene";
5+
import { NameEntryScene } from "./scenes/NameEntryScene";
56

67
export const gameConfig: Phaser.Types.Core.GameConfig = {
78
type: Phaser.AUTO,
@@ -16,7 +17,7 @@ export const gameConfig: Phaser.Types.Core.GameConfig = {
1617
debug: false,
1718
},
1819
},
19-
scene: [MenuScene, GameScene, GameOverScene],
20+
scene: [MenuScene, GameScene, GameOverScene, NameEntryScene],
2021
scale: {
2122
parent: "game-container",
2223
},

src/game/scenes/GameOverScene.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,16 @@ export class GameOverScene extends Phaser.Scene {
3131
.setOrigin(0.5);
3232

3333
this.add
34-
.text(width / 2, height / 2 + 16, "Press Enter to continue", {
34+
.text(width / 2, height / 2 + 16, "Press Space to continue", {
3535
fontFamily: "Monogram",
3636
fontSize: "16px",
3737
color: "#0f380f",
3838
})
3939
.setOrigin(0.5);
4040
});
4141

42-
this.input.keyboard?.once("keydown-ENTER", () =>
43-
this.scene.start("MenuScene")
42+
this.input.keyboard?.once("keydown-SPACE", () =>
43+
this.scene.start("NameEntryScene", { score: this.score })
4444
);
4545
}
4646
}

src/game/scenes/MenuScene.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export class MenuScene extends Phaser.Scene {
8383
this.updateCursor();
8484
});
8585

86-
this.input.keyboard?.on("keydown-ENTER", () => {
86+
this.input.keyboard?.on("keydown-SPACE", () => {
8787
this.selectOption();
8888
});
8989
}

src/game/scenes/NameEntryScene.ts

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import Phaser from "phaser";
2+
3+
export class NameEntryScene extends Phaser.Scene {
4+
private enteredName: string = "";
5+
private score: number = 0;
6+
private nameText!: Phaser.GameObjects.Text;
7+
8+
constructor() {
9+
super("NameEntryScene");
10+
}
11+
12+
init(data: { score: number }) {
13+
this.score = data.score;
14+
}
15+
16+
create() {
17+
const { width, height } = this.cameras.main;
18+
19+
document.fonts.load('20px "Monogram"').then(() => {
20+
this.add
21+
.text(width / 2, 10, "ENTER YOUR INITIALS", {
22+
fontFamily: "Monogram",
23+
fontSize: "20px",
24+
color: "#0f380f",
25+
})
26+
.setOrigin(0.5);
27+
28+
this.add
29+
.text(width / 2, height - 24, "Confirm: SPACE", {
30+
fontFamily: "Monogram",
31+
fontSize: "20px",
32+
color: "#0f380f",
33+
})
34+
.setOrigin(0.5);
35+
36+
this.nameText = this.add
37+
.text(width / 2, height / 2, `${this.nameText ?? ""}`, {
38+
fontFamily: "Monogram",
39+
fontSize: "20px",
40+
color: "#0f380f",
41+
})
42+
.setOrigin(0.5);
43+
44+
this.input.keyboard?.on("keydown", (event: KeyboardEvent) => {
45+
const key = event.key;
46+
if (/^[a-zA-Z]$/.test(key) && this.enteredName.length < 3) {
47+
this.enteredName += key.toUpperCase();
48+
this.updateNameDisplay();
49+
} else if (event.key === "Backspace" && this.enteredName.length > 0) {
50+
this.enteredName = this.enteredName.slice(0, -1);
51+
this.updateNameDisplay();
52+
} else if (event.key === " ") {
53+
this.saveScore();
54+
this.scene.start("MenuScene");
55+
}
56+
});
57+
});
58+
}
59+
60+
updateNameDisplay() {
61+
this.nameText.setText(this.enteredName);
62+
}
63+
64+
saveScore() {
65+
const newEntry = { name: this.enteredName, score: this.score };
66+
const stored = localStorage.getItem("switchy-hiscores");
67+
let scores = stored ? JSON.parse(stored) : [];
68+
69+
scores.push(newEntry);
70+
scores.sort((a: any, b: any) => b.score - a.score);
71+
scores = scores.slice(0, 5); // Keep only top 5 scores
72+
73+
localStorage.setItem("switchy-hiscores", JSON.stringify(scores));
74+
}
75+
}

0 commit comments

Comments
 (0)