Как сделать так, чтобы изображение появлялось в списке и исчезало при настройке переменной в pygame? - PullRequest
0 голосов
/ 08 апреля 2020

Мне было интересно, как заставить изображение появиться в списке, а затем заставить его исчезнуть после нажатия на него. И как только он будет нажат, переменная будет назначена.

Когда я запускаю это в Pygame, я печатаю кучу всех этих картинок, и они очень быстро go.

def game():
    screen = pygame.display.set_mode((1400, 750))
    pygame.display.set_caption("Goofspiel")
    screenExit = False
    while not screenExit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                screenExit = True

        keys = pygame.key.get_pressed()
        mouse = pygame.mouse.get_pos()
        click = pygame.mouse.get_pressed()

        screen.fill(lightgray)

        fontname = pygame.font.SysFont("Denmark", 150)
        font = pygame.font.SysFont("Denmark", 40)
        font1 = pygame.font.SysFont("Denmark", 75)

        name = fontname.render("Goofspeil", True, (black))
        score = font.render("Player 1", True, (blue))
        score1 = font.render("Player 2", True, (red))
        player = font1.render("Player 1", True, (black))
        que = font.render("Who's turn is it?", True, (black))


        screen.blit(name, (490, 0))

        #Score board
        pygame.draw.rect(screen, sun, [0,20,375,80])
        pygame.draw.rect(screen, black, [0,20,375,5])
        pygame.draw.rect(screen, black, [0, 100.5, 375, 5])
        pygame.draw.rect(screen, black, [375, 20, 5, 85])
        pygame.draw.rect(screen, black, [305, 20, 5, 85])
        pygame.draw.rect(screen, black, [180, 20, 5, 85])
        pygame.draw.rect(screen, black, [110, 20, 5, 85])

        screen.blit(score, (0, 50))
        screen.blit(score1, (190, 50))
        screen.blit(que, (1100, 20))
        screen.blit(player, (1120, 70))

        #Displaying the cards
        screen.blit(DK, (5, 450))
        screen.blit(DQ, (100, 450))
        screen.blit(DJ, (200, 450))
        screen.blit(D10, (300, 450))
        screen.blit(D9, (400, 450))
        screen.blit(D8, (500, 450))
        screen.blit(D7, (600, 450))
        screen.blit(D6, (700, 450))
        screen.blit(D5, (800, 450))
        screen.blit(D4, (900, 450))
        screen.blit(D3, (1000, 450))
        screen.blit(D2, (1100, 450))
        screen.blit(D1, (1200, 450))

        #Add a random picture
        list = []
        list.append(HK)
        list.append(HQ)
        list.append(HJ)
        list.append(H10)
        list.append(H9)
        list.append(H8)
        list.append(H7)
        list.append(H6)
        list.append(H5)
        list.append(H4)
        list.append(H3)
        list.append(H2)
        list.append(H1)

        #rand = random.randrange(0, len(list))
        random.shuffle(list)
        screen.blit(list[0], (700,150))

        if 200 > mouse[0] > 100 and 700 > mouse[1] > 450:
            pygame.draw.rect(screen, lightblue2, [80, 705, 200, -60])
            if click[0] == 1:

                x = 12
                score2 = font.render(str(x), True, (black))
                screen.blit(score2, (135, 50))


        pygame.display.update()

game()

Что я хочу сделать, так это то, что я хочу изображение случайно выводится из этого списка, чтобы его можно было удалить, затем «удалить» из списка, а затем заставить изображение исчезнуть с экрана. Поскольку эти картинки - карты, я хочу, чтобы, если человек нажимает на короля, значение x = 13 и так далее.

Может кто-нибудь помочь, пожалуйста, я застрял в этом вопросе. Я пытаюсь сделать игру Goofspiel и не могу!

1 Ответ

0 голосов
/ 09 апреля 2020

Вот точечная форма того, как я буду действовать:

  • Конвертируйте ваши изображения H1, H2 ... в PyGame Sprites .

Это объединяет изображение с прямоугольником. Это позволяет легко перемещать и вытягивать все карты. Код также использует событие щелчка мышью, чтобы легко определить, какая из карт (если таковые имеются) была нажата.

  • Добавьте необходимые данные карты в класс Sprite

Это позволяет вашей Карте «знать» свою масть, номер и лицевой стороной вверх.

  • Поместить спрайтов вашей карты в Pygame SpriteGroup

Это облегчает рисование и обнаружение столкновений с щелчком мыши.

  • Как только вы знаете, какая карта была нажата, ее довольно легко удалить с экрана, перевернуть, что угодно, потому что ее состояние (местоположение, костюм, номер, лицом вверх и т. д. c.) все хранятся вместе в классе спрайтов. Это больше не становится вопросом удаления "# 8 из списка".

Примерно так:

class Card( pygame.sprite.Sprite ):

    def __init__( self, front_image, back_image, suit, number, facing_up=True ):
        pygame.sprite.Sprite.__init__(self)
        self.front       = pygame.image.load( front_image ).convert()
        self.back        = pygame.image.load( back_image ).convert()
        self.rect        = self.front.get_rect()
        self.suit        = suit
        self.number      = number
        self.face_up     = not facing_up
        self.flip()      # re-draw

    def flip( self ):
        self.face_up = not self.face_up
        if ( self.face_up ):
            self.image = self.front
        else:
            self.image = self.back

    def moveTo( self, x, y ):
        self.rect.x = x
        self.rect.y = y

    def isFaceUp( self ):
        return self.face_up

    # ... etc.


# make the cards
HK  = Card( 'hearts_king.png',  'card_back.png', 'hearts', 13 )
HQ  = Card( 'hearts_queen.png', 'card_back.png', 'hearts', 12 )
HJ  = Card( 'hearts_jack.png',  'card_back.png', 'hearts', 11 )
H10 = Card( 'hearts_10.png',    'card_back.png', 'hearts', 10 )
# ... etc
all_hearts = [ HK, HQ, HJ, H10, H9, ... H1 ]

# TODO: call Card.moveTo() to position each card

cards_on_table = pygame.sprite.Group()
for card in all_hearts:
    cards_on_table.add( card )


# Main Loop:
while not done:
    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        elif ( event.type == pygame.MOUSEBUTTONUP ):
            # On mouse-click
            mouse_pos = pygame.mouse.get_pos()
            # Did we click on a card?
            for card in cards_on_table:
                if ( card.rect.collidepoint( mouse_pos ) ):
                    print( "Card [%s, %d] was clicked" % ( card.suit, card.number ) )
                    cards_on_table.remove( card )  # remove card from group
                    break


    # Re-draw the window
    window.fill( DARK_GREEN )
    cards_on_table.draw( window )
    pygame.display.flip()
    # ... etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...