@pyblpovishaisa

Как написать отскок квадрата по горизонтали(pygame)?

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

import pygame

WIDTH = 360 # Ширина игрового окна
HEIGHT = 480 # Высота игрового окна
FPS = 60 # Частота кадров в секунду

# Цвета (R, G, B)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)


class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50, 50))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, HEIGHT / 2)


    def update(self):
        if self.rect.right < WIDTH:
            self.rect.x += 5
        elif self.rect.left > WIDTH:
            self.rect.x -= 5


# Создаём игру и окно
pygame.init()
pygame.mixer.init() # Звук
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('My game')
clock = pygame.time.Clock()
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)

# Цикл игры
running = True
while running:
    # Держим цикл на правильной скорости
    clock.tick(FPS)
    # Ввод процесса (события)
    for event in pygame.event.get():
        # Проверяем закрытие окна
        if event.type == pygame.QUIT:
            running = False

    # Обновление
    all_sprites.update()

    # Рендеринг
    screen.fill(BLACK)
    all_sprites.draw(screen)
    # После отрисовки всего, переворачиваем экран
    pygame.display.flip()

pygame.quit()
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
@o5a
Потому что эта проверка зацикливает квадрат у границы: как только он начинает идти в обратную сторону, срабатывает первое условие и он снова меняет направление.
Отскок обычное делается сменой знака прироста расстояния (скорости) на каждой из границ.
def __init__(self):
   ....
    self.speed = SPEED


def update(self):
    self.rect.x += self.speed
    if self.rect.left < 0 or self.rect.right > WIDTH:
        self.speed = -self.speed
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SKAIT
@SKAIT
среднячок но скоро стану магистро и ПОКАРЮ ВЕСЬ МИ
Добавляем переменную SPEED со значением допустим 5 ( SPEED = 5 ) и в метод __init__ self.speed = SPEED
( если ты знаешь о Class в Python, то легко справишься и поймешь для чего, иначе учи python, а после интересуйся библиотекой Pygame )
def update(self):
    self.rect.x += self.speed
    if self.rect.left < 0 or self.rect.right > WIDTH:
        self.speed = -self.speed

( не забывайте, что все, что вы помещаете в метод update(), будет происходить в каждом кадре. )
в этом блоке кода каждый кадр, а точнее каждые 0.02 сек происходит следующее:
self.rect.x += self.speed #speed = 5
твой прямоугольник переместился вправо на 5, потому что SPEED равна 5. след шаг
if self.rect.left < 0 or self.rect.right > WIDTH:
проверяется дошел ли левый край объекта до левой стороны окна или правая сторона объекта до правой стороны окна, если хоть одно из этих двух условий верно, то переходит к выполнению блока if, если не одно не является истиной, то все начинается сначала (перемещается на 5 вправо и проверяется условие).

Как только объект дошел до правой cтороны, то speed меняет свое значение на -5 и теперь прямоугольник будет идти влево self.rect.x += self.speed #speed = -5 до тех пор пока левая сторона объекта не дойдет до левой стороны окна =3
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы