Pygame: сталкивающиеся прямоугольники с другими прямоугольниками в том же списке - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть список из 10 нарисованных прямоугольников (в моем сценарии они обозначены как кубы), на которые влияет гравитация.Я сделал простую систему столкновений, чтобы они могли остановиться, когда они упадут на землю.Как я могу сделать так, чтобы, когда сталкиваются 2 куба, они перестали падать, как с землей?

import pygame
import time
import random
pygame.init()
clock = pygame.time.Clock()
wnx = 800
wny = 600
black = (0,0,0)
grey = (75,75,75)
white = (255,255,255)
orange = (255,100,30)
wn = pygame.display.set_mode((wnx, wny))
wn.fill(white)
def cube(cx,cy,cw,ch):
    pygame.draw.rect(wn, orange, [cx, cy, cw, ch])
def floor(fx,fy,fw,fh):
    pygame.draw.rect(wn, grey, [fx, fy, fw, fh])
def main():
    floory = 550    
    number = 30
    cubex = [0] * number
    cubey = [0] * number
    cubew = 10                          
    cubeh = 10
    for i in range(len(cubex)):
        cubex[i] = (random.randrange(0, 80)*10)
        cubey[i] = (random.randrange(2, 5)*10)
    gravity = -10
    exit = False

    while not exit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit = True
        for i in range(len(cubex)): #i want to check here if it collides with an other cube
            if not (cubey[i] + 10) >= floory:
                cubey[i] -= gravity

        wn.fill(white)
        floor(0,floory,800,50)

        for i in range(len(cubex)):
            cube(cubex[i], cubey[i], cubew, cubeh)

        pygame.display.update()
        clock.tick(5)
main()
pygame.quit()
quit()

1 Ответ

0 голосов
/ 20 февраля 2019

Используйте pygame.Rect.colliderect, чтобы проверить, пересекаются ли прямоугольники.

Создайте прямоугольник (pygame.Rect), который определяет следующую позицию (область)куб:

cubeR = pygame.Rect(cubex[i], cubey[i] + 10, cubew, cubeh)

Найдите все пересекающиеся прямоугольники

cl = [j for j in range(len(cubey)) if j != i and cubeR.colliderect(pygame.Rect(cubex[j], cubey[j], cubew, cubeh))]

И не двигайте (пусть дальше "падают") куб, если есть any() Столкновение:

if not any(cl):
    # [...]

Проверка может выглядеть следующим образом:

for i in range(len(cubex)):
    cubeR = pygame.Rect(cubex[i], cubey[i] + 10, cubew, cubeh)
    cisect = [j for j in range(len(cubey)) if j != i and cubeR.colliderect(pygame.Rect(cubex[j], cubey[j], cubew, cubeh))]
    if not any(cisect) and not (cubey[i] + 10) >= floory:
        cubey[i] -= gravity

Обратите внимание, поскольку все кубы выровнены с растром 10 * 10, достаточно проверить,Истоки кубов равны:

for i in range(len(cubex)):
    cisect = [j for j in range(len(cubey)) if j != i and cubex[i] == cubex[j] and cubey[i]+10 == cubey[j]]
    if not any(cisect) and not (cubey[i] + 10) >= floory:
        cubey[i] -= gravity
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...