DKL9 GitList
Repositories
DKL9 home
voxels
Code
Commits
Branches
Tags
Search
Tree:
74d48da
Branches
Tags
master
voxels
player.py
Surface-only mesh, crude mapgen, hidable crosshair
dkl9
commited
74d48da
at 2025-172 08:49:54
player.py
Blame
History
Raw
from libs import * import camera import entity ARROWS = [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT, pygame.K_SPACE, pygame.K_LSHIFT] def reshape(w, h): glViewport(0, 0, w, h) return w / h class Player(camera.Camera): def __init__(self, **kwargs): super().__init__(**kwargs) self.sensitivity = kwargs.get("sensitivity", 0.005) self.rv = vec([0, 0, 0]) self.speed = kwargs.get("speed", 0.05) self.hud = { "crosshair": entity.Entity( [[-0.03, 0.0, 0.0], [0.03, 0.0, 0.0], [0.0, -0.03, 0.0], [0.0, 0.03, 0.0]], [1.0, 1.0, 1.0, 1.0], [0.0, 0.0, 0.0], mode=GL_LINES, hud=True ), "fps": entity.Entity( [[0.0, 0.0, 0.0], [0.1, 0.0, 0.0], [0.0, -0.1, 0.0], [0.1, -0.1, 0.0]], YELLOW, [-1.0, 1.0, 0.0], mode=GL_TRIANGLE_STRIP, hud=True ), } def set_focus(self, f): pygame.event.set_grab(f) pygame.mouse.set_visible(not f) self.hud["crosshair"].pos[0] = 2 * (not f) def get_focus(self): return not pygame.mouse.get_visible() def mouse_move(self, dx, dy): self.theta = (self.theta - self.sensitivity * dx) % (2 * np.pi) self.phi = min(np.pi / 2, max(-np.pi / 2, self.phi + self.sensitivity * dy)) def update_motion(self, pk): self.rv = vec([ pk[pygame.K_RIGHT] - pk[pygame.K_LEFT], pk[pygame.K_SPACE] - pk[pygame.K_LSHIFT], pk[pygame.K_UP] - pk[pygame.K_DOWN] ]) def vdof(self): l = self.looking() l[1] = 0 u = self.up() return vec([np.cross(l, u), u, l]) def update_pos(self): self.pos += self.speed * self.vdof() @ self.rv.T def handle_event(self, ev, scene): match ev.type: case pygame.KEYUP | pygame.KEYDOWN: if ev.unicode == "\x1b" and ev.type == pygame.KEYUP: self.set_focus(False) elif ev.key in ARROWS: self.update_motion(pygame.key.get_pressed()) case pygame.MOUSEMOTION: if self.get_focus(): self.mouse_move(ev.rel[0], -ev.rel[1]) case pygame.MOUSEBUTTONUP: if ev.button == 1: self.set_focus(True) case pygame.MOUSEBUTTONDOWN: if self.get_focus(): t, n = self.target(scene) if t: t.click(ev.button, n) case pygame.WINDOWSIZECHANGED | pygame.WINDOWRESIZED: self.aspect = reshape(ev.x, ev.y)