Skip to content

Commit 81f4928

Browse files
Refac
1 parent 38ecbc5 commit 81f4928

File tree

14 files changed

+171
-121
lines changed

14 files changed

+171
-121
lines changed

pacman-app-arcade-mspacman/src/main/java/de/amr/pacmanfx/arcade/ms_pacman/scenes/ArcadeMsPacMan_IntroScene.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import de.amr.pacmanfx.ui._2d.GameScene2D;
1919
import de.amr.pacmanfx.ui.api.GameUI;
2020
import de.amr.pacmanfx.ui.sound.SoundID;
21+
import javafx.scene.canvas.GraphicsContext;
2122
import javafx.scene.paint.Color;
2223

2324
import java.util.List;
@@ -130,7 +131,10 @@ public void onCreditAdded(GameEvent e) {
130131

131132
@Override
132133
public void drawSceneContent() {
133-
ctx().setFont(scaledArcadeFont8());
134+
GraphicsContext ctx = gameRenderer.ctx().orElse(null);
135+
if (ctx == null) return;
136+
137+
ctx.setFont(scaledArcadeFont8());
134138
gameRenderer.fillTextAtScaledPosition(TITLE, ARCADE_ORANGE, TITLE_X, TITLE_Y);
135139
gameRenderer.drawActor(marquee);
136140
ghosts.forEach(gameRenderer::drawActor);

pacman-app-arcade-mspacman/src/main/java/de/amr/pacmanfx/arcade/ms_pacman/scenes/ArcadeMsPacMan_StartScene.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import de.amr.pacmanfx.ui.api.GameUI;
1313
import de.amr.pacmanfx.ui.sound.SoundID;
1414
import de.amr.pacmanfx.uilib.assets.SpriteSheet;
15+
import javafx.scene.canvas.GraphicsContext;
1516

1617
import static de.amr.pacmanfx.Globals.TS;
1718
import static de.amr.pacmanfx.arcade.pacman.ArcadePacMan_UIConfig.ARCADE_MAP_SIZE_IN_PIXELS;
@@ -60,8 +61,11 @@ public void onCreditAdded(GameEvent e) {
6061

6162
@Override
6263
public void drawSceneContent() {
63-
ctx().setFill(ARCADE_ORANGE);
64-
ctx().setFont(scaledArcadeFont8());
64+
GraphicsContext ctx = gameRenderer.ctx().orElse(null);
65+
if (ctx == null) return;
66+
67+
ctx.setFill(ARCADE_ORANGE);
68+
ctx.setFont(scaledArcadeFont8());
6569
gameRenderer.fillTextAtScaledPosition("PUSH START BUTTON", TS*6, TS*16);
6670
gameRenderer.fillTextAtScaledPosition("1 PLAYER ONLY", TS*8, TS*18);
6771
gameRenderer.fillTextAtScaledPosition("ADDITIONAL AT 10000", TS*2, TS*25);

pacman-app-arcade-pacman/src/main/java/de/amr/pacmanfx/arcade/pacman/scenes/ArcadePacMan_BootScene2D.java

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,17 @@ private void drawRandomHexDigits() {
8787
var random = new Random();
8888
int numRows = (int) (ARCADE_MAP_SIZE_IN_PIXELS.y() / TS);
8989
int numCols = (int) (ARCADE_MAP_SIZE_IN_PIXELS.x() / TS);
90-
ctx().setFill(ARCADE_WHITE);
91-
ctx().setFont(scaledArcadeFont8());
92-
for (int row = 0; row < numRows; ++row) {
93-
double y = scaled(TS(row + 1));
94-
for (int col = 0; col < numCols; ++col) {
95-
int hexDigit = random.nextInt(16);
96-
ctx().fillText(Integer.toHexString(hexDigit), scaled(TS(col)), y);
90+
gameRenderer.ctx().ifPresent(ctx -> {
91+
ctx.setFill(ARCADE_WHITE);
92+
ctx.setFont(scaledArcadeFont8());
93+
for (int row = 0; row < numRows; ++row) {
94+
double y = scaled(TS(row + 1));
95+
for (int col = 0; col < numCols; ++col) {
96+
int hexDigit = random.nextInt(16);
97+
ctx.fillText(Integer.toHexString(hexDigit), scaled(TS(col)), y);
98+
}
9799
}
98-
}
100+
});
99101
}
100102

101103
private void drawRandomSpriteFragments() {
@@ -121,21 +123,23 @@ private RectShort randomSpriteFragment() {
121123
}
122124

123125
private void drawGridLines() {
124-
double gridWidth = scaled(ARCADE_MAP_SIZE_IN_PIXELS.x());
125-
double gridHeight = scaled(ARCADE_MAP_SIZE_IN_PIXELS.y());
126-
int numRows = (int) (ARCADE_MAP_SIZE_IN_PIXELS.y() / 16);
127-
int numCols = (int) (ARCADE_MAP_SIZE_IN_PIXELS.x() / 16);
128-
double thin = scaled(2), thick = scaled(4);
129-
ctx().setStroke(ARCADE_WHITE);
130-
for (int row = 0; row <= numRows; ++row) {
131-
ctx().setLineWidth(row == 0 || row == numRows ? thick : thin);
132-
double y = scaled(row * 16);
133-
ctx().strokeLine(0, y, gridWidth, y);
134-
}
135-
for (int col = 0; col <= numCols; ++col) {
136-
ctx().setLineWidth(col == 0 || col == numCols ? thick : thin);
137-
double x = scaled(col * 16);
138-
ctx().strokeLine(x, 0, x, gridHeight);
139-
}
126+
gameRenderer.ctx().ifPresent(ctx -> {
127+
double gridWidth = scaled(ARCADE_MAP_SIZE_IN_PIXELS.x());
128+
double gridHeight = scaled(ARCADE_MAP_SIZE_IN_PIXELS.y());
129+
int numRows = (int) (ARCADE_MAP_SIZE_IN_PIXELS.y() / 16);
130+
int numCols = (int) (ARCADE_MAP_SIZE_IN_PIXELS.x() / 16);
131+
double thin = scaled(2), thick = scaled(4);
132+
ctx.setStroke(ARCADE_WHITE);
133+
for (int row = 0; row <= numRows; ++row) {
134+
ctx.setLineWidth(row == 0 || row == numRows ? thick : thin);
135+
double y = scaled(row * 16);
136+
ctx.strokeLine(0, y, gridWidth, y);
137+
}
138+
for (int col = 0; col <= numCols; ++col) {
139+
ctx.setLineWidth(col == 0 || col == numCols ? thick : thin);
140+
double x = scaled(col * 16);
141+
ctx.strokeLine(x, 0, x, gridHeight);
142+
}
143+
});
140144
}
141145
}

pacman-app-arcade-pacman/src/main/java/de/amr/pacmanfx/arcade/pacman/scenes/ArcadePacMan_IntroScene.java

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import de.amr.pacmanfx.ui.api.GameUI;
2222
import de.amr.pacmanfx.ui.sound.SoundID;
2323
import de.amr.pacmanfx.uilib.assets.SpriteSheet;
24+
import javafx.scene.canvas.GraphicsContext;
2425
import javafx.scene.paint.Color;
26+
import org.tinylog.Logger;
2527

2628
import java.util.ArrayList;
2729
import java.util.List;
@@ -121,27 +123,32 @@ public void onCreditAdded(GameEvent e) {
121123

122124
@Override
123125
public void drawSceneContent() {
126+
GraphicsContext ctx = gameRenderer.ctx().orElse(null);
127+
if (ctx == null) {
128+
Logger.error("Cannot draw scene content, no canvas assigned to game renderer");
129+
return;
130+
}
124131
drawGallery();
125132
switch (sceneController.state()) {
126133
case STARTING, PRESENTING_GHOSTS -> {}
127-
case SHOWING_PELLET_POINTS -> drawPoints();
134+
case SHOWING_PELLET_POINTS -> drawPoints(ctx);
128135
case CHASING_PAC -> {
129-
drawPoints();
130-
drawBlinkingEnergizer(TS(LEFT_TILE_X), TS(20));
131-
drawGuys(true);
136+
drawPoints(ctx);
137+
drawBlinkingEnergizer(ctx, TS(LEFT_TILE_X), TS(20));
138+
drawGuys(ctx, true);
132139
gameRenderer.fillTextAtScaledTilePosition(MIDWAY_MFG_CO, ARCADE_PINK, scaledArcadeFont8(), 4, 32);
133140
}
134141
case CHASING_GHOSTS, READY_TO_PLAY -> {
135-
drawPoints();
136-
drawGuys(false);
142+
drawPoints(ctx);
143+
drawGuys(ctx, false);
137144
gameRenderer.fillTextAtScaledTilePosition(MIDWAY_MFG_CO, ARCADE_PINK, scaledArcadeFont8(), 4, 32);
138145
}
139146
}
140147
}
141148

142149
private void drawGallery() {
143150
@SuppressWarnings("unchecked") SpriteSheet<SpriteID> spriteSheet = (SpriteSheet<SpriteID>) ui.currentConfig().spriteSheet();
144-
ctx().setFont(scaledArcadeFont8());
151+
gameRenderer.ctx().ifPresent(ctx -> ctx.setFont(scaledArcadeFont8()));
145152
if (titleVisible) {
146153
gameRenderer.fillTextAtScaledPosition("CHARACTER / NICKNAME", ARCADE_WHITE,
147154
TS(LEFT_TILE_X + 3), TS(6));
@@ -163,52 +170,53 @@ private void drawGallery() {
163170
}
164171

165172
// TODO make shaking effect look exactly as in original game, find out what's exactly is going on here
166-
private void drawGuys(boolean shaking) {
173+
private void drawGuys(GraphicsContext ctx, boolean shaking) {
167174
long tick = sceneController.state().timer().tickCount();
168175
int shakingAmount = shaking ? (tick % 5 < 2 ? 0 : -1) : 0;
169176
if (shakingAmount == 0) {
170177
ghosts.forEach(gameRenderer::drawActor);
171178
} else {
172179
gameRenderer.drawActor(ghosts.get(RED_GHOST_SHADOW));
173180
gameRenderer.drawActor(ghosts.get(ORANGE_GHOST_POKEY));
174-
ctx().save();
175-
ctx().translate(shakingAmount, 0);
181+
ctx.save();
182+
ctx.translate(shakingAmount, 0);
176183
gameRenderer.drawActor(ghosts.get(PINK_GHOST_SPEEDY));
177184
gameRenderer.drawActor(ghosts.get(CYAN_GHOST_BASHFUL));
178-
ctx().restore();
185+
ctx.restore();
179186
}
180187
gameRenderer.drawActor(pacMan);
181188
}
182189

183-
private void drawPoints() {
184-
ctx().setFill(ARCADE_ROSE);
190+
private void drawPoints(GraphicsContext ctx) {
191+
ctx.setFill(ARCADE_ROSE);
185192
// normal pellet
186-
ctx().fillRect(scaled(TS(LEFT_TILE_X + 6) + 4), scaled(TS(24) + 4), scaled(2), scaled(2));
193+
ctx.fillRect(scaled(TS(LEFT_TILE_X + 6) + 4), scaled(TS(24) + 4), scaled(2), scaled(2));
187194
gameRenderer.fillTextAtScaledTilePosition("10", ARCADE_WHITE, scaledArcadeFont8(), LEFT_TILE_X + 8, 25);
188195
gameRenderer.fillTextAtScaledTilePosition("PTS", ARCADE_WHITE, scaledArcadeFont6(), LEFT_TILE_X + 11, 25);
189196
// energizer
190-
drawBlinkingEnergizer(TS(LEFT_TILE_X + 6), TS(26));
197+
drawBlinkingEnergizer(ctx, TS(LEFT_TILE_X + 6), TS(26));
191198
gameRenderer.fillTextAtScaledTilePosition("50", ARCADE_WHITE, scaledArcadeFont8(), LEFT_TILE_X + 8, 27);
192199
gameRenderer.fillTextAtScaledTilePosition("PTS", ARCADE_WHITE, scaledArcadeFont6(), LEFT_TILE_X + 11, 27);
193200
}
194201

195-
private void drawBlinkingEnergizer(double x, double y) {
202+
private void drawBlinkingEnergizer(GraphicsContext ctx, double x, double y) {
196203
if (blinking.isOn()) {
197-
ctx().save();
198-
ctx().scale(scaling(), scaling());
199-
ctx().setFill(ARCADE_ROSE);
204+
ctx.save();
205+
ctx.scale(scaling(), scaling());
206+
ctx.setFill(ARCADE_ROSE);
200207
// draw pixelated "circle"
201-
ctx().fillRect(x + 2, y, 4, 8);
202-
ctx().fillRect(x, y + 2, 8, 4);
203-
ctx().fillRect(x + 1, y + 1, 6, 6);
204-
ctx().restore();
208+
ctx.fillRect(x + 2, y, 4, 8);
209+
ctx.fillRect(x, y + 2, 8, 4);
210+
ctx.fillRect(x + 1, y + 1, 6, 6);
211+
ctx.restore();
205212
}
206213
}
207214

208215
@Override
209216
protected void drawDebugInfo() {
210217
super.drawDebugInfo();
211-
ctx().fillText("Scene timer %d".formatted(sceneController.state().timer().tickCount()), 0, scaled(5 * TS));
218+
gameRenderer.ctx().ifPresent(ctx -> ctx.fillText("Scene timer %d"
219+
.formatted(sceneController.state().timer().tickCount()), 0, scaled(5 * TS)));
212220
}
213221

214222
private enum SceneState implements FsmState<ArcadePacMan_IntroScene> {

pacman-app-arcade-pacman/src/main/java/de/amr/pacmanfx/arcade/pacman/scenes/ArcadePacMan_PlayScene2D.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import de.amr.pacmanfx.ui.api.GameScene;
2424
import de.amr.pacmanfx.ui.api.GameUI;
2525
import de.amr.pacmanfx.ui.sound.SoundID;
26+
import javafx.scene.canvas.GraphicsContext;
2627
import javafx.scene.control.CheckMenuItem;
2728
import javafx.scene.control.ContextMenu;
2829
import javafx.scene.control.MenuItem;
@@ -267,34 +268,37 @@ private void drawLevelMessageCenteredUnderHouse(House house, byte messageType) {
267268

268269
@Override
269270
protected void drawDebugInfo() {
271+
GraphicsContext ctx = gameRenderer.ctx().orElse(null);
272+
if (ctx == null) return;
273+
270274
gameRenderer.drawTileGrid(sizeInPx().x(), sizeInPx().y(), Color.LIGHTGRAY);
271275
if (gameContext().optGameLevel().isPresent()) {
272276
// assuming all ghosts have the same set of special terrain tiles
273277
gameContext().gameLevel().ghost(RED_GHOST_SHADOW).specialTerrainTiles().forEach(tile -> {
274278
double x = scaled(tile.x() * TS), y = scaled(tile.y() * TS + HTS), size = scaled(TS);
275-
ctx().setFill(Color.RED);
276-
ctx().fillRect(x, y, size, 2);
279+
ctx.setFill(Color.RED);
280+
ctx.fillRect(x, y, size, 2);
277281
});
278282
// mark intersection tiles
279283
gameContext().gameLevel().worldMap().tiles().filter(gameContext().gameLevel()::isIntersection).forEach(tile -> {
280-
ctx().setStroke(Color.gray(0.8));
281-
ctx().setLineWidth(0.5);
282-
ctx().save();
284+
ctx.setStroke(Color.gray(0.8));
285+
ctx.setLineWidth(0.5);
286+
ctx.save();
283287
double cx = scaled(tile.x() * TS + HTS), cy = scaled(tile.y() * TS + HTS), size = scaled(HTS);
284-
ctx().translate(cx, cy);
285-
ctx().rotate(45);
286-
ctx().strokeRect(-0.5*size, -0.5*size, size, size);
287-
ctx().restore();
288+
ctx.translate(cx, cy);
289+
ctx.rotate(45);
290+
ctx.strokeRect(-0.5*size, -0.5*size, size, size);
291+
ctx.restore();
288292
});
289-
ctx().setFill(debugTextFill);
290-
ctx().setFont(debugTextFont);
293+
ctx.setFill(debugTextFill);
294+
ctx.setFont(debugTextFont);
291295
String gameStateText = gameContext().gameState().name() + " (Tick %d)".formatted(gameContext().gameState().timer().tickCount());
292296
String huntingPhaseText = "";
293297
if (gameContext().gameState() == GamePlayState.HUNTING) {
294298
HuntingTimer huntingTimer = gameContext().game().huntingTimer();
295299
huntingPhaseText = " %s (Tick %d)".formatted(huntingTimer.phase(), huntingTimer.tickCount());
296300
}
297-
ctx().fillText("%s%s".formatted(gameStateText, huntingPhaseText), 0, 64);
301+
ctx.fillText("%s%s".formatted(gameStateText, huntingPhaseText), 0, 64);
298302
}
299303
}
300304

pacman-app-tengen-mspacman/src/main/java/de/amr/pacmanfx/tengen/ms_pacman/scenes/TengenMsPacMan_BootScene.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import de.amr.pacmanfx.ui._2d.GameRenderer;
1414
import de.amr.pacmanfx.ui._2d.GameScene2D;
1515
import de.amr.pacmanfx.ui.api.GameUI;
16+
import javafx.scene.canvas.GraphicsContext;
1617
import javafx.scene.paint.Color;
1718
import javafx.scene.text.Font;
1819

@@ -123,8 +124,11 @@ public void drawSceneContent() {
123124
@Override
124125
protected void drawDebugInfo() {
125126
super.drawDebugInfo();
126-
ctx().setFill(Color.WHITE);
127-
ctx().setFont(Font.font(20));
128-
ctx().fillText("Tick " + tick, 20, 20);
127+
GraphicsContext ctx = gameRenderer.ctx().orElse(null);
128+
if (ctx == null) return;
129+
130+
ctx.setFill(Color.WHITE);
131+
ctx.setFont(Font.font(20));
132+
ctx.fillText("Tick " + tick, 20, 20);
129133
}
130134
}

pacman-app-tengen-mspacman/src/main/java/de/amr/pacmanfx/tengen/ms_pacman/scenes/TengenMsPacMan_CreditsScene.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ public TengenMsPacMan_GameRenderer renderer() {
5555

5656
@Override
5757
public void drawSceneContent() {
58+
renderer().ctx().ifPresent(ctx -> ctx.setFont(scaledArcadeFont8()));
5859
double barWidth = sizeInPx().x();
5960
renderer().drawBar(nesPaletteColor(0x20), nesPaletteColor(0x13), barWidth, 20);
6061
renderer().drawBar(nesPaletteColor(0x20), nesPaletteColor(0x13), barWidth, 212);
61-
ctx().setFont(scaledArcadeFont8());
6262
int y = 7 * TS;
6363
if (gameContext().gameState().timer().betweenSeconds(0.5 * DISPLAY_SECONDS, DISPLAY_SECONDS)) {
6464
renderer().fillTextAtScaledPosition("CREDITS FOR JAVAFX REMAKE", nesPaletteColor(0x20), 3 * TS, y);

pacman-app-tengen-mspacman/src/main/java/de/amr/pacmanfx/tengen/ms_pacman/scenes/TengenMsPacMan_GameLevel3D.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ private void addGameInfoView() {
3737
fillCanvas(canvas, PROPERTY_3D_FLOOR_COLOR.get());
3838

3939
var renderer = (TengenMsPacMan_GameRenderer) ui.currentConfig().createGameRenderer(canvas);
40-
renderer.ctx().setImageSmoothing(false); // important for sharp image!
40+
renderer.ctx().ifPresent(ctx -> ctx.setImageSmoothing(false)); // important for sharp image!
4141
renderer.setScaling(scaling);
4242
renderer.drawGameOptions(game.mapCategory(), game.difficulty(), game.pacBooster(), 0.5 * width, TS + HTS);
4343
renderer.drawLevelNumberBox(gameLevel.number(), 0, 0);

0 commit comments

Comments
 (0)