使用Pygame的Rect重叠问题



我是Pygame的新手,目前正处于实验阶段。我这里有一个简单的显示表面,我在上面绘制了几个重叠的矩形,这些矩形具有相同的宽度和高度(96乘144(,具有不同的颜色,以模拟扑克牌。

我已经写了一些代码,以便在点击黄色卡片时能够突出显示它。如果你运行代码,你会注意到当我点击其中一张卡片的可见部分时,它后面的所有其他卡片以及所有重叠的卡片都会被突出显示。我不知道,我应该怎么做才能点击卡片的可见部分,并且只突出显示该卡片。

import pygame, sys
class Card(pygame.sprite.Sprite):
def __init__(self, color):
super().__init__()
self.color = color
self.is_highlight = False
def show_card(self, x, y):
self.rect = pygame.rect.Rect(x, y, 96, 144)
pygame.draw.rect(display_surf, self.color, self.rect)

def highlight_card(self):
pos = pygame.mouse.get_pos()
if self.rect.collidepoint(pos):
self.is_highlight = True
else:
self.is_highlight = False
def update(self):
if self.is_highlight:
pygame.draw.rect(display_surf, 'Yellow', self.rect.inflate(5, 5), width=3, border_radius=5)
class Deck(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.card_deck = []
def build_deck(self):
self.card_deck.append(Card('Green'))
self.card_deck.append(Card('Red'))
self.card_deck.append(Card('Blue'))
self.card_deck.append(Card('brown'))
self.card_deck.append(Card('cadetblue'))
self.card_deck.append(Card('cornsilk'))
self.card_deck.append(Card('darkolivegreen'))
self.card_deck.append(Card('darkorchid'))
self.card_deck.append(Card('darksalmon'))
return self.card_deck
pygame.init()
WINDOW_WIDTH = 1280
WINDOW_HEIGHT = 720
display_surf = pygame.display.set_mode((WINDOW_WIDTH,WINDOW_HEIGHT))
pygame.display.set_caption('Simple Card Game')
clock = pygame.time.Clock()
card_deck = Deck().build_deck()

while True:
display_surf.fill((0, 150,0))
distance = 20
for card in card_deck:
card.show_card(distance, 20)
distance += 20
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
for card in card_deck:
card.highlight_card()
for card in card_deck:
card.update()
pygame.display.update()

所以我想我已经解决了自己的问题,并希望分享解决方案。

在show_card方法中,我添加了一个新的scaled_trect,它只表示宽度只有20的彩色卡片的可见部分,而我在显示表面上使用原始的全尺寸矩形绘制颜色:

def show_card(self, x, y):
self.rect = pygame.rect.Rect(x, y, 96, 144)
self.scaled_rect = pygame.rect.Rect((x, y), (20, 144))
pygame.draw.rect(display_surf, self.color, self.rect)

在highlight_card方法中,我通过使用新的scaled_trect:,只使颜色的可见部分与鼠标点击可交互

def highlight_card(self):
pos = pygame.mouse.get_pos()
if self.scaled_rect.collidepoint(pos):
self.is_highlight = True
else:
self.is_highlight = False

最后,在绘制黄色高亮的更新方法中,我使用了原始的全尺寸矩形:

def update(self):
if self.is_highlight:
pygame.draw.rect(display_surf, 'Yellow', self.rect.inflate(5, 5), width=3, border_radius=5)

最新更新