I am trying to make a physics simulation using pygame but the collision is having problems. It gets shaky whenever there is a collision with another block because gravity is applied, but Rect collision only works when it is a pixel or more.
I tried to make it so gravity = 0 for every block when it collides at a slow enough velocity, but that causes the blocks to hover due to certain collisions.
Sorry for the whole file I do not even know where to start to fix my problem.
import pygame
import math
# pygame setup
pygame.init()
screen = pygame.display.set_mode((1280, 720))
clock = pygame.time.Clock()
running = True
dt = 0
swap = 1
enemy_rect = pygame.Rect(500,500,20,20)
objects= [[600,300,20,20,0,1.57,10,'blue',.2]]
object=pygame.draw.rect(screen, 'blue', (600,300,20,20))
walls= [[0,700,1300,99999,0,0,99999]]#,[200,300,100,200]]
while running:
# poll for events
# pygame.QUIT event means the user clicked X to close your window
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
if pygame.mouse.get_pressed()[0]:
temp = [pos[0],pos[1],20,20,0,1.57,10,'blue',.2]
objects.append(temp)
if pygame.mouse.get_pressed()[2]:
temp = [pos[0],pos[1],80,10,0,1.57,20,'red',.2]
objects.append(temp)
if pygame.mouse.get_pressed(5)[4]:
temp = [pos[0],pos[1],60,60,0,1.57,200,'yellow',.2]
objects.append(temp)
# fill the screen with a color to wipe away anything from last frame
screen.fill("white")
keys = pygame.key.get_pressed()
for y in objects:
y[4]=y[4]+y[8]
if not keys[pygame.K_w]:
new_x = y[0] + (y[4]*math.cos(y[5]))
new_y = y[1] + (y[4]*math.sin(y[5]))
y[0]=new_x
y[1]=new_y
object=pygame.draw.rect(screen, y[7], y[0:4])
for x in objects:
if pygame.Rect.colliderect(object,x[0:4]):
if not x[0:4]==y[0:4]:
y[8]=.2
x[8]=.2
#if y[4]>-.3 and y[4]<0:
#y[4]=0
#y[8]=0
if y[1]<x[1]:
y[1]=x[1]-y[3]
else:
y[1]=x[1]+y[3]
p_added = (y[6]*y[4])+(x[6]*x[4])
vf1 = (p_added-x[4]-(y[6]*y[4]))/(2*y[6])
vf2 = ((y[6]*y[4])/x[6])+x[4]-((y[6]*vf1)/x[6])
y[4] = vf1
x[4] = vf2
print(y[4],x[4])
if y[4]>-.65 and y[4]<.2 and x[4]>-1 and x[4]<1:
y[4]=0
y[8]=0
if x[4]>-.65 and x[4]<.2 and y[4]>-1 and y[4]<1:
x[4]=0
x[8]=0
for x in walls:
wall=pygame.draw.rect(screen, "grey", x[0:4])
if pygame.Rect.colliderect(object,wall):
y[1]=x[1]-y[3]
y[4]=-(y[4]*.3)
if y[4]>-.3 and y[4]<0:
y[4]=0
y[8]=0
#object=pygame.draw.rect(screen, y[7],y[0:4])
# flip() the display to put your work on screen
pygame.display.flip()
# limits FPS to 60
# dt is delta time in seconds since last frame, used for framerate-
# independent physics.
dt = clock.tick(60) / 1000
pygame.quit()
source https://stackoverflow.com/questions/77884130/python-pygame-physics-simulation-collison-not-working
Comments
Post a Comment