-
Notifications
You must be signed in to change notification settings - Fork 0
/
movement4.py
116 lines (92 loc) · 3.26 KB
/
movement4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import pygame
import math
from pygame.math import Vector3
# Initialize pygame
pygame.init()
# Set up display dimensions and create display window
width, height = 800, 600
display = pygame.display.set_mode((width, height))
pygame.display.set_caption("3D Wireframe")
# Define colors
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
# Initialize player position, angle, and jumping state
pos = Vector3(0, 0, 0)
angle = 0
vertical_speed = 0
is_jumping = False
# Set up field of view and draw distance for the 3D perspective
FOV = 90
draw_distance = 1000
# Define grid size and create grid points
grid_size = 10
grid = []
for x in range(-grid_size, grid_size + 1):
for z in range(-grid_size, grid_size + 1):
grid.append(Vector3(x * 100, 0, z * 100))
# Function to rotate a point around the Z-axis
def rotate2d(pos, rad):
x, y = pos
s, c = math.sin(rad), math.cos(rad)
return x * c - y * s, y * c + x * s
# Set up clock for managing frame rate
clock = pygame.time.Clock()
running = True
# Define movement speeds
normal_speed = 200
sprint_speed = 400
# Main game loop
while running:
# Calculate delta time in seconds
dt = clock.tick(60) / 1000
# Handle events
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE and not is_jumping:
vertical_speed = 300 # Initial jump velocity
is_jumping = True
# Handle key presses for movement and rotation
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
angle -= 2 * dt
if keys[pygame.K_RIGHT]:
angle += 2 * dt
# Determine movement speed based on sprint key (left Shift)
movement_speed = sprint_speed if keys[pygame.K_LSHIFT] else normal_speed
if keys[pygame.K_UP]:
pos.x += math.sin(angle) * movement_speed * dt
pos.z += math.cos(angle) * movement_speed * dt
if keys[pygame.K_DOWN]:
pos.x -= math.sin(angle) * movement_speed * dt
pos.z -= math.cos(angle) * movement_speed * dt
# Apply gravity and update vertical position
vertical_speed -= 600 * dt # Gravity
pos.y += vertical_speed * dt
# Handle ground collision
if pos.y < 0:
pos.y = 0
vertical_speed = 0
is_jumping = False
# Clear display with black background
display.fill((0, 0, 0))
# Draw the grid
for point in grid:
x, y, z = point - pos # Translate point relative to player position
x, z = rotate2d((x, z), angle) # Rotate point around player
if z > 0: # Only draw points in front of the player
f = FOV / z # Perspective projection factor
x, y = x * f, y * f
# Convert 3D coordinates to 2D screen coordinates
screen_x = int(x) + width // 2
screen_y = height // 2 - int(y)
# Calculate top and bottom y-coordinates for vertical lines
top_y = screen_y - int(100 * f)
bottom_y = screen_y + int(100 * f)
# Draw vertical lines representing the grid
pygame.draw.line(display, WHITE, (screen_x, top_y), (screen_x, bottom_y), 1)
# Update the display
pygame.display.flip()
# Quit pygame
pygame.quit()