DeaD_EyE icon

raylib [core][python] example - 3d cmaera split screen

DeaD_EyE | PRO | 01/14/25 08:45:02 PM UTC (Edited) | 0 ⭐ | 589 👁️ | Never ⏰ | []
Python |

5.96 KB

|

None

|

0 👍

/

0 👎

#!/usr/bin/env python3
"""
raylib [core][python] example - 3d cmaera split screen
https://github.com/raysan5/raylib/blob/master/examples/core/core_3d_camera_split_screen.c
 
The code is a close a possible to the C version, except the loop uses itertools.product
"""
from itertools import product
 
import pyray as pr
 
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 450
 
 
def main():
    # Initialization
    pr.init_window(
        SCREEN_WIDTH, SCREEN_HEIGHT, "raylib [core] example - 3d camera split screen"
    )
    camera_player1 = pr.Camera3D(
        pr.Vector3(0, 1, -3),
        pr.Vector3(0, 1),
        pr.Vector3(0, 1),
        45,
    )
    screen_player1 = pr.load_render_texture(SCREEN_WIDTH // 2, SCREEN_HEIGHT)
 
    # Setup player two camera and screen
    camera_player2 = pr.Camera3D(
        pr.Vector3(-3, 3),
        pr.Vector3(0, 3),
        pr.Vector3(0, 1),
        45,
    )
    screen_player2 = pr.load_render_texture(SCREEN_WIDTH // 2, SCREEN_HEIGHT)
 
    # Build a flipped rectangle the size of the split view to use for drawing later
    split_screen_rect = pr.Rectangle(
        0,
        0,
        screen_player1.texture.width,
        -screen_player1.texture.height,
    )
 
    # Grid data
    count = 5
    spacing = 4
 
    # Set our game to run at 60 frames-per-second
    pr.set_target_fps(60)
 
    # Main game loop
    while not pr.window_should_close():
        # Detect window close button or ESC key
 
        # Update
        # If anyone moves this frame, how far will they move based on the time since the last frame
        # this moves things at 10 world units per second, regardless of the actual FPS
        offset_this_frame = 10.0 * pr.get_frame_time()
 
        # Move Player1 forward and backwards (no turning)
        if pr.is_key_down(pr.KEY_W):
            camera_player1.position.z += offset_this_frame
            camera_player1.target.z += offset_this_frame
        elif pr.is_key_down(pr.KEY_S):
            camera_player1.position.z -= offset_this_frame
            camera_player1.target.z -= offset_this_frame
 
        # Move Player2 forward and backwards (no turning)
        if pr.is_key_down(pr.KEY_UP):
            camera_player2.position.x += offset_this_frame
            camera_player2.target.x += offset_this_frame
        elif pr.is_key_down(pr.KEY_DOWN):
            camera_player2.position.x -= offset_this_frame
            camera_player2.target.x -= offset_this_frame
 
        # Draw Player1 view to the render texture
        pr.begin_texture_mode(screen_player1)
        pr.clear_background(pr.SKYBLUE)
        pr.begin_mode_3d(camera_player1)
 
        # Draw scene: grid of cube trees on a plane to make a "world"
        # Simple world plane
        pr.draw_plane(
            pr.Vector3(0, 0, 0),
            pr.Vector2(50, 50),
            pr.BEIGE,
        )
 
        xz_iter = product(
            range(-count * spacing, count * spacing, spacing),
            range(-count * spacing, count * spacing, spacing),
        )
 
        # for x in range(-count*spacing, count*spacing, spacing):
        #    for z in range(-count*spacing, count*spacing, spacing):
        for x, z in xz_iter:
            pr.draw_cube(pr.Vector3(x, 1.5, z), 1, 1, 1, pr.LIME)
            pr.draw_cube(pr.Vector3(x, 0.5, z), 0.25, 1, 0.25, pr.BROWN)
 
        # Draw a cube at each player's position
        pr.draw_cube(camera_player1.position, 1, 1, 1, pr.RED)
        pr.draw_cube(camera_player2.position, 1, 1, 1, pr.BLUE)
        pr.end_mode_3d()
        pr.draw_rectangle(
            0, 0, pr.get_screen_width() // 2, 40, pr.fade(pr.RAYWHITE, 0.8)
        )
        pr.draw_text("PLAYER1: W/S to move", 10, 10, 20, pr.MAROON)
        pr.end_texture_mode()
 
        # Draw Player2 view to the render texture
        pr.begin_texture_mode(screen_player2)
        pr.clear_background(pr.SKYBLUE)
        pr.begin_mode_3d(camera_player2)
 
        # Draw scene: grid of cube trees on a plane to make a "world"
        # Simple world plane
        pr.draw_plane(
            pr.Vector3(0, 0, 0),
            pr.Vector2(50, 50),
            pr.BEIGE,
        )
 
        xz_iter = product(
            range(-count * spacing, count * spacing, spacing),
            range(-count * spacing, count * spacing, spacing),
        )
 
        # for x in range(-count*spacing, count*spacing, spacing):
        #    for z in range(-count*spacing, count*spacing, spacing):
        for x, z in xz_iter:
            pr.draw_cube(
                pr.Vector3(x, 1.5, z),
                1,
                1,
                1,
                pr.LIME,
            )
            pr.draw_cube(pr.Vector3(x, 0.5, z), 0.25, 1, 0.25, pr.BROWN)
 
        # Draw a cube at each player's position
        pr.draw_cube(camera_player1.position, 1, 1, 1, pr.RED)
        pr.draw_cube(camera_player2.position, 1, 1, 1, pr.BLUE)
        pr.end_mode_3d()
        pr.draw_rectangle(
            0, 0, pr.get_screen_width() // 2, 40, pr.fade(pr.RAYWHITE, 0.8)
        )
        pr.draw_text("PLAYER2: UP/DOWN to move", 10, 10, 20, pr.DARKBLUE)
        pr.end_texture_mode()
 
        # Draw both views render textures to the screen side by side
        pr.begin_drawing()
        pr.clear_background(pr.BLACK)
 
        pr.draw_texture_rec(
            screen_player1.texture, split_screen_rect, pr.Vector2(0, 0), pr.WHITE
        )
        pr.draw_texture_rec(
            screen_player2.texture,
            split_screen_rect,
            pr.Vector2(SCREEN_WIDTH / 2.0, 0),
            pr.WHITE,
        )
 
        pr.draw_rectangle(
            pr.get_screen_width() // 2 - 2, 0, 4, pr.get_screen_height(), pr.LIGHTGRAY
        )
        pr.end_drawing()
 
    # De-Initialization
    pr.unload_render_texture(screen_player1)  # Unload render texture
    pr.unload_render_texture(screen_player2)  # Unload render texture
    pr.close_window()  # Close window and OpenGL context
 
 
if __name__ == "__main__":
    main()
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎