How to create Game Menu in CaveEngine

September 19, 2025 at 07:43 PM
5 views 0 replies
David
CornDuck
User
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)

Join the Discussion

Please login or create an account to reply to this post.