How to create Game Menu in CaveEngine
September 19, 2025 at 07:43 PM
September 19, 2025 at 07:43 PM
5 views
0 replies

September 19, 2025 at 07:43 PM
Made a tutorial on how to create Game Menu that you can open with ESC, dose not pause the scene and gives you the control of your mouse cursor from the camera.
I did not create the script, i used AI to write it for me, i do not know how to write these mambo jumbos, for me it feels like some kind of witchcraft.
The video tutorial:
https://youtu.be/Mm-qwBGksOE
I will share the script it self as well, that you can attach to Game Manager, so the Game Menu works.
import cave
import cave.event
class GameMenuController2(cave.Component):
def start(self, scene: cave.Scene):
self.scene = scene
self.gameMenu = scene.get("GameMenu")
self.scene.properties["menuOpen"] = False
# Cache player controllers
self.controllers = []
for e in scene.getEntitiesWithTag("player"):
c = e.get("VehicleControllerComponent") or e.get("PlayerComponent")
if c:
self.controllers.append(c)
# Cache camera comps + default sensitivities
self.tpc_defaults = {} # cam -> (sx, sy)
self.mouselooks = [] # MouselookComponent / FirstPersonCamComponent
for e in scene.getEntitiesWithComponent("ThirdPersonCamComponent"):
cam = e.get("ThirdPersonCamComponent")
if cam and hasattr(cam, "mouselook"):
s = cam.mouselook.sensitivity
self.tpc_defaults[cam] = (float(s.x), float(s.y))
for e in scene.getEntitiesWithComponent("MouselookComponent"):
ml = e.get("MouselookComponent")
if ml:
self.mouselooks.append(ml)
for e in scene.getEntitiesWithComponent("FirstPersonCamComponent"):
ml = e.get("FirstPersonCamComponent")
if ml:
self.mouselooks.append(ml)
cave.showMouse(False)
cave.getEvents().setRelativeMouse(True)
self.apply() # ensure correct state on scene load
def apply(self):
open_ = bool(self.scene.properties.get("menuOpen", False))
if self.gameMenu:
self.gameMenu.setActive(open_, self.scene)
cave.showMouse(open_)
cave.getEvents().setRelativeMouse(not open_)
for ml in self.mouselooks:
if hasattr(ml, "lockMousePos"):
ml.lockMousePos = not open_
for c in self.controllers:
c.active = not open_
for cam, (sx, sy) in self.tpc_defaults.items():
cam.mouselook.sensitivity = cave.Vector2(0.0, 0.0) if open_ else cave.Vector2(sx, sy)
if not open_:
cave.getEvents().setRelativeMouse(True)
def update(self):
ev = cave.getEvents()
if ev.pressed(cave.event.KEY_ESCAPE):
self.scene.properties["menuOpen"] = not self.scene.properties["menuOpen"]
self.apply()
if self.scene.properties["menuOpen"]:
cave.showMouse(True)
ev.setRelativeMouse(False)
for ml in self.mouselooks:
if hasattr(ml, "lockMousePos"):
ml.lockMousePos = False
else:
cave.showMouse(False)
ev.setRelativeMouse(True)
for ml in self.mouselooks:
if hasattr(ml, "lockMousePos"):
ml.lockMousePos = True
def lateUpdate(self):
if self.scene.properties.get("menuOpen", False):
cave.showMouse(True)
cave.getEvents().setRelativeMouse(False)