Pygame, сохранение спрайта в рамке, clip_ip () не будет работать должным образом

Код:

def main():
    running = True

    while running:

        clock.tick(FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    pygame.quit()
                    sys.exit()

        player.update()
        enemy.update(player)
        #player.rect.clamp_ip(border_rect)

        screen.fill(BACKGROUND_COLOR)
        screen.blit(player.image, player.rect)
        screen.blit(enemy.image, enemy.rect)

        pygame.display.update()




class Mob(pygame.sprite.Sprite):

    def __init__(self, position):
        super(Mob, self).__init__()

        self.image = pygame.Surface((32, 32))
        self.image.fill(pygame.Color('red'))
        self.rect = self.image.get_rect(center=position)
        self.position = pygame.math.Vector2(position)
        self.speed = 3

    def hunt_player(self, player):
        player_position = player.rect.center
        direction = player_position - self.position
        velocity = direction.normalize() * self.speed

        self.position += velocity
        self.rect.center = self.position

    def update(self, player):
        self.hunt_player(player)


class Player(pygame.sprite.Sprite):

    def __init__(self, position):
        super(Player, self).__init__()

        self.image = pygame.Surface((40, 40))
        self.image.fill(pygame.Color('blue'))
        self.rect = self.image.get_rect(center=position)

        self.position = pygame.math.Vector2(position)
        self.velocity = pygame.math.Vector2(0, 0)
        self.speed = 6

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_a]:
            self.velocity.x = -self.speed
        elif keys[pygame.K_d]:
            self.velocity.x = self.speed
        else:
            self.velocity.x = 0

        if keys[pygame.K_w]:
            self.velocity.y = -self.speed
        elif keys[pygame.K_s]:
            self.velocity.y = self.speed
        else:
            self.velocity.y = 0

        self.position += self.velocity
        self.rect.center = self.position


player = Player(position=(350, 220))
enemy = Mob(position=(680, 400))

startscreen()
main()

Вот игра в стиле «Погоня», которой я баловался последние несколько месяцев. Может ли кто-нибудь помочь мне с созданием границы для моего спрайта? Мне удалось использовать метод clip_ip (), но он не позволяет изображению покидать экран, а не сам спрайт, поэтому я удалил его. Любая помощь приветствуется.

Слишком много кода, укажите Полный, минимальный, проверяемый пример

Mercury Platinum 01.05.2018 16:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Фактическое положение спрайта player сохраняется в атрибуте self.position, но вызов player.rect.clamp_ip(border_rect) влияет только на атрибут self.rect, и position все равно будет изменяться в каждом кадре.

Я бы проверил, находится ли проигрыватель за пределами области экрана с помощью метода pygame.Rect.contains, если да, вызовите clamp_ip и установите player.position на новый player.rect.center.

if not border_rect.contains(player.rect):
    player.rect.clamp_ip(border_rect)
    player.position = pygame.math.Vector2(player.rect.center)

Спасибо, сэр, это работает с небольшим вмешательством! Не могли бы вы помочь мне с моей функцией столкновения? Когда два прямоугольника сталкиваются, отображение игры меняется на функцию завершения игры, но затем, когда мне нужно, чтобы функция первого стартового экрана вернулась, она не будет выглядеть так, как если player.rect.colliderect (враг): уже зарегистрировал столкновение. Я пытался поиграть с некоторыми заявлениями, если не, но я не могу никуда добраться. Ценить это!

Lazzo 06.05.2018 04:39

Я проголосовал за, но это не будет отображаться, так как в настоящее время я все еще нахожусь в первые 15 дней с момента создания моей учетной записи. Сделаю дружище, респект.

Lazzo 06.05.2018 17:31

Другие вопросы по теме