132 lines
3.5 KiB
Python
132 lines
3.5 KiB
Python
"""
|
|
|
|
raylib [core] example - 2D Camera System
|
|
|
|
"""
|
|
import pyray
|
|
|
|
from pyray import (
|
|
RAYWHITE,
|
|
DARKGRAY,
|
|
RED,
|
|
GREEN,
|
|
SKYBLUE,
|
|
BLUE,
|
|
BLACK,
|
|
)
|
|
|
|
# Initialization
|
|
MAX_BUILDINGS = 100
|
|
SCREEN_WIDTH = 800
|
|
SCREEN_HEIGHT = 450
|
|
|
|
pyray.init_window(SCREEN_WIDTH, SCREEN_HEIGHT,'raylib [core] example - 2d camera')
|
|
|
|
player = pyray.Rectangle(400, 280, 40, 40)
|
|
buildings = []
|
|
build_colors = []
|
|
spacing = 0
|
|
|
|
for i in range(MAX_BUILDINGS):
|
|
width = pyray.get_random_value(50, 200)
|
|
height = pyray.get_random_value(100, 800)
|
|
y = SCREEN_HEIGHT - 130 - height
|
|
x = -6000 + spacing
|
|
|
|
buildings.append(pyray.Rectangle(x, y, width, height))
|
|
|
|
spacing += width
|
|
|
|
build_colors.append(pyray.Color(
|
|
pyray.get_random_value(200, 240),
|
|
pyray.get_random_value(200, 240),
|
|
pyray.get_random_value(200, 250),
|
|
255
|
|
))
|
|
|
|
camera = pyray.Camera2D()
|
|
camera.target = pyray.Vector2(player.x + 20, player.y + 20)
|
|
camera.offset = pyray.Vector2(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)
|
|
camera.rotation = 0.0
|
|
camera.zoom = 1.0
|
|
|
|
pyray.set_target_fps(60) # Set our game to run at 60 frames-per-second
|
|
|
|
# Main game loop
|
|
while not pyray.window_should_close(): # Detect window close button or ESC key
|
|
# Update
|
|
|
|
# Player movement
|
|
if pyray.is_key_down(pyray.KEY_RIGHT):
|
|
player.x += 2
|
|
elif pyray.is_key_down(pyray.KEY_LEFT):
|
|
player.x -= 2
|
|
|
|
# Camera target follows player
|
|
camera.target = pyray.Vector2(player.x + 20, player.y + 20)
|
|
|
|
# Camera rotation controls
|
|
if pyray.is_key_down(pyray.KEY_A):
|
|
camera.rotation -= 1
|
|
elif pyray.is_key_down(pyray.KEY_S):
|
|
camera.rotation += 1
|
|
|
|
# Limit camera rotation to 80 degrees (-40 to 40)
|
|
if camera.rotation > 40:
|
|
camera.rotation = 40
|
|
elif camera.rotation < -40:
|
|
camera.rotation = -40
|
|
|
|
# Camera zoom controls
|
|
camera.zoom += pyray.get_mouse_wheel_move() * 0.05
|
|
|
|
if camera.zoom > 3.0:
|
|
camera.zoom = 3.0
|
|
elif camera.zoom < 0.1:
|
|
camera.zoom = 0.1
|
|
|
|
# Camera reset (zoom and rotation)
|
|
if pyray.is_key_pressed(pyray.KEY_R):
|
|
camera.zoom = 1.0
|
|
camera.rotation = 0.0
|
|
|
|
# Draw
|
|
pyray.begin_drawing()
|
|
pyray.clear_background(RAYWHITE)
|
|
|
|
pyray.begin_mode_2d(camera)
|
|
|
|
pyray.draw_rectangle(-6000, 320, 13000, 8000, DARKGRAY)
|
|
|
|
for i in range(MAX_BUILDINGS):
|
|
pyray.draw_rectangle_rec(buildings[i], build_colors[i])
|
|
|
|
pyray.draw_rectangle_rec(player, RED)
|
|
|
|
x = int(camera.target.x)
|
|
y = int(camera.target.y)
|
|
pyray.draw_line(x, -SCREEN_HEIGHT * 10, x, SCREEN_HEIGHT * 10, GREEN)
|
|
pyray.draw_line(-SCREEN_WIDTH * 10, y, SCREEN_WIDTH * 10, y, GREEN)
|
|
|
|
pyray.end_mode_2d()
|
|
|
|
pyray.draw_text('SCREEN AREA', 640, 10, 20, RED)
|
|
|
|
pyray.draw_rectangle(0, 0, SCREEN_WIDTH, 5, RED)
|
|
pyray.draw_rectangle(0, 5, 5, SCREEN_HEIGHT - 10, RED)
|
|
pyray.draw_rectangle(SCREEN_WIDTH - 5, 5, 5, SCREEN_HEIGHT - 10, RED)
|
|
pyray.draw_rectangle(0, SCREEN_HEIGHT - 5, SCREEN_WIDTH, 5, RED)
|
|
|
|
pyray.draw_rectangle(10, 10, 250, 113, pyray.fade(SKYBLUE, 0.5))
|
|
pyray.draw_rectangle_lines(10, 10, 250, 113, BLUE)
|
|
|
|
pyray.draw_text('Free 2d camera controls:', 20, 20, 10, BLACK)
|
|
pyray.draw_text('- Right/Left to move Offset', 40, 40, 10, DARKGRAY)
|
|
pyray.draw_text('- Mouse Wheel to Zoom in-out', 40, 60, 10, DARKGRAY)
|
|
pyray.draw_text('- A / S to Rotate', 40, 80, 10, DARKGRAY)
|
|
pyray.draw_text('- R to reset Zoom and Rotation', 40, 100, 10, DARKGRAY)
|
|
|
|
pyray.end_drawing()
|
|
|
|
# De-Initialization
|
|
pyray.close_window() # Close window and OpenGL context
|