Как добавить границы к стенам? - PullRequest
1 голос
/ 29 октября 2019

Я делаю игру, похожую на Binding Of Isaac. Я хочу, чтобы камни вокруг экрана блокировали движение игрока.

Там, где сделан макет камня:

"                                                                ",
"                                                                ",
"                                                                ", 
"                                                                ",
"              jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj                   ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                ",
"                                                                "
]
rockxcoord = 0
rockycoord = 0
for row in level:
    for col in row:
        if col == "j":
            rock = rocks(rockxcoord, rockycoord)
            rockGroup.add(rock)
        rockxcoord +=32
    rockycoord += 50
    rockxcoord = 0

Где установлены границы

    for rock in rockGroup:
        screen.blit(rock.image, [rock.rect.x, rock.rect.y])
        rockCollisionList = pygame.sprite.spritecollide(playerOne, rockGroup, False)
        for rock in rockCollisionList:
            if playerOne.rect.x < rock.rect.x:
                playerOne.rect.x = rock.rect.x - 90
            if playerOne.rect.x > rock.rect.x:
                playerOne.rect.x = rock.rect.x + 80

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

1 Ответ

3 голосов
/ 30 октября 2019

Используйте Спрайты PyGame . На них тоже есть хороший учебник . Сначала это немного больше работы, но потом сэкономит время. Действительно, найдите время, чтобы изучить это. Это стоит вложений.

Ваши стены могут быть простыми:

class WallSprite( pygame.sprite.Sprite ):
    """ A stationay sprite"""
    def __init__( self, position, image ):
        pygame.sprite.Sprite.__init__( self )
        self.image        = image
        self.rect         = self.image.get_rect()
        self.rect.topleft = position 

    def udpate( self ):
        # does not move
        pass

Создайте кучу стен. Очевидно, что более эффективно сделать стену размером 10 на 1 как один спрайт, но для примера мы сделаем стены в стиле Lego ™.

# Create 20 randomly-placed walls
wall_image = pygame.image.load("brick_32.png").convert_alpha()
wall_sprites = pygame.sprite.Group()   # a group for all the wall sprites
for i in range(20):
    # create a wall at a random position
    new_wall = WallSprite( ( random.randrange( 0, WINDOW_WIDTH ), random.randrange( 0, WINDOW_HEIGHT ) ), wall_image )
    wall_sprites.add( new_wall )  # put into the sprite group

brick_32.png brick_32.png

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

# Main loop
done = False
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        # handle direction keys ...

    # move / update the player sprite
    player_sprite.update()

    # handle player <-> wall sprite collisions (for *ALL* walls)
    if ( len( pygame.sprite.spritecollide( player_sprite, wall_sprites, False ) ) > 0 ):
        player_sprite.stop_moving()

    # re-paint the window
    screen.fill( GREEN )
    wall_sprites.draw()   # paints the entire sprite group
    player_sprite.draw()  # paint the player
    pygame.display.flip()

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