python - 如何测试区域是否重叠 (Python)

标签 python pygame area rectangles ellipse

我是一名新手编码员,正在编写一个 Python 程序来使用 Pygame 库模拟自然选择。

我想要完成的事情之一是使重叠的移动椭圆形(或者如果这太复杂,则为矩形)对象产生继承其特征的子对象。

我的问题是我无法创建工作代码来识别任何两个对象区域何时重叠。我需要代码来识别两个对象何时交叉路径(并暂时重叠),以便游戏知道生成另一个形状。

有一次,我尝试了一种复杂的嵌套 for 循环,我认为它可以工作,但这导致模拟崩溃。

这是我的代码:

import pygame, random

# Define some colors
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)

pygame.init()

# Set the width and height of the screen
map_width = 800
map_height = 800
size = [map_width, map_height]
screen = pygame.display.set_mode(size)

# Display name
pygame.display.set_caption("Natural Selection Game")

# Loop until the user clicks the close button.
done = False

# Used to manage how fast the screen updates
clock = pygame.time.Clock()

# -------- Organism -----------
class Organism:

    def __init__(self):
        # Speed and direction
        self.change_x = random.randrange(0,6)
        self.change_y = random.randrange(0,6)

        # Dimensions
        self.width = random.randrange(5,50)
        self.height = random.randrange(5,50)

        # Diet (WIP)
        self.color = random.choice([red, green, blue])

        # Starting position
        self.x = random.randrange(0 + self.width, 800 - self.width)
        self.y = random.randrange(0 + self.height, 800 - self.height)

    # Spawn
    def spawn(self, screen):
        pygame.draw.ellipse(screen, self.color, [self.x, self.y, self.width, self.height])

    # Initiate movement
    def move(self):
        self.x += self.change_x
        self.y += self.change_y

    # Bounce 
    def bounce(self, map_width, map_height):
        if self.x < 0 or self.x > map_width - self.width:
            self.change_x = self.change_x * -1
        if self.y < 0 or self.y > map_height - self.height:
            self.change_y = self.change_y * -1

# Initial spawning conditions
org_list = []
org_number = 15

for i in range(0,org_number):
    org = Organism()
    org_list.append(org)

# -------- Main Program Loop -----------
while not done:
    # ---- Event Processing ----
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    # ---- Logic ----
    # Movement
    for i in org_list:
        i.move()
        i.bounce(map_width, map_height)

    # Reproduction

    # ---- Drawing ----
    # Set the screen background
    screen.fill(white)

    # Spawn organisms
    for i in org_list:
        i.spawn(screen)

    # --- Wrap-up
    # Limit to 60 frames per second
    clock.tick(60)

    # Go ahead and update the screen with what we've drawn.
    pygame.display.flip()

# Close everything down
pygame.quit()

任何见解将不胜感激。

最佳答案

您应该使用pygame.Rect保持位置和大小,然后你可以使用 Pygame 函数来检查碰撞。

one_rect.colliderect(second_rect)

one_rect.coolidepoint(mouse_position)

查看文档中的其他函数 pygame.Rect

<小时/>

Pygame 还有 pygame.sprite.Group保留一组 Sprite 并检查所有 Sprite 的碰撞。

关于python - 如何测试区域是否重叠 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41003640/

相关文章:

python - 添加 jedi-vim 时出错

python - pyinstaller错误: OSError: Python library not found: libpython3. 4mu.so.1.0, libpython3.4m.so.1.0, libpython3.4.so.1.0

python - 在函数内部运行 exec

python - 使用 Matplotlib 绘制条形图

python - 在pygame中缩放图像后颜色错误

python - Pygame 函数在 CollideRect 上不会返回 True

Python的列表对象不允许索引值改变

java - 使用 Graphics2D Area 的替代方案?

python - 在Python中查找多个重叠矩形的交集区域

ios - 如何填充 Quartz 2D 路径下方的区域?