[英]Wall collision in pygame
我试图让碰撞起作用,但是当两个矩形碰撞时,它们会相互碰撞,但我希望第二个矩形像墙一样。 有人知道我该如何解决这个问题吗? 或者有没有更好的方法来为我的游戏添加碰撞? 这就是我现在所拥有的。
import pygame
pygame.init()
screen = pygame.display.set_mode((1000, 800))
pygame.display.set_caption("Squarey")
done = False
is_red = True
x = 30
y = 30
x2 = 100
y2 = 30
clock = pygame.time.Clock()
WHITE = (255,255,255)
RED = (255,0,0)
charImg = pygame.image.load('character.png')
rect1 = pygame.Rect(30, 30, 60, 60)
rect2 = pygame.Rect(100, 100, 60, 60)
x_change = 0
y_change = 0
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
#movement
#left
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_change = -5
y_change = 0
#right
elif event.key == pygame.K_RIGHT:
x_change = 5
y_change = 0
#key release left and right
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
x_change = 0
y_change = 0
#up
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
y_change = -5
x_change = 0
#down
elif event.key == pygame.K_DOWN:
y_change = 5
x_change = 0
#key release up and down
if event.type == pygame.KEYUP:
if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
y_change = 0
x_change = 0
rect1.x = rect1.x + x_change
rect1.y = rect1.y + y_change
screen.fill((0, 0, 0))
pygame.draw.rect(screen, WHITE, rect1)
pygame.draw.rect(screen, RED, rect2)
if rect1.bottom > screen.get_rect().bottom:
rect1.center = screen.get_rect().center
#if rect1.colliderect(rect2):
if rect1.colliderect(rect2):
#print("Collision !!")
rect1.x = rect1.x - x_change
rect1.y = rect1.y - y_change
pygame.display.flip()
clock.tick(60)
pygame.quit()
您正在绘制矩形,然后在它们相互碰撞时将它们放回原处,以便它们相互移动片刻。 确保在计算完成后进行所有绘图。
您的程序唯一的问题是您在检查碰撞之前正在绘制矩形。
因为,我为其他人写的答案并不多。 您需要两个变量x
和y
来存储先前的位置,即碰撞前的位置。 然后您需要使用Rect.colliderect
检查两个矩形是否发生碰撞。 如果它们发生碰撞,则将当前位置重置为之前的位置,然后绘制墙壁。
import pygame
pygame.init()
screen = pygame.display.set_mode((1000, 800))
done = False
clock = pygame.time.Clock()
WHITE = (255,255,255)
RED = (255,0,0)
rect1 = pygame.Rect(30, 30, 60, 60)
rect2 = pygame.Rect(100, 100, 60, 60)
previous_x, previous_y = 0, 0
x_change, y_change = 0, 0
speed = 5
while not done:
screen.fill((0, 0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_change = -speed
y_change = 0
if event.key == pygame.K_RIGHT:
x_change = speed
y_change = 0
if event.key == pygame.K_UP:
y_change = -speed
x_change = 0
if event.key == pygame.K_DOWN:
y_change = speed
x_change = 0
if event.type == pygame.KEYUP:
x_change = 0
y_change = 0
previous_x = rect1.x
previous_y = rect1.y
rect1.x = rect1.x + x_change
rect1.y = rect1.y + y_change
if rect1.colliderect(rect2):
print("Collision")
rect1.x = previous_x
rect1.y = previous_y
pygame.draw.rect(screen, WHITE, rect1)
pygame.draw.rect(screen, RED, rect2)
pygame.display.flip()
clock.tick(60)
pygame.quit()
如果您有许多墙,请将其所有 rect 存储在列表中。 然后使用pygame的Rect.collidelist
来检查是否有碰撞。(注意:如果没有碰撞,collidelist返回-1)。 如果有,则重置到以前的位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.