CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-arcade

Arcade Game Development Library

Pending

Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

Overview
Eval results
Files

camera-system.mddocs/

Camera System

2D camera system with view transformations, viewport management, projection controls, and smooth camera movement for dynamic view control and effects.

Capabilities

Camera Classes

class Camera2D:
    """
    2D camera for view transformations and viewport management.
    """
    def __init__(self, viewport: tuple[int, int, int, int] = None, 
                 projection: tuple[float, float, float, float] = None):
        """
        Create 2D camera.
        
        Args:
            viewport: (x, y, width, height) viewport rectangle
            projection: (left, right, bottom, top) projection bounds
        """
    
    # Position and transformation
    position: arcade.math.Vec2
    zoom: float
    angle: float
    
    # Viewport properties
    viewport: tuple[int, int, int, int]
    projection: tuple[float, float, float, float]
    
    def move_to(self, position: tuple[float, float], speed: float = 1.0) -> None:
        """Move camera to position with optional speed."""
    
    def move(self, dx: float, dy: float) -> None:
        """Move camera by offset."""
    
    def use(self) -> None:
        """Apply camera transformation to rendering."""
    
    def resize_viewport(self, width: int, height: int) -> None:
        """Resize camera viewport."""
    
    def shake(self, intensity: float, duration: float) -> None:
        """Apply camera shake effect."""

class OrthographicProjector:
    """Orthographic projection camera for 2D rendering."""
    def __init__(self, window: arcade.Window = None):
        """Create orthographic projector."""

class PerspectiveProjector:
    """Perspective projection camera for 3D-like effects."""
    def __init__(self, window: arcade.Window = None, fov: float = 60.0):
        """Create perspective projector."""
    
    fov: float  # Field of view in degrees

Camera Functions

def generate_view_matrix(position: tuple[float, float], angle: float = 0) -> list:
    """
    Generate view transformation matrix.
    
    Args:
        position: Camera position (x, y)
        angle: Rotation angle in degrees
    
    Returns:
        4x4 transformation matrix
    """

def generate_orthographic_matrix(left: float, right: float, bottom: float, top: float, 
                               near: float = -1000, far: float = 1000) -> list:
    """
    Generate orthographic projection matrix.
    
    Args:
        left: Left clipping plane
        right: Right clipping plane  
        bottom: Bottom clipping plane
        top: Top clipping plane
        near: Near clipping plane
        far: Far clipping plane
    
    Returns:
        4x4 projection matrix
    """

def generate_perspective_matrix(fov: float, aspect: float, near: float, far: float) -> list:
    """
    Generate perspective projection matrix.
    
    Args:
        fov: Field of view in degrees
        aspect: Aspect ratio (width/height)
        near: Near clipping plane
        far: Far clipping plane
    
    Returns:
        4x4 projection matrix
    """

Usage Examples

Basic Camera Following

import arcade

class CameraGame(arcade.Window):
    def __init__(self):
        super().__init__(1024, 768, "Camera Example")
        
        self.player_list = None
        self.wall_list = None
        self.camera = None
        
    def setup(self):
        # Create camera
        self.camera = arcade.Camera2D()
        
        # Create sprites
        self.player_list = arcade.SpriteList()
        self.wall_list = arcade.SpriteList()
        
        # Player
        self.player = arcade.Sprite(":resources:images/animated_characters/female_adventurer/femaleAdventurer_idle.png", 0.4)
        self.player.center_x = 500
        self.player.center_y = 300
        self.player_list.append(self.player)
        
        # Create walls for larger world
        for x in range(-1000, 2000, 64):
            wall = arcade.Sprite(":resources:images/tiles/grassMid.png")
            wall.center_x = x
            wall.center_y = 0
            self.wall_list.append(wall)
    
    def on_draw(self):
        self.clear()
        
        # Use camera
        self.camera.use()
        
        # Draw world
        self.wall_list.draw()
        self.player_list.draw()
    
    def on_update(self, delta_time):
        self.player_list.update()
        
        # Follow player with camera
        self.camera.move_to((self.player.center_x, self.player.center_y), 0.1)
    
    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player.change_x = -5
        elif key == arcade.key.RIGHT:
            self.player.change_x = 5
    
    def on_key_release(self, key, modifiers):
        if key in (arcade.key.LEFT, arcade.key.RIGHT):
            self.player.change_x = 0

def main():
    game = CameraGame()
    game.setup()
    arcade.run()

if __name__ == "__main__":
    main()

Install with Tessl CLI

npx tessl i tessl/pypi-arcade

docs

camera-system.md

core-graphics.md

gui-framework.md

index.md

math-utilities.md

physics-engines.md

sound-system.md

specialized-features.md

sprite-system.md

texture-management.md

window-management.md

tile.json