-
Автор темы
- #1
Нужна небольшая помощь
У меня есть 2 игры на стадии разработки (добавления анимаций). Проблема в том, что в 1ой игре корректно работает анимация заднего фона, а во 2ой нет (я решил двигать фон справа налево, причем бесконечно, чтобы когда закончился 1ый, потом рисовался 2ой и тд.). Но в коде я добавил 2 изображения фона, 1ое - в начале координат и размерами с игровое окно. 2ое - такое же, только за правым концом окна. И постоянно изменял координаты изображений, чтоб они двигались. Короче, во 2ой игре, когда главный герой проходит длину, равную сумме длин этих двух одинаковых изображений, анимация ломается и происходит наложение кадров друг на друга, все расслаивается и кадры размножаются. Так, как будто бы я какое то окно с ошибкой в винде двигал и оно размножалось.
1ая игра: тестовая (test_game)
2ая игра: Space Warfare (по сути тоже тестовая, я только изучаю библиотеку, просто название такое):
Мне кажется, что технически, в обеих играх, чтобы двигать задний фон, я делаю все одинаково. Но если в 1ой работает, во 2ой нет, значит мне все таки только кажется. Помогите мне, пожалуйста, найти ошибку.
У меня есть 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()
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()