Вопрос Не работает анимация

Новичок
Статус
Оффлайн
Регистрация
11 Янв 2023
Сообщения
1
Реакции[?]
1
Поинты[?]
0
Нужна небольшая помощь
У меня есть 2 игры на стадии разработки (добавления анимаций). Проблема в том, что в 1ой игре корректно работает анимация заднего фона, а во 2ой нет (я решил двигать фон справа налево, причем бесконечно, чтобы когда закончился 1ый, потом рисовался 2ой и тд.). Но в коде я добавил 2 изображения фона, 1ое - в начале координат и размерами с игровое окно. 2ое - такое же, только за правым концом окна. И постоянно изменял координаты изображений, чтоб они двигались. Короче, во 2ой игре, когда главный герой проходит длину, равную сумме длин этих двух одинаковых изображений, анимация ломается и происходит наложение кадров друг на друга, все расслаивается и кадры размножаются. Так, как будто бы я какое то окно с ошибкой в винде двигал и оно размножалось.

1ая игра: тестовая (test_game)

Python:
import pygame as game
def sc_refresh(): game.display.update()

game.init()
sc = game.display.set_mode((1366,700), flags=game.NOFRAME)
game.display.set_caption('Mario')
icon = game.image.load('images/main_player_mario/moving_right/1.png')
game.display.set_icon(icon)
bg = game.image.load('images/backgrounds/forest.png')

moving_rihgt = [
    game.image.load('images/main_player_mario/moving_right/1.png'),
    game.image.load('images/main_player_mario/moving_right/2.png'),
    game.image.load('images/main_player_mario/moving_right/3.png'),
    game.image.load('images/main_player_mario/moving_right/4.png')
]

game.mixer.Sound('sounds/sound_1.mp3').play()
anim_counter = 0
bx = 0
x = 0; y = 495

window_opened = True
while window_opened:

    sc.blit(bg,(bx,0))
    sc.blit(bg, (bx + 1366, 0))
    sc.blit(moving_rihgt[anim_counter],(x,y))

    keys = game.key.get_pressed()
    if keys[game.K_d]:
        x += 2
    elif keys[game.K_a]:

            x -= 2
    elif keys[game.K_w]:
        y -= 5
        y += 4

    if anim_counter == 3:
        anim_counter = 0
    else:
        anim_counter += 1

    bx -= 1

    if bx == -1366:
        bx = 0

    if x > 1366+90:
        x = -90
    elif x < -90:
        x = 11366 + 90

    sc_refresh()

    for event in game.event.get():
        if event.type == game.QUIT:
            window_opened = False
            game.quit()
        elif event.type == game.KEYDOWN:
            if event.key == game.K_ESCAPE:
                window_opened = False
                game.quit()
2ая игра: Space Warfare (по сути тоже тестовая, я только изучаю библиотеку, просто название такое):

Python:
class Characters:
    img_max_width = None
    images = None
    position = None
    step_width = None

    def __init__(self,img_max_width=None,images=None,position=None,step_width=None):
        self.img_max_width = img_max_width
        self.images = images
        self.position = position
        self.step_width = step_width

import pygame as game
game.init()
fps = 10
clock = game.time.Clock()
screen_width = 1366;screen_height = 700
game_screen = game.display.set_mode((screen_width,screen_height))

game.display.set_caption('Space Warfare')
def screen_refresh(): game.display.update()
background = (game.image.load('images/backgrounds/digital_field.png'),game.image.load('images/backgrounds/digital_field_reversed.png'))
path_r='images/main_player_soldier/moving_right/'
path_l='images/main_player_soldier/moving_left/'
game.mixer.Sound('sounds/sound_1.mp3').play()
main_player = Characters(145,[[],[]],{'x_0': 10,'y_0': 500},10)
for i in range(0,2):
    for j in range(1,11):
        if i == 0:
            main_player.images[i].append(game.image.load(path_r+str(j)+'.png'))
        else:
            main_player.images[i].append(game.image.load(path_l+str(j)+'.png'))

x_0 = main_player.position['x_0']; y_0 = main_player.position['y_0']
anim_counter = 0
x = x_0

bx = 0

game_window_opened = True
while game_window_opened:
    clock.tick(fps)
    game_screen.blit(background[0],(bx,0))
    game_screen.blit(background[1], (bx + screen_width, 0)) #дублирование фона для его анимации
    game_screen.blit(main_player.images[0][anim_counter], (x, y_0))

    if anim_counter == 5:
        anim_counter = 0
    else:
        anim_counter += 1

    bx -= main_player.step_width

    if bx == -screen_width:
        bx = 0

    if x + main_player.step_width < screen_width:
        x += main_player.step_width
    else:
        x = -main_player.img_max_width


    screen_refresh()

    for event in game.event.get():
        if event.type == game.QUIT:
            game_window_opened = False
            game.quit()
        elif event.type == game.KEYDOWN:
            if event.key == game.K_ESCAPE:
                game_window_opened = False
                game.quit()
Мне кажется, что технически, в обеих играх, чтобы двигать задний фон, я делаю все одинаково. Но если в 1ой работает, во 2ой нет, значит мне все таки только кажется. Помогите мне, пожалуйста, найти ошибку.
 
Сверху Снизу