How to create Game Menu in CaveEngine
          
          September 19, 2025 at 07:43 PM
        
      
            
            September 19, 2025 at 07:43 PM
          
          
          
            
              
              110 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)