【问题标题】:How to add multiple rectangles collision in pygame [duplicate]如何在pygame中添加多个矩形碰撞[重复]
【发布时间】:2020-12-31 11:00:46
【问题描述】:

我想在这个碰撞模拟中添加多个矩形,我不熟悉 OOP,我知道这是解决这个问题的最佳解决方案,以免重复相同的代码。 到目前为止,这是我的代码:

import pygame, sys

def bouncing_rect():
    global x_speed, y_speed, other_speed
    
    moving_rect.x += x_speed
    moving_rect.y += y_speed
    #collision with border of screen:
    if moving_rect.right >= screen_width or moving_rect.left <= 0:
        x_speed = - x_speed
    if moving_rect.bottom >= screen_height or moving_rect.top <= 0:
        y_speed = - y_speed        

    # moving the other rect:
    other_rect.y += other_speed
    if other_rect.top <= 0 or other_rect.bottom >= screen_height:
        other_speed = - other_speed

    #collision with other rect:
    collision_tolerance = 10
    if moving_rect.colliderect(other_rect):
        if abs(other_rect.top - moving_rect.bottom) < collision_tolerance and y_speed > 0:
            y_speed = - y_speed
        if abs(other_rect.bottom - moving_rect.top) < collision_tolerance and y_speed < 0:
            y_speed = - y_speed
        if abs(other_rect.right - moving_rect.left) < collision_tolerance and x_speed < 0:
            x_speed = - x_speed
        if abs(other_rect.left - moving_rect.right) < collision_tolerance and x_speed > 0:
            x_speed = - x_speed
    
    pygame.draw.rect(screen, (255,255,255), moving_rect)
    pygame.draw.rect(screen, (255,0,0), other_rect)

pygame.init()
clock = pygame.time.Clock()
screen_width, screen_height = 800,800
screen = pygame.display.set_mode((screen_width, screen_height))

moving_rect = pygame.Rect(50,50,50,50) #(left, top, width, height)
x_speed, y_speed = 5,4

other_rect = pygame.Rect(300,600,200,100)
other_speed = 2

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()


    screen.fill((30,30,30))
    bouncing_rect()
    pygame.display.flip()
    clock.tick(60)

它还没有使用 OOP。

【问题讨论】:

    标签: python oop pygame


    【解决方案1】:

    创建一个矩形列表:

    other_rect_list = [other_rect1, other_rect2, other_rect3] 
    

    使用collidelist() o 查找列表中第一个与矩形碰撞的矩形的索引:

    index = moving_rect.collidelist(other_rect_list)
    if index >= 0:
        other_rect = other_rect_list[index]
        # [...]
    

    或者,您可以使用collidelistall() 获取所有碰撞矩形的索引列表:

    index_list = moving_rect.collidelistall(other_rect_list)
    for index in index_list:
        other_rect = other_rect_list[index]
        # [...]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多