diff --git a/examples/core/core_split_screen.py b/examples/core/core_split_screen.py new file mode 100644 index 0000000..91d440e --- /dev/null +++ b/examples/core/core_split_screen.py @@ -0,0 +1,130 @@ +""" + +raylib [core] example - Split Screen + +""" + +from pyray import * + +from raylib import ( + KEY_W, + KEY_S, + KEY_UP, + KEY_DOWN, +) + +cameraPlayer1 = Camera3D([0]) +cameraPlayer2 = Camera3D([0]) + +def draw_scene(): + count = 5 + spacing = 4 + + # Grid of cube trees on a plane to make a "world" + + draw_plane(Vector3(0, 0, 0), Vector2(50, 50), BEIGE) + + for x in range(-count*spacing, count*spacing, spacing): + for z in range(-count*spacing, count*spacing, spacing): + draw_cube(Vector3(x, 1.5, z), 1, 1, 1, LIME) + draw_cube(Vector3(x, 0.5, z), 0.25, 1, 0.25, BROWN) + + # Draw a cube at each player's position + draw_cube(cameraPlayer1.position, 1, 1, 1, RED) + draw_cube(cameraPlayer2.position, 1, 1, 1, BLUE) + +# Initialization + +screenWidth = 800 +screenHeight = 450 + +init_window(screenWidth, screenHeight, "raylib [core] example - split screen") + +# Setup player 1 camera and screen + +cameraPlayer1.fovy = 45.0 +cameraPlayer1.up = Vector3(0,1.0,0) +cameraPlayer1.target = Vector3(0,1.0,0) +cameraPlayer1.position = Vector3(0,1,-3) + +screenPlayer1 = load_render_texture(int(screenWidth/2), int(screenHeight)) + +# Setup player 2 camera and screen +cameraPlayer2.fovy = 45.0 +cameraPlayer2.up = Vector3(0,1.0,0) +cameraPlayer2.target = Vector3(0,3.0,0) +cameraPlayer2.position = Vector3(-3,3,0) + +screenPlayer2 = load_render_texture(int(screenWidth / 2), int(screenHeight)) + +# Build a flipped rectangle the size of the split view to use for drawing later +splitScreenRect = Rectangle(0.0, 0.0, screenPlayer1.texture.width, -screenPlayer1.texture.height) + +set_target_fps(60) # Set our game to run at 60 frames-per-second + +# Main game loop +while not 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 thigns at 10 world units per second, regardless of the actual FPS''' + + offsetThisFrame = 10.0 * get_frame_time() + + # Move Player1 forward and backwards (no turning) + + if is_key_down(KEY_W): + cameraPlayer1.position.z += offsetThisFrame + cameraPlayer1.target.z += offsetThisFrame + + elif is_key_down(KEY_S): + + cameraPlayer1.position.z -= offsetThisFrame + cameraPlayer1.target.z -= offsetThisFrame + + # Move Player2 forward and backwards (no turning) + if is_key_down(KEY_UP): + cameraPlayer2.position.x += offsetThisFrame + cameraPlayer2.target.x += offsetThisFrame + + elif is_key_down(KEY_DOWN): + cameraPlayer2.position + cameraPlayer2.position.x -= offsetThisFrame + cameraPlayer2.target.x -= offsetThisFrame + + # Draw Player1 view to the render texture + begin_texture_mode(screenPlayer1) + clear_background(SKYBLUE) + begin_mode_3d(cameraPlayer1) + draw_scene() + end_mode_3d() + draw_text("PLAYER1 W/S to move", 10, 10, 20, RED) + end_texture_mode() + + # Draw Player2 view to the render texture + + begin_texture_mode(screenPlayer2) + clear_background(SKYBLUE) + begin_mode_3d(cameraPlayer2) + draw_scene() + end_mode_3d() + draw_text("PLAYER2 UP/DOWN to move", 10, 10, 20, BLUE) + end_texture_mode() + + # Draw both views render textures to the screen side by side + begin_drawing() + clear_background(BLACK) + draw_texture_rec(screenPlayer1.texture, splitScreenRect, Vector2(0,0), WHITE) + draw_texture_rec(screenPlayer2.texture, splitScreenRect, Vector2(screenWidth/2.0, 0 ), WHITE) + end_drawing() + + +# De-Initialization +unload_render_texture(screenPlayer1) # Unload render texture +unload_render_texture(screenPlayer2) # Unload render texture + +close_window() + + + +