Изменить цвет спрайта из группы - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть группа rects, они отображаются в ряд.Я хочу, чтобы они меняли свой цвет при нажатии, пока они не будут нажаты снова

У меня есть этот код для создания спрайтов:

class DrawableRect(pygame.sprite.Sprite):
    def __init__(self,color,width,height,value=0):
        super().__init__()
        self.image = pygame.Surface([width, height])
        self.image.fill(color)
        self.rect = self.image.get_rect()
        self.value = value
        self.x = 0
        self.y = 0
    def change_value(self,color,value):
        self.image.fill(color)
        self.value=value

def DrawRects(start_x, start_y, rect_spacing, colour_list):
    current_x_pos = start_x
    for rect_num in range(0,8):
        rect = DrawableRect(colour_list[rect_num], boxW, boxH)
        rect.rect.x = current_x_pos
        rect.rect.y = start_y
        current_x_pos = current_x_pos + rect.rect.width + rect_spacing
        rects.add(rect)
    rects.draw(screen)

Идея приложения заключается в том, чтодля каждого прямоугольника, представляющего бит, и при нажатии он чередуется между 0 и 1, структура каждого бита где-то отображает десятичный эквивалент.

Я читал, что группы неупорядочены, поэтому индексация не будет работать,правда?

1 Ответ

0 голосов
/ 11 декабря 2018

Вот пример, который я изменил в соответствии с вашими целями.У меня есть группа спрайтов (цветные прямоугольники) в группе спрайтов, и я меняю * цвет любого спрайта, который сталкивается с указателем мыши при нажатии кнопки мыши.

Here it is in action

Вот код, который вы, вероятно, больше всего интересуете метод change_color() и код обработки события MOUSEBUTTONUP.

import random
import pygame

screen_width, screen_height = 640, 480
def get_random_position():
    """return a random (x,y) position in the screen"""
    return (random.randint(0, screen_width - 1),  #randint includes both endpoints.
            random.randint(0, screen_height - 1)) 
color_list = ["red", "orange", "yellow", "green", "cyan", "blue", "blueviolet"]
colors = [pygame.color.Color(c) for c in color_list]

class PowerUp(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        width, height = 64, 32
        self.image = pygame.Surface([width, height])
        self.clicked = False  # track whether we've been clicked or not
        # initialise color
        self.color = random.choice(colors)
        self.image.fill(self.color)
        # Fetch the rectangle object that has the dimensions of the image
        self.rect = self.image.get_rect()
        # then move to a random position
        self.update()

    def update(self):
        #move to a random position
        self.rect.center = get_random_position()

    def random_color(self):
        # randomise color
        self.clicked = not self.clicked
        if self.clicked:
            color = random.choice(colors)
        else:
            color = self.color
        self.image.fill(color)

if __name__ == "__main__":
    pygame.init()
    screen = pygame.display.set_mode((screen_width, screen_height))
    pygame.display.set_caption('Sprite Color Switch Demo')
    clock = pygame.time.Clock() #for limiting FPS
    FPS = 60
    exit_demo = False

    pygame.key.set_repeat(300, 200)

    #create a sprite group to track the power ups.
    power_ups = pygame.sprite.Group()
    for _ in range(10):
        power_ups.add(PowerUp()) # create a new power up and add it to the group.

    # main loop
    while not exit_demo:
        for event in pygame.event.get():            
            if event.type == pygame.QUIT:
                exit_demo = True
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    exit_demo = True
                elif event.key == pygame.K_SPACE:
                    power_ups.update()
            elif event.type == pygame.MOUSEBUTTONUP:
                # check for collision
                for p in power_ups:
                    if p.rect.collidepoint(event.pos): # maybe use event?
                        p.random_color()

        screen.fill(pygame.Color("black")) # use black background
        power_ups.draw(screen)
        pygame.display.update()
        clock.tick(FPS)
    pygame.quit()
    quit()

Дайте мне знатьесли у вас есть какие-нибудь вопросы.Очевидно, что это не делает выравнивание строк спрайтов, я думаю, у вас есть справка об этом.Я хотел бы предложить, чтобы у вас были все операции рисования на экране в одном месте, чтобы ваш код мог быть более четким.

* Новый цвет рандомизирован из короткого списка, так что есть вероятность 14%, что он не изменитсяот начального цвета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...