-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProjectile_Motion.py
More file actions
152 lines (129 loc) · 6.2 KB
/
Projectile_Motion.py
File metadata and controls
152 lines (129 loc) · 6.2 KB
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
from pyray import *
import math
import time
from raylib import KEY_DOWN, KEY_ENTER, KEY_SPACE, KEY_UP
gravity = 500
coefficient_rest = 2
class Gun:
def __init__(self, x, y, color, radius, mass, speed, angle, floor):
self.x0 = x
self.y0 = y - radius
self.angle = angle
self.pos_x = self.x0
self.pos_y = self.y0
self.speed_0 = speed
self.speed_x0 = self.speed_0 * math.cos(math.radians(self.angle))
self.speed_y0 = self.speed_0 * math.sin(math.radians(self.angle))
self.speed_x = self.speed_x0
self.speed_y = self.speed_y0
self.acceleration_x = 0 #-1 * floor.cof * mass * gravity
self.acceleration_y = gravity
self.time_up = [0, self.speed_y0/self.acceleration_y]
self.time_down = [self.speed_y0/self.acceleration_y, 2*self.speed_y0/self.acceleration_y]
self.time_fly_middle = self.time_down[1] - self.time_up[0]
self.y_max = self.y0 - (self.speed_y0**2)/2*self.acceleration_y
self.color = color
self.radius = radius
self.mass = mass
self.coefficient_rest = coefficient_rest
def updatePos(self, delta_time):
self.pos_x = self.x0 + self.speed_x0 * delta_time - 0.5 * self.acceleration_x * (delta_time ** 2)
if 0 <= delta_time <= 2 * self.time_fly_middle:
self.pos_y = self.y0 - (self.speed_y0 * delta_time - 0.5 * self.acceleration_y * (delta_time ** 2))
def updateSpeed(self, delta_time):
self.speed_x = self.speed_x0 + self.acceleration_x * delta_time
self.speed_y = self.speed_y0 - self.acceleration_y * delta_time
if self.speed_x <= 0:
self.speed_x = 0
def updateAngle(self, angle):
self.angle += angle
self.pos_x = self.x0
self.pos_y = self.y0
self.speed_x0 = self.speed_0 * math.cos(math.radians(self.angle))
self.speed_y0 = self.speed_0 * math.sin(math.radians(self.angle))
self.speed_x = self.speed_x0
self.speed_y = self.speed_y0
self.time_up = [0, self.speed_y0/self.acceleration_y]
self.time_down = [self.speed_y0/self.acceleration_y, 2*self.speed_y0/self.acceleration_y]
self.time_fly_middle = self.time_down[1] - self.time_up[0]
self.y_max = self.y0 - (self.speed_y0**2)/2*self.acceleration_y
def detectCollision(self, floor, delta_time):
return delta_time > 0 and (floor.posY - (self.pos_y + self.radius)) < 0
def drawGun(self):
draw_circle(int(self.pos_x + self.radius), int(self.pos_y), int(self.radius), self.color)
class Floor:
def __init__(self, x, y, width, height, cof, color):
self.posX = x
self.posY = y
self.width = width
self.height = height
self.cof = cof
self.color = color
def drawFloor(self):
draw_rectangle(self.posX, self.posY, self.width, self.height - self.posY, GRAY)
class Window:
def __init__(self, width, height, title, color):
self.width = width
self.height = height
self.title = title
self.posX_text = 5
self.posY_text = 5
self.font_size = 20
self.color = color
self.space = self.font_size * 1.5
self.fps = 60
def drawInfo(self, delta_time, gun, floor):
draw_text("pos_x : " + str(gun.pos_x), self.posX_text, int(self.posY_text + 0 * self.space), self.font_size, WHITE)
draw_text("pos_y : " + str(int(floor.posY - (gun.pos_y + gun.radius))), self.posX_text, int(self.posY_text + 1 * self.space), self.font_size, WHITE)
draw_text("speed_x : " + str(gun.speed_x), self.posX_text, int(self.posY_text + 2 * self.space), self.font_size, WHITE)
draw_text("speed_y : " + str(gun.speed_y), self.posX_text, int(self.posY_text + 3 * self.space), self.font_size, WHITE)
draw_text("mass : " + str(gun.mass), self.posX_text, int(self.posY_text + 4 * self.space), self.font_size, WHITE)
draw_text("acceleration_x : " + str(gun.acceleration_x), self.posX_text, int(self.posY_text + 5 * self.space), self.font_size, WHITE)
draw_text("acceleration_y : " + str(gun.acceleration_y), self.posX_text, int(self.posY_text + 6 * self.space), self.font_size, WHITE)
draw_text("time of fly : " + str(2 * gun.time_fly_middle), self.posX_text, int(self.posY_text + 7 * self.space), self.font_size, WHITE)
draw_text("time : "+str(delta_time)+" sec", self.posX_text, int(self.posY_text + 8 * self.space), self.font_size, WHITE)
draw_text("angle: "+str(gun.angle)+" °", self.posX_text, int(self.posY_text + 9 * self.space), self.font_size, WHITE)
draw_fps(self.width - 100, 20)
def main():
window_width = 1920
window_height = 700
window = Window(window_width, window_height, "Motion", BLACK)
floor = Floor(0, 600, window_width, window_height, 0.05, GRAY)
gun = Gun(0, floor.posY, WHITE, 20, 10, 700 , 45, floor)
init_window(window.width, window.height, window.title)
t0 = 0
tf = 0
delta_time = 0
condition = False
condition_2 = True
while not window_should_close():
begin_drawing()
clear_background(window.color)
floor.drawFloor()
if is_key_pressed(KEY_SPACE):
if not condition:
t0 = time.time()
condition = True
condition_2 = False
elif condition_2:
if is_key_pressed(KEY_UP) or is_key_down(KEY_UP):
if gun.angle < 90:
gun.updateAngle(0.5)
if is_key_pressed(KEY_DOWN) or is_key_down(KEY_DOWN):
if gun.angle > 0:
gun.updateAngle(-0.5)
if condition:
tf = time.time()
delta_time = tf - t0
gun.updateSpeed(delta_time)
gun.updatePos(delta_time)
window.drawInfo(delta_time, gun, floor)
if gun.detectCollision(floor, delta_time):
gun.pos_y = floor.posY - gun.radius
condition = False
condition_2 = True
gun.drawGun()
end_drawing()
time.sleep(1 / window.fps)
close_window()
main()