繁体   English   中英

pygame中的墙壁碰撞

[英]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()

您正在绘制矩形,然后在它们相互碰撞时将它们放回原处,以便它们相互移动片刻。 确保在计算完成后进行所有绘图。

您的程序唯一的问题是您在检查碰撞之前正在绘制矩形。

因为,我为其他人写的答案并不多。 您需要两个变量xy来存储先前的位置,即碰撞前的位置。 然后您需要使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM