Заставить фон двигаться в пигаме - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь создать игру, используя pygame, и пытаюсь добавить к ней фон (я использовал некоторый код из видео на YouTube, но это не работает).Я также не понимаю, о чем этот код.Я имею в виду фон и перемещается, но он автоматически добавляет новую версию фона в середине экрана, когда старый фон еще не исчез из экрана:

class Background:
    def __init__(self, x, y, picture):
        self.xpos = x
        self.ypos = y
        self.picture = picture
        self.rect = self.picture.get_rect()
        self.picture = pygame.transform.scale(self.picture, (1280, 720))

    def paste(self, xpos, ypos):
        screen.blit(self.picture, (xpos, ypos))

    def draw(self):
        screen.blit(self.picture, (self.xpos, self.ypos))

while True:

background=pygame.image.load("C:/images/mars.jpg").convert_alpha()       

cliff = Background(0, 0, background)


rel_x = x % cliff.rect.width

cliff.paste(rel_x - cliff.rect.width, 0)
if rel_x < WIDTH:
    cliff.paste(rel_x, 0)
    x -= 1

Это то, что в настоящее время происходит с моимфон [! [как выглядит моя проблема] [1]] [1]

[! [Что я хочу, чтобы фон двигался как] [2]] [2]

Этокак я хочу, чтобы мой фон выглядел (пожалуйста, не обращайте внимания на знак, что это был единственный, который я смог найти)

Теперь я обнаружил, в чем реальная проблема

The new problem

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Если вы хотите иметь непрерывно повторяющийся фон, вы должны нарисовать фон дважды:

     +==================+
.----||---------+------||------+
|    ||         |      ||      |
|    ||    1    |   2  ||      |
|    ||         |      ||      |
+----||---------+------||------+
     +==================+

Вы должны знать размер экрана.Размер фона высоты изображения должен соответствовать высоте экрана.Ширина фона может быть разной, но должна быть не меньше, чем у окна (иначе фон должен быть нарисован более 2 раз).

bg_w, gb_h = size
bg =  pygame.transform.smoothscale(pygame.image.load('background.image'), (bg_w, bg_h))

Фон можно представить как бесконечныйряд плиток.Если вы хотите нарисовать фон в определенной позиции pos_x, то вы должны рассчитать положение плитки относительно экрана с помощью оператора по модулю (%).Положение 2-й плитки смещено на ширину фона (bg_w):

x_rel = pos_x % bg_w
x_part2 = x_rel - bg_w if x_rel > 0 else x_rel + bg_w

Наконец, фон должен быть двойным, чтобы заполнить весь экран:

screen.blit(bg, (x_rel, 0))
screen.blit(bg, (x_part2, 0))

Вы можете проверить процесс с помощью следующего примера программы.Фон может быть перемещен на <- </kbd> соответственно ->

import pygame

pygame.init()

size = (800,600)
screen = pygame.display.set_mode(size)
clock = pygame.time.Clock()

bg_w, bg_h = size 
bg = pygame.transform.smoothscale(pygame.image.load('background.image'), (bg_w, bg_h))
pos_x = 0
speed = 10

done = False
while not done:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    allKeys = pygame.key.get_pressed()
    pos_x += speed if allKeys[pygame.K_LEFT] else -speed if allKeys[pygame.K_RIGHT] else 0

    x_rel = pos_x % bg_w
    x_part2 = x_rel - bg_w if x_rel > 0 else x_rel + bg_w

    screen.blit(bg, (x_rel, 0))
    screen.blit(bg, (x_part2, 0))

    pygame.display.flip()
0 голосов
/ 07 марта 2019

Этот SO-ответ должен иметь то, что вам нужно

Возможно, это обеспечивает более умный и более функциональный фоновый класс, чем тот, который вы используете. Я бы сказал, попробовать.

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