Feat: Add intro video #332

Merged
jona.walpert merged 1 commits from feat/141-intro-video-fullscreen-startup into main 2026-05-13 23:49:08 +02:00
3 changed files with 114 additions and 16 deletions
@@ -0,0 +1,91 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui;
import ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui.Casinomainui;
import java.net.URL;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/** Plays an intro video in fullscreen and then starts the main UI. */
public class IntroVideoPlayer extends Application {
private static final Logger LOGGER = LogManager.getLogger(IntroVideoPlayer.class);
private Stage videoStage;
@Override
public void start(Stage stage) {
this.videoStage = stage;
URL videoUrl = getClass().getResource("/images/placeholder-animation.mp4");
if (videoUrl == null) {
LOGGER.error("Video file not found!");
Platform.exit();
return;
}
Media media = new Media(videoUrl.toExternalForm());
MediaPlayer mediaPlayer = new MediaPlayer(media);
MediaView mediaView = new MediaView(mediaPlayer);
StackPane root = new StackPane(mediaView);
Rectangle2D screenBounds = Screen.getPrimary().getBounds();
Scene scene = new Scene(root, screenBounds.getWidth(), screenBounds.getHeight());
// scale video automatically
mediaView.setPreserveRatio(true);
mediaView.setFitWidth(screenBounds.getWidth());
mediaView.setFitHeight(screenBounds.getHeight());
stage.initStyle(StageStyle.UNDECORATED);
stage.setFullScreen(true);
stage.setScene(scene);
stage.show();
mediaPlayer.setOnEndOfMedia(this::onVideoEnd);
mediaPlayer.play();
}
private void onVideoEnd() {
videoStage.close();
setSystemProperties();
startMainUI();
}
private void setSystemProperties() {
var params = getParameters().getRaw();
if (params == null || params.isEmpty()) {
return;
}
String arg = params.get(0);
String[] parts = arg.split(":", 2);
if (parts.length == 2) {
System.setProperty("casono.server.host", parts[0]);
System.setProperty("casono.server.port", parts[1]);
}
}
private void startMainUI() {
Stage mainStage = new Stage();
try {
new Casinomainui().start(mainStage);
} catch (Exception e) {
e.printStackTrace();
Platform.exit();
}
}
}
@@ -1,13 +1,8 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui;
import ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui.Casinomainui;
import javafx.application.Application;
/**
* Launcher for the Casono main UI.
*
* <p>Default constructor for the application.
*/
/** Launcher for the Casono intro animation. */
public class Launcher {
/** Default constructor. */
@@ -21,6 +16,6 @@ public class Launcher {
* @param args Command line arguments
*/
public static void main(String[] args) {
Application.launch(Casinomainui.class, args);
Application.launch(IntroVideoPlayer.class, args);
}
}
@@ -32,15 +32,9 @@ public class Casinomainui extends Application {
public void start(Stage stage) throws IOException {
// If the launcher passed an address argument (ip:port), expose it as
// system properties so controllers can read it without embedding defaults.
var raw = getParameters().getRaw();
if (raw != null && raw.size() > 0) {
String arg = raw.get(0);
String[] parts = arg.split(":", 2);
if (parts.length == 2) {
System.setProperty("casono.server.host", parts[0]);
System.setProperty("casono.server.port", parts[1]);
}
}
var params = getParameters();
processServerParameters(params);
FXMLLoader fxmlLoader =
new FXMLLoader(getClass().getResource("/ui-structure/Casinomainui.fxml"));
Scene scene = new Scene(fxmlLoader.load(), SCENE_WIDTH, SCENE_HEIGHT);
@@ -54,6 +48,24 @@ public class Casinomainui extends Application {
stage.show();
}
private void processServerParameters(Application.Parameters params) {
if (params == null) {
return;
}
var raw = params.getRaw();
if (raw == null || raw.isEmpty()) {
return;
}
String arg = raw.get(0);
String[] parts = arg.split(":", 2);
if (parts.length == 2) {
System.setProperty("casono.server.host", parts[0]);
System.setProperty("casono.server.port", parts[1]);
}
}
/**
* Main entry point for launching the application.
*