Не получается добавить спрайты
я застрял на моменте когда захотел добавить в игру спрайт при передвижении в лево или в право. В этом тестовом коде у меня получилось сделать желаемое Вот код:
from idlelib import window
import random
import pygame
from turtle import width as t_width
pygame.init()
win = pygame.display.set_mode((1200, 500))
pygame.display.set_caption("Cubes")
walkRight = [pygame.image.load('right_1.png'), pygame.image.load('right_2.png'), pygame.image.load('right_3.png'),
pygame.image.load('right_4.png'), pygame.image.load('right_5.png'), pygame.image.load('right_6.png')]
walkLeft = [pygame.image.load('left_1.png'), pygame.image.load('left_2.png'), pygame.image.load('left_3.png'),
pygame.image.load('left_4.png'), pygame.image.load('left_5.png'), pygame.image.load('left_6.png')]
JumpRight = [pygame.image.load('Jump_Right_1.png'),
pygame.image.load('Jump_Right_2.png'),
pygame.image.load('Jump_Right_3.png'),
pygame.image.load('Jump_Right_4.png'),
pygame.image.load('Jump_Right_5.png'),
pygame.image.load('Jump_Right_6.png'),
pygame.image.load('Jump_Right_7.png'),
pygame.image.load('Jump_Right_8.png'),
pygame.image.load('Jump_Right_9.png')]
JumpLeft = [pygame.image.load('Jump_Left_1.png'),
pygame.image.load('Jump_Left_2.png'),
pygame.image.load('Jump_Left_3.png'),
pygame.image.load('Jump_Left_4.png'),
pygame.image.load('Jump_Left_5.png'),
pygame.image.load('Jump_Left_6.png'),
pygame.image.load('Jump_Left_7.png'),
pygame.image.load('Jump_Left_8.png'),
pygame.image.load('Jump_Left_9.png')]
bg = pygame.image.load('bg2.png')
playerStand = pygame.image.load('ninja.png')
clock = pygame.time.Clock()
x = 50
y = 249
width = 48
height = 66
speed = 8
isJump = False
JumpCount = 10
left = False
right = False
animCount = 0
def drawWindow():
global animCount
win.blit(bg, (0, 0))
if animCount + 1 >= 30:
animCount = 0
if left:
win.blit(walkLeft[animCount // 5], (x, y))
animCount += 1
elif right:
win.blit(walkRight[animCount // 5], (x, y))
animCount += 1
else:
win.blit(playerStand, (x, y))
pygame.display.update()
run = True
while run:
clock.tick(40)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_UP] and y > 249 and x > 380 and x < 410:
y -= speed
if keys[pygame.K_DOWN] and y < 450 - width - 5 and x > 380 and x < 410 :
y += speed
if keys[pygame.K_LEFT] and x > 10:
x -= speed
left = True
right = False
elif keys[pygame.K_RIGHT] and x < 1200 - width - 10:
x += speed
left = False
right = True
else:
left = False
right = False
animCount = 0
if not(isJump):
if keys[pygame.K_SPACE]:
isJump = True
else:
if JumpCount >= -10:
if JumpCount < 0:
y += (JumpCount ** 2) / 2
else:
y -= (JumpCount ** 2) / 2
JumpCount -= 1
else:
isJump = False
JumpCount = 10
if keys[pygame.K_ESCAPE]:
run = False
drawWindow()
Решил сделать тоже самое в другом коде но не получилось, я не знаю в чём моя ощибка Помогите пожалуйста добавить спрайты при передвижении в право и в лево в этом коде: Код:
import pygame
import random
# Переменные для установки ширины и высоты окна
SCREEN_WIDTH = 1350
SCREEN_HEIGHT = 950
walkRight = [pygame.image.load('right_1.png'), pygame.image.load('right_2.png'), pygame.image.load('right_3.png'),
pygame.image.load('right_4.png'), pygame.image.load('right_5.png'), pygame.image.load('right_6.png')]
walkLeft = [pygame.image.load('left_1.png'), pygame.image.load('left_2.png'), pygame.image.load('left_3.png'),
pygame.image.load('left_4.png'), pygame.image.load('left_5.png'), pygame.image.load('left_6.png')]
# Подключение фото для заднего фона
# Здесь лишь создание переменной, вывод заднего фона ниже в коде
bg = pygame.image.load('bg3.jpg')
animCount = 0
def drawWindow():
global animCount
win.blit(bg, (0, 0))
if animCount + 1 >= 30:
animCount = 0
if go_left(self):
win.blit(walkLeft[animCount // 5], (x, y))
animCount += 1
elif go_right(self):
win.blit(walkRight[animCount // 5], (x, y))
animCount += 1
pygame.display.update()
# Класс, описывающий поведение главного игрока
class Player(pygame.sprite.Sprite):
# Изначально игрок смотрит вправо, поэтому эта переменная True
right = True
# Методы
def __init__(self):
# Стандартный конструктор класса
# Нужно ещё вызывать конструктор родительского класса
super().__init__()
# Создаем изображение для игрока
# Изображение находится в этой же папке проекта
self.image = pygame.image.load('ninja.png')
# Установите ссылку на изображение прямоугольника
self.rect = self.image.get_rect()
# Задаем вектор скорости игрока
self.change_x = 0
self.change_y = 0
def update(self):
# В этой функции мы передвигаем игрока
# Сперва устанавливаем для него гравитацию
self.calc_grav()
# Передвигаем его на право/лево
# change_x будет меняться позже при нажатии на стрелочки клавиатуры
self.rect.x += self.change_x
# Следим ударяем ли мы какой-то другой объект, платформы, например
block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)
# Перебираем все возможные объекты, с которыми могли бы столкнуться
for block in block_hit_list:
# Если мы идем направо,
# устанавливает нашу правую сторону на левой стороне предмета, которого мы ударили
if self.change_x > 0:
self.rect.right = block.rect.left
elif self.change_x < 0:
# В противном случае, если мы движемся влево, то делаем наоборот
self.rect.left = block.rect.right
# Передвигаемся вверх/вниз
self.rect.y += self.change_y
# То же самое, вот только уже для вверх/вниз
block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)
for block in block_hit_list:
# Устанавливаем нашу позицию на основе верхней / нижней части объекта, на который мы попали
if self.change_y > 0:
self.rect.bottom = block.rect.top
elif self.change_y < 0:
self.rect.top = block.rect.bottom
# Останавливаем вертикальное движение
self.change_y = 0
def calc_grav(self):
# Здесь мы вычисляем как быстро объект будет
# падать на землю под действием гравитации
if self.change_y == 0:
self.change_y = 1
else:
self.change_y += .95
# Если уже на земле, то ставим позицию Y как 0
if self.rect.y >= SCREEN_HEIGHT - self.rect.height and self.change_y >= 0:
self.change_y = 0
self.rect.y = SCREEN_HEIGHT - self.rect.height
def jump(self):
# Обработка прыжка
# Нам нужно проверять здесь, контактируем ли мы с чем-либо
# или другими словами, не находимся ли мы в полете.
# Для этого опускаемся на 10 единиц, проверем соприкосновение и далее поднимаемся обратно
self.rect.y += 10
platform_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)
self.rect.y -= 10
# Если все в порядке, прыгаем вверх
if len(platform_hit_list) > 0 or self.rect.bottom >= SCREEN_HEIGHT:
self.change_y = -16
# Передвижение игрока
def go_left(self):
global animCount
# Сами функции будут вызваны позже из основного цикла
self.change_x = -9 # Двигаем игрока по Х
if(self.right): # Проверяем куда он смотрит и если что, то переворачиваем его
self.flip()
self.right = False
else:
animCount = 0
def go_right(self):
global animCount
# то же самое, но вправо
self.change_x = 9
if (not self.right):
self.flip()
self.right = True
else:
animCount = 0
def stop(self):
# вызываем этот метод, когда не нажимаем на клавиши
self.change_x = 0
def flip(self):
# переворот игрока (зеркальное отражение)
self.image = pygame.transform.flip(self.image, True, False)
# Класс для описания платформы
class Platform(pygame.sprite.Sprite):
def __init__(self, width, height):
# Конструктор платформ
super().__init__()
# Также указываем фото платформы
self.image = pygame.image.load('platform3.png')
# Установите ссылку на изображение прямоугольника
self.rect = self.image.get_rect()
# Класс для расстановки платформ на сцене
class Level(object):
def __init__(self, player):
# Создаем группу спрайтов (поместим платформы различные сюда)
self.platform_list = pygame.sprite.Group()
# Ссылка на основного игрока
self.player = player
# Чтобы все рисовалось, то нужно обновлять экран
# При вызове этого метода обновление будет происходить
def update(self):
self.platform_list.update()
# Метод для рисования объектов на сцене
def draw(self, screen):
# Рисуем задний фон
screen.blit(bg, (0, 0))
# Рисуем все платформы из группы спрайтов
self.platform_list.draw(screen)
# Класс, что описывает где будут находится все платформы
# на определенном уровне игры
class Level_01(Level):
def __init__(self, player):
# Вызываем родительский конструктор
Level.__init__(self, player)
# Массив с данными про платформы. Данные в таком формате:
# ширина, высота, x и y позиция
level = [
[70, 10, 0, 820],
[70, 10, 335, 720],
[70, 10, 50, 600],
[70, 10, 50, 465],
[70, 10, 490, 465],
]
# Перебираем массив и добавляем каждую платформу в группу спрайтов - platform_list
for platform in level:
block = Platform(platform[0], platform[1])
block.rect.x = platform[2]
block.rect.y = platform[3]
block.player = self.player
self.platform_list.add(block)
# Основная функция прогарммы
def main():
# Инициализация
pygame.init()
# Установка высоты и ширины
size = [SCREEN_WIDTH, SCREEN_HEIGHT]
screen = pygame.display.set_mode(size)
# Название игры
pygame.display.set_caption("Платформер")
# Создаем игрока
player = Player()
# Создаем все уровни
level_list = []
level_list.append(Level_01(player))
# Устанавливаем текущий уровень
current_level_no = 0
current_level = level_list[current_level_no]
active_sprite_list = pygame.sprite.Group()
player.level = current_level
player.rect.x = 0
player.rect.y = 120
active_sprite_list.add(player)
# Цикл будет до тех пор, пока пользователь не нажмет кнопку закрытия
done = False
# Используется для управления скоростью обновления экрана
clock = pygame.time.Clock()
# Основной цикл программы
while not done:
# Отслеживание действий
for event in pygame.event.get():
if event.type == pygame.QUIT: # Если закрыл программу, то останавливаем цикл
done = True
# Если нажали на стрелки клавиатуры, то двигаем объект
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player.go_left()
if event.key == pygame.K_RIGHT:
player.go_right()
if event.key == pygame.K_SPACE:
player.jump()
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT and player.change_x < 0:
player.stop()
if event.key == pygame.K_RIGHT and player.change_x > 0:
player.stop()
# Обновляем игрока
active_sprite_list.update()
# Обновляем объекты на сцене
current_level.update()
# Если игрок приблизится к правой стороне, то дальше его не двигаем
if player.rect.right > SCREEN_WIDTH:
player.rect.right = SCREEN_WIDTH
# Если игрок приблизится к левой стороне, то дальше его не двигаем
if player.rect.left < 0:
player.rect.left = 0
# Рисуем объекты на окне
current_level.draw(screen)
active_sprite_list.draw(screen)
# Устанавливаем количество фреймов
clock.tick(30)
# Обновляем экран после рисования объектов
pygame.display.flip()
# Корректное закртытие программы
pygame.quit()
main()