Skip to content
Snippets Groups Projects
Commit 3fe2e190 authored by jez04's avatar jez04
Browse files

feat: :tada: solution

parent 3a7fc2aa
No related merge requests found
Showing
with 96 additions and 36 deletions
package lab;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Random;
import java.util.ServiceLoader;
import cz.vsb.fei.java2.lab02.common.ScoreStorageInterface;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.stage.Modality;
import javafx.scene.control.Alert.AlertType;
public class ScoreStorageFactory {
private static ScoreStorageInterface instance;
private ScoreStorageFactory() {
/* hide public one constructor */
}
public static ScoreStorageInterface getInstance() {
if (instance == null) {
List<ScoreStorageInterface> availableImplementations = new ArrayList<>();
ServiceLoader.load(ScoreStorageInterface.class).forEach(availableImplementations::add);
if (availableImplementations.isEmpty()) {
throw new NoSuchElementException(
"Service loader did not find any implementation of interface ScoreStorageInterface.");
}
instance = availableImplementations.get(new Random().nextInt(availableImplementations.size()));
Alert info = new Alert(AlertType.INFORMATION,
String.format("Storage %s selected.", instance.getClass().getName()), ButtonType.OK);
info.initModality(Modality.WINDOW_MODAL);
info.showAndWait();
}
return instance;
}
}
package lab; package lab.game;
import javafx.geometry.Point2D; import javafx.geometry.Point2D;
import javafx.geometry.Rectangle2D; import javafx.geometry.Rectangle2D;
......
package lab; package lab.game;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
......
package lab; package lab.game;
import javafx.geometry.Point2D; import javafx.geometry.Point2D;
import javafx.scene.canvas.GraphicsContext; import javafx.scene.canvas.GraphicsContext;
......
package lab; package lab.game;
import javafx.geometry.Rectangle2D; import javafx.geometry.Rectangle2D;
......
package lab; package lab.game;
import javafx.scene.canvas.GraphicsContext; import javafx.scene.canvas.GraphicsContext;
......
package lab; package lab.game;
import javafx.animation.AnimationTimer; import javafx.animation.AnimationTimer;
import javafx.scene.canvas.Canvas; import javafx.scene.canvas.Canvas;
......
package lab; package lab.game;
@FunctionalInterface @FunctionalInterface
public interface HitListener { public interface HitListener {
......
package lab; package lab.game;
public class Routines { public class Routines {
......
package lab; package lab.game;
import java.util.Random; import java.util.Random;
......
package lab; package lab.game;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
......
package lab; package lab.game;
import javafx.geometry.Point2D; import javafx.geometry.Point2D;
import javafx.scene.canvas.GraphicsContext; import javafx.scene.canvas.GraphicsContext;
......
package lab; package lab.gui;
import javafx.application.Application; import javafx.application.Application;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
...@@ -24,7 +24,7 @@ public class App extends Application { ...@@ -24,7 +24,7 @@ public class App extends Application {
public void start(Stage primaryStage) { public void start(Stage primaryStage) {
try { try {
// Construct a main window with a canvas. // Construct a main window with a canvas.
FXMLLoader gameLoader = new FXMLLoader(getClass().getResource("/lab/gameWindow.fxml")); FXMLLoader gameLoader = new FXMLLoader(getClass().getResource("/lab/gui/gameWindow.fxml"));
Parent root = gameLoader.load(); Parent root = gameLoader.load();
GameController gameController = gameLoader.getController(); GameController gameController = gameLoader.getController();
Scene scene = new Scene(root); Scene scene = new Scene(root);
......
package lab; package lab.gui;
import java.util.List; import java.util.List;
import cz.vsb.fei.java2.lab02.common.Score;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.geometry.Point2D; import javafx.geometry.Point2D;
...@@ -12,6 +13,10 @@ import javafx.scene.control.Slider; ...@@ -12,6 +13,10 @@ import javafx.scene.control.Slider;
import javafx.scene.control.TableColumn; import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView; import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.control.cell.PropertyValueFactory;
import lab.ScoreStorageFactory;
import lab.game.BulletAnimated;
import lab.game.DrawingThread;
import lab.game.World;
public class GameController { public class GameController {
...@@ -112,11 +117,10 @@ public class GameController { ...@@ -112,11 +117,10 @@ public class GameController {
nickColumn.setCellValueFactory(new PropertyValueFactory<>("name")); nickColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
pointsColumn.setCellValueFactory(new PropertyValueFactory<>("points")); pointsColumn.setCellValueFactory(new PropertyValueFactory<>("points"));
initDB(); initStorage();
} }
private void initDB() { private void initStorage() {
//Stream.generate(Score::generate).limit(10).toList();
ScoreStorageFactory.getInstance().init(); ScoreStorageFactory.getInstance().init();
scores.getItems().addAll(ScoreStorageFactory.getInstance().getAll()); scores.getItems().addAll(ScoreStorageFactory.getInstance().getAll());
} }
......
import cz.vsb.fei.java2.lab02.common.ScoreStorageInterface;
module cz.vsb.fei.java2.lab02_module {
requires transitive javafx.controls;
requires javafx.fxml;
requires javafx.base;
requires cz.vsb.fei.java2.lab02.common_module;
opens lab.gui to javafx.fxml;
exports lab.gui to javafx.fxml,javafx.graphics;
uses ScoreStorageInterface;
}
\ No newline at end of file
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
<?import javafx.scene.Cursor?> <?import javafx.scene.Cursor?>
<?import javafx.scene.canvas.Canvas?> <?import javafx.scene.canvas.Canvas?>
<?import javafx.scene.control.Button?> <?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Slider?> <?import javafx.scene.control.Slider?>
<?import javafx.scene.control.TableColumn?> <?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?> <?import javafx.scene.control.TableView?>
...@@ -13,28 +14,33 @@ ...@@ -13,28 +14,33 @@
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?> <?import javafx.scene.text.Font?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="388.0" prefWidth="911.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="lab.GameController"> <BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="388.0" prefWidth="911.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="lab.gui.GameController">
<bottom> <bottom>
<HBox alignment="TOP_CENTER" prefHeight="66.0" prefWidth="866.0" BorderPane.alignment="CENTER"> <VBox BorderPane.alignment="CENTER">
<children> <children>
<Slider fx:id="angle" majorTickUnit="15.0" max="90.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minorTickCount="5" showTickLabels="true" showTickMarks="true" HBox.hgrow="ALWAYS" /> <Label fx:id="hits" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" text="Hits count: 0" VBox.vgrow="ALWAYS" />
<Button mnemonicParsing="false" onAction="#fire" style="-fx-background-color: RED;" text="Fire" textAlignment="CENTER"> <HBox alignment="TOP_CENTER" prefHeight="66.0" prefWidth="866.0">
<font> <children>
<Font name="System Bold" size="24.0" /> <Slider fx:id="angle" majorTickUnit="15.0" max="90.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minorTickCount="5" showTickLabels="true" showTickMarks="true" HBox.hgrow="ALWAYS" />
</font> <Button mnemonicParsing="false" onAction="#fire" style="-fx-background-color: RED;" text="Fire" textAlignment="CENTER">
<cursor> <font>
<Cursor fx:constant="CROSSHAIR" /> <Font name="System Bold" size="24.0" />
</cursor> </font>
<opaqueInsets> <cursor>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> <Cursor fx:constant="CROSSHAIR" />
</opaqueInsets> </cursor>
<HBox.margin> <opaqueInsets>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" /> <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</HBox.margin> </opaqueInsets>
</Button> <HBox.margin>
<Slider fx:id="speed" max="200.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" min="50.0" minorTickCount="5" showTickLabels="true" showTickMarks="true" value="50.0" HBox.hgrow="ALWAYS" /> <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</HBox.margin>
</Button>
<Slider fx:id="speed" max="200.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" min="50.0" minorTickCount="5" showTickLabels="true" showTickMarks="true" value="50.0" HBox.hgrow="ALWAYS" />
</children>
</HBox>
</children> </children>
</HBox> </VBox>
</bottom> </bottom>
<left> <left>
<StackPane style="-fx-border-image-width: 3px; -fx-border-style: SOLID;" BorderPane.alignment="CENTER"> <StackPane style="-fx-border-image-width: 3px; -fx-border-style: SOLID;" BorderPane.alignment="CENTER">
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment