代码之家  ›  专栏  ›  技术社区  ›  Kevin Nitièma

Pygame:如何使两个物体在碰撞后停止移动

  •  0
  • Kevin Nitièma  · 技术社区  · 4 年前

    我试图通过在pygame中生成粒子(主要是圆)来进行模拟。一个目标是让粒子在屏幕上随机移动,一旦它们碰撞,它们应该粘在一起并保持在固定位置。我创建了一个名为Particle的类,它具有以下属性: Particles(pos_x, pos_y, size, colour, screen) 然后,我在屏幕上生成这些粒子的列表,以便它们随机移动。然而,我很难想象如何遍历每个粒子,并检查它们各自的x坐标之间的距离是否小于 2*radius (例如:如果粒子的半径为5像素,则 particle_a(4, 8) 会与 particle_b(6, 8) .

    我该如何检查每个粒子,看看它们是否相互碰撞?循环遍历粒子列表,然后用该列表的副本进行检查,但我不确定我是否以正确的方式进行。我可以使用我能得到的所有帮助。我还是个初学者,所以如果有任何帮助,我将不胜感激。

    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()
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   Rabbid76    4 年前

    您必须计算和评估每个粒子到其他粒子的距离。

    使用2个嵌套循环。每个循环迭代粒子。如果

    for particle_a in particles:
        for particle_b in particles:
    

    如果 particle_a particle_b 那也是一样的 continue 不做任何事情的内环:

    if particle_a == particle_b:
        continue
    

    计算 Euclidean distance 颗粒之间 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()