Added a start menu, if you dont press R or M before anything it crashes but idk how to fix.

This commit is contained in:
Will_Allen 2026-07-08 15:36:18 +01:00
parent db4de8f791
commit 1c5f6d41ad
5 changed files with 845 additions and 889 deletions

View file

@ -24,6 +24,7 @@ import net.halbear.Terrain4J.EngineCore.Logic.Rendering.ModelLoader;
import net.halbear.Terrain4J.EngineCore.Main.Scene.*;
import net.halbear.Terrain4J.EngineCore.Main.Scene.GUIs.Gimbal;
import net.halbear.Terrain4J.EngineCore.Main.Scene.GUIs.LoadingScreen;
import net.halbear.Terrain4J.EngineCore.Main.Scene.GUIs.StartMenu;
import net.halbear.Terrain4J.EngineCore.Profiling.CPUMonitor;
import net.halbear.Terrain4J.EngineCore.Profiling.GPUProfiler;
import net.halbear.Terrain4J.EngineCore.Vulkan.GUI.GuiTexture;
@ -64,6 +65,8 @@ public class GameCore implements GameLogic {
public ModelData MelonaData;
public ILight SkyLight;
private LoadingScreen loadingScreen;
private final StartMenu startMenu = new StartMenu();
public boolean StartMenuActive = true;
public List<IMoveableActorComponent> ActorEditorComponents = new ArrayList<>();
private Gimbal gimbal;
private Vector2f DeltaPos = new Vector2f(0,0);
@ -156,6 +159,10 @@ public class GameCore implements GameLogic {
SpawnNewStaticActor(engineInstance, new Vector3f(x * 4f, -4 *(float)Math.random(), y * 4f), new Vector3f(0,0,0),new Vector3f(1,1,1));
}
}
scene.RemoveActor(Musket);
scene.AddActor(Revolver);
Musket.AttachedCameraID = "NULL";
Revolver.AttachedCameraID = "DebugCamera";
return new InitData(models,materials,guiTextures);
}
@ -299,7 +306,12 @@ public class GameCore implements GameLogic {
| ImGuiWindowFlags.NoMove;
ImGui.newFrame();
if(LoadingLevel){
loadingScreen.RenderGUI(engineInstance,frameTimeNS,this);
loadingScreen.RenderGUI(engineInstance, frameTimeNS, this);
} else if (StartMenuActive) {
startMenu.RenderGUI(engineInstance, frameTimeNS, this);
if (startMenu.GameStarted) {
StartMenuActive = false;
}
} else {
engineInstance.scene().RenderGUIs(engineInstance, frameTimeNS, this);
if (ChangeGraphicsSettings) {

View file

@ -1,5 +1,6 @@
package net.halbear.Terrain4J.EngineCore.Main.Scene.GUIs;
import imgui.ImDrawList;
import imgui.ImGui;
import imgui.ImGuiViewport;
import imgui.flag.ImGuiCol;

View file

@ -0,0 +1,87 @@
package net.halbear.Terrain4J.EngineCore.Main.Scene.GUIs;
import imgui.ImDrawList;
import imgui.ImGui;
import imgui.ImGuiViewport;
import imgui.flag.ImGuiCol;
import imgui.flag.ImGuiCond;
import imgui.flag.ImGuiStyleVar;
import imgui.flag.ImGuiWindowFlags;
import imgui.type.ImFloat;
import net.halbear.Terrain4J.EngineCore.Logic.EngineConfig;
import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance;
import net.halbear.Terrain4J.EngineCore.Main.GameCore;
import net.halbear.Terrain4J.EngineCore.Main.PrimaryRuntime;
import net.halbear.Terrain4J.EngineCore.Main.Scene.GUIOverlay;
import net.halbear.Terrain4J.EngineCore.Vulkan.GUI.GuiTexture;
import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DisplayToScreen.DeferredSceneRender;
import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DisplayToScreen.ForwardSceneRender;
import net.halbear.Terrain4J.EngineCore.Main.AudioInstance;
import net.halbear.Terrain4J.EngineCore.Main.Scene.Scene;
import org.joml.Vector3f;
import org.tinylog.Logger;
public class StartMenu implements GUIOverlay {
public boolean GameStarted = false;
@Override
public void RenderGUI(EngineInstance engineInstance, long frameTimeNS, GameCore parent) {
if (GameStarted) return;
ImGuiViewport viewport = ImGui.getMainViewport();
int menuFlags = ImGuiWindowFlags.NoDecoration
| ImGuiWindowFlags.AlwaysAutoResize
| ImGuiWindowFlags.NoSavedSettings
| ImGuiWindowFlags.NoFocusOnAppearing
| ImGuiWindowFlags.NoNav
| ImGuiWindowFlags.NoMove;
float CenterX = viewport.getWorkPosX() + viewport.getWorkSizeX() / 2.0f;
float CenterY = viewport.getWorkPosY() + viewport.getWorkSizeY() / 2.0f;
ImGui.setNextWindowPos(viewport.getWorkPosX(), viewport.getWorkPosY(), ImGuiCond.Always);
ImGui.setNextWindowSize(viewport.getWorkSizeX(), viewport.getWorkSizeY());
ImGui.pushStyleColor(ImGuiCol.WindowBg, 0.08f, 0.08f, 0.1f, 1.0f);
ImGui.pushStyleVar(ImGuiStyleVar.WindowPadding, 40f, 30f);
ImGui.pushStyleVar(ImGuiStyleVar.ItemSpacing, 10f, 16f);
ImGui.pushStyleVar(ImGuiStyleVar.WindowRounding, 8f);
ImGui.begin("Start Menu", menuFlags);
ImGui.setWindowFontScale(8.0f);
float titleX = (viewport.getWorkSizeX() - ImGui.calcTextSize("Shooter Game").x) / 2.0f;
float titleY = viewport.getWorkSizeY() * 0.25f;
ImGui.setCursorPos(titleX, titleY);
ImGui.text("Shooter Game");
ImGui.setWindowFontScale(3.0f);
ImGui.spacing();
ImGui.spacing();
float buttonWidth = 450f;
float buttonHeight = 90f;
float buttonX = (viewport.getWorkSizeX() - buttonWidth) / 2.0f;
ImGui.setCursorPosX(buttonX);
if (ImGui.button("Play", buttonWidth, buttonHeight)) {
GameStarted = true;
Scene scene = (Scene) engineInstance.scene();
AudioInstance bgm = scene.audioInstances.get("BGM");
if (bgm == null) {
scene.SetUpAudio(engineInstance, engineInstance.audioManager());
bgm = scene.audioInstances.get("BGM");
}
bgm.Pause();
bgm.ChangePath("resources/EngineResources/audio/music/theshiteventhefar.ogg", engineInstance.audioManager());
bgm.Play();
}
ImGui.setCursorPosX(buttonX);
if (ImGui.button("Settings", buttonWidth, buttonHeight)) {
System.exit(0);
}
ImGui.setCursorPosX(buttonX);
if (ImGui.button("Quit", buttonWidth, buttonHeight)) {
System.exit(0);
}
ImGui.end();
ImGui.popStyleVar(3);
ImGui.popStyleColor();
}
}

View file

@ -48,7 +48,7 @@ public class Scene implements IScene {
private Vector2f LastMousePos = new Vector2f(0,0);
private final ISceneLightingManager lightingManager;
private SkyBox skyBox;
private Map<String,AudioInstance> audioInstances;
public Map<String,AudioInstance> audioInstances;
private DynamicTerrainMesh terrainMesh;
public IPlayerController playerController;
@ -169,7 +169,6 @@ public class Scene implements IScene {
newInstance.Play();
audioInstances.put("BGM",newInstance);
}
public Camera GetCamera(){return camera;}
public void AddActor(Actor NewActor){
Actors.put(NewActor.GetID(), NewActor);