Created
February 21, 2026 13:36
-
-
Save EncodeTheCode/a4c009e3e41ce065aedfead29638a392 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import numpy as np | |
| # ========================= | |
| # Base Entity System | |
| # ========================= | |
| class Entity: | |
| """Base class for any object in the 3D world.""" | |
| def __init__(self, position): | |
| self.position = np.array(position, dtype=float) | |
| self.triggers = [] | |
| def add_trigger(self, trigger): | |
| self.triggers.append(trigger) | |
| def update(self, dt): | |
| # Check all triggers associated with this entity | |
| for trigger in self.triggers: | |
| trigger.check(self) | |
| # ========================= | |
| # Trigger System | |
| # ========================= | |
| class Trigger: | |
| """Base trigger class.""" | |
| def __init__(self, position, size, trigger_once=True, callback=None): | |
| self.position = np.array(position, dtype=float) | |
| self.size = np.array(size, dtype=float) # width, height, depth | |
| self.triggered = False | |
| self.trigger_once = trigger_once | |
| self.callback = callback | |
| def check(self, entity): | |
| if self.is_inside(entity.position): | |
| if not self.triggered or not self.trigger_once: | |
| self.triggered = True | |
| if self.callback: | |
| self.callback(entity) | |
| else: | |
| # Reset trigger if not trigger_once | |
| if not self.trigger_once: | |
| self.triggered = False | |
| def is_inside(self, point): | |
| """Axis-aligned bounding box (AABB) check""" | |
| min_bound = self.position - self.size / 2 | |
| max_bound = self.position + self.size / 2 | |
| return np.all(point >= min_bound) and np.all(point <= max_bound) | |
| # ========================= | |
| # Example Player Class | |
| # ========================= | |
| class Player(Entity): | |
| def __init__(self, position): | |
| super().__init__(position) | |
| self.health = 100 | |
| def move(self, direction, dt=1.0): | |
| # Simple movement | |
| self.position += np.array(direction) * dt | |
| # ========================= | |
| # Example Callback Functions | |
| # ========================= | |
| def door_trigger(entity): | |
| print(f"{entity} entered a door area!") | |
| def wall_trigger(entity): | |
| print(f"{entity} hit a wall!") | |
| # ========================= | |
| # Example Usage | |
| # ========================= | |
| # Create a player | |
| player = Player([0, 0, 0]) | |
| # Create a door trigger at (5,0,5) with size 2x2x2, triggers once | |
| door = Trigger(position=[5, 0, 5], size=[2, 2, 2], trigger_once=True, callback=door_trigger) | |
| # Create a wall trigger at (10,0,0) with size 1x3x10, triggers constantly | |
| wall = Trigger(position=[10, 0, 0], size=[1, 3, 10], trigger_once=False, callback=wall_trigger) | |
| # Add triggers to player | |
| player.add_trigger(door) | |
| player.add_trigger(wall) | |
| # Simulate movement | |
| movements = [[1,0,1], [1,0,1], [3,0,3], [5,0,0]] | |
| for move in movements: | |
| player.move(move) | |
| player.update(dt=1.0) | |
| print("Player position:", player.position) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment