-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontroller.py
158 lines (137 loc) · 5.18 KB
/
controller.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
from shaders import apply_blur_shader, remove_blur_shader
import config
app = config.app_global
footstep_sounds = [f'assets/steps/Step{i}.ogg' for i in range(1, 8)]
footstep_interval = 0.9
last_footstep_time = 0
played_sounds = set()
player_death_sfx = 'assets/player/death2.ogg'
player_spawn_sfx = 'assets/player/spawn.ogg'
player_death_sfx = 'assets/player/death2.ogg'
bob_amount_vertical = .1
# bob_amount_horizontal = 0.2
bob_amount_rotation = 1
bob_speed = 4.4
bob_phase = 0
is_moving = False
class FootSteps(Entity):
def __init__(self, player, **kwargs):
super().__init__(**kwargs)
self.player = player
self.last_position = self.player.position
def update(self):
global last_footstep_time
if self.player.grounded:
movement = distance(self.player.position, self.last_position)
if movement > 0.01:
current_time = time.time()
if current_time - last_footstep_time > footstep_interval:
footstep_sound = random.choice(footstep_sounds)
Audio(footstep_sound, loop=False, autoplay=True)
last_footstep_time = current_time
self.last_position = self.player.position
def input(self, key):
global footstep_interval, footstep_sounds
if held_keys['shift']:
footstep_interval = 0.5
footstep_sounds = [f'assets/steps/Run{i}.ogg' for i in range(1, 8)]
else:
footstep_interval = 0.9
footstep_sounds = [f'assets/steps/Step{i}.ogg' for i in range(1, 8)]
class ViewBobbing(Entity):
def __init__(self, player, **kwargs):
super().__init__(**kwargs)
self.player = player
self.bob_phase = 0
self.previous_position = self.player.position
def update(self):
global bob_phase, previous_position
is_moving = self.player.position != self.previous_position
if is_moving:
bob_phase += bob_speed * time.dt
self.player.camera_pivot.y = 1.5 + math.sin(bob_phase) * bob_amount_vertical
self.player.camera_pivot.rotation_z = math.sin(bob_phase) * bob_amount_rotation
if not self.player.grounded:
bob_phase = 0
self.player.camera_pivot.y = 1.5
self.player.camera_pivot.rotation_z = 0
self.previous_position = self.player.position
def input(self, key):
global bob_speed
if held_keys['shift']:
bob_speed = 6
else:
bob_speed = 4.4
class Controller(FirstPersonController):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.normal_speed = self.speed
self.sprint_speed = 10
self.vb = ViewBobbing(player=self)
self.fs = FootSteps(player=self)
self.is_player_alive = True
def update(self):
super().update()
self.speed = self.sprint_speed if held_keys['shift'] else self.normal_speed
self.fs.update()
self.vb.update()
if not self.is_player_alive:
self.Death()
print("Player is dead. Triggering death sequence.")
def Death(self):
if player_death_sfx not in played_sounds:
death = Audio(player_death_sfx, loop=False, autoplay=True)
death.play()
played_sounds.add(player_death_sfx)
apply_blur_shader()
self.Respawn()
def Respawn(self):
respawn_button = Button(text="Respawn", scale=(.2, .1), position=(0, 0), origin=(0, 0), color=color.black)
def call_respawn():
self.Spawn()
self.position = Vec3(50, 0, 0)
self.is_player_alive = True
remove_blur_shader()
destroy(respawn_button)
respawn_button.on_click = call_respawn
def Spawn(self):
self.is_player_alive = True
Audio(player_spawn_sfx, loop=False, autoplay=True)
if player_death_sfx in played_sounds:
played_sounds.remove(player_death_sfx)
youare_text = Text(
text='You are',
position=(0, .2),
origin=(0, 0),
scale=4,
font='assets/fonts/OliversBarney.ttf'
)
class_text = Text(
text='Game Tester',
position=(0, .1),
origin=(0, 0),
scale=5,
font='assets/fonts/OliversBarney.ttf',
color=color.red,
role='Game Tester'
)
help_text = Text(
text='Press F1 for help',
position=(0, 0),
origin=(0, 0),
scale=2,
font='assets/fonts/OliversBarney.ttf'
)
def fade_out_text():
if youare_text.alpha > 0:
youare_text.alpha -= 0.001
invoke(fade_out_text, delay=0.1)
if class_text.alpha > 0:
class_text.alpha -= 0.001
invoke(fade_out_text, delay=0.1)
if help_text.alpha > 0:
help_text.alpha -= 0.001
invoke(fade_out_text, delay=0.1)
invoke(fade_out_text, delay=4)