Pygame: как заставить два объекта перестать двигаться после столкновения - PullRequest
3 голосов
/ 28 мая 2020

Я пытаюсь создать симуляцию, генерируя частицы (в основном круги) в pygame. Одна из целей состоит в том, чтобы частица произвольно перемещалась по экрану, и после столкновения они должны прилипать друг к другу и оставаться в своем фиксированном положении. Я создал класс под названием Particle, который принимает следующие атрибуты: Particles(pos_x, pos_y, size, colour, screen). Затем я создаю список этих частиц на экране, чтобы они перемещались случайным образом. Однако мне сложно понять, как пройти l oop через каждую частицу и проверить, меньше ли расстояние между их соответствующими координатами x 2*radius. (Пример: если радиус частицы составляет 5 пикселей, то particle_a(4, 8) столкнется с particle_b(6, 8).

Как мне go проверить каждую частицу, чтобы увидеть, сталкиваются ли они друг с другом? список частиц, а затем свериться с копией этого списка, но я не уверен, что поступаю правильно. Я могу использовать всю помощь, которую могу получить. Я все еще новичок, поэтому буду признателен любая помощь.

import sys
import pygame
import random
from dla_settings import Settings
from particles import Particles

PARTICLE_SIZE = 5
PARTICLE_COLOUR = (random.choice((200, 240)), 100, 0)


def dla_simulation():
    dla_settings = Settings()
    pygame.init()
    screen = pygame.display.set_mode((dla_settings.screen_width, dla_settings.screen_height))
    pygame.display.set_caption("DLA")

    screen.fill((10, 10, 10))
    pygame.display.update()

    main_particle = Particles(dla_settings.screen_width // 2,
                                dla_settings.screen_height // 2,
                                PARTICLE_SIZE,
                                PARTICLE_COLOUR,
                                screen)

    particles = []

    for particle in range(20):
        x = random.randint(400, 500)
        y = random.randint(400, 500)
        particle = Particles(x,
                                y,
                                PARTICLE_SIZE,
                                PARTICLE_COLOUR,
                                screen)
        particles.append(particle)
        particles_copy = particles.copy()
        print(particles_copy)


    # Start the main loop for the game.
    while True:
        # Watch for keyboard and mouse events.
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

        screen.fill((10, 10, 10))
        main_particle.draw_particle()

        for particle in particles:
            particle.draw_particle()
            particle.random_move()
            for particle_copy in particles_copy:
                if particle.pos_x - particle_copy < 2:
                    particle.position_locked()

        # Update screen
        pygame.display.flip()


dla_simulation()

1 Ответ

2 голосов
/ 28 мая 2020

Вы должны вычислить и оценить расстояние от каждой частицы до другой частицы.

Используйте 2 вложенных цикла. Каждый l oop проходит через частицы. Если

for particle_a in particles:
    for particle_b in particles:

Если particle_a и particle_b одинаковы, то continue внутренний l oop без каких-либо действий:

if particle_a == particle_b:
    continue

Вычислить евклидово расстояние между частицами по math.sqrt(dx*dx + dy*dy) или hypot(dx, dy):

dx = particle_a.pos_x - particle_b.pos_x
dy = particle_a.pos_y - particle_b.pos_y
distance = math.sqrt(dx*dx + dy*dy)

Остановить обе частицы, если расстояние меньше или равно 2*radius:

if distance <= 2*radius:
    particle_a.position_locked()
    particle_b.position_locked()

Алгоритм

import math
for particle_a in particles:
    for particle_b in particles:
        if particle_a == particle_b:
            continue

        dx = particle_a.pos_x - particle_b.pos_x
        dy = particle_a.pos_y - particle_b.pos_y
        distance = math.sqrt(dx*dx + dy*dy)

        if distance <= 2*radius:
            particle_a.position_locked()
            particle_b.position_locked()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...