Как поставить картинку на фон в pygame

Не могу добавить фоновое изображение в PyGame

Фото которое хочу сделать фоном игры в размере 500 на 500, как и само окно игры. Формат — png. И фото находиться в папке с файлом игры, с этим проблем нету.

Запускаю игру. Ошибок не выдает, но фон не меняет. Так же и со спрайтом игрока. Помогите.

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

Фоновое изображение
Доброе время суток! Подскажите, пожалуйста, как "растянуть" по вертикали фоновое изображение(по.

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

Создание игр на Python 3 и Pygame: Часть 2

Во второй из пяти частей туториала, посвящённого созданию игр с помощью Python 3 и Pygame, мы рассмотрим класс TextObject , используемый для рендеринга текста на экране. Мы создадим основное окно, в том числе и фоновое изображение, а затем научимся отрисовывать объекты: кирпичи, мяч и ракетку.

Класс TextObject

Класс TextObject предназначен для отображения текста на экране. Можно сделать вывод, что с точки зрения дизайна он должен быть подклассом класса GameObject , потому что тоже является визуальным объектом и его тоже иногда нужно двигать. Но я не хотел вводить глубокую иерархию классов, при которой весь отображаемый Breakout текст оставался на экране неизменным.

Класс TextObject создаёт объект шрифта. Он рендерит текст на отдельную текстовую поверхность, которая затем копируется (рендерится) на основную поверхность. Интересный аспект TextObject заключается в том, что у него нет какого-то фиксированного текста. Он получает функцию text_func() , вызываемую каждый раз, когда он рендерится.

Это позволяет нам обновлять отображение жизней и очков в Breakout, просто создав функцию, возвращающую текущие жизни и очки, а не отслеживать то, какие текстовые объекты отображают очки и жизни и обновлять их текст при каждом их изменении. Это удобный трюк из функционального программирования, и в крупных играх он позволяет поддерживать удобство и аккуратность программы.

Создание основного окна

Игры на Pygame выполняются в окнах. Можно даже сделать так, чтобы они выполнялись в полноэкранном режиме. Сейчас я расскажу, как отобразить пустое окно Pygame. Вы увидите многие элементы, которые мы обсуждали ранее. Сначала вызывается init() Pygame, а затем создаются основная поверхность рисования и таймер.

Затем выполняется основной цикл, который постоянно заполняет экран однотонным серым цветом и вызывает метод таймера tick() с частотой кадров.

Использование фонового изображения

Обычно однотонный цвет фона выглядит не очень интересно. Pygame очень хорошо работает с изображениями. Для Breakout я нашёл любопытную фотографию настоящего космоса, сделанную НАСА. Код очень прост. Сначала он перед основным циклом загружает фоновое изображение с помощью функции pygame.image.load() . Затем вместо того, чтобы заливать экран цветом, он выполняет блиттинг (копирование битов) изображения на экран в позицию (0,0). В результате на экране отображается изображение.

Отрисовка фигур

Pygame может рисовать всё, что угодно. В модуле pygame.draw есть функции для отрисовки следующих фигур:

  • прямоугольника (rect)
  • многоугольника (polygon)
  • круга (circle)
  • эллипса (ellipse)
  • дуги (arc)
  • отрезка (line)
  • отрезков (lines)
  • сглаженного отрезка (anti-aliased line)
  • сглаженных отрезков (anti-aliased lines)

Отрисовка кирпичей

Кирпичи — это просто прямоугольники. В Pygame есть функция pygame.draw.rect() , получающая поверхность, цвет и объект Rect (левую и верхнюю координату, ширину и высоту) и рендерящая прямоугольник. Если дополнительный параметр ширины больше нуля, то он отрисовывает контур. Если ширина равна нулю (значение по умолчанию), то рисует сплошной прямоугольник.

Стоит заметить, что класс Brick является подклассом GameObject и получает все его свойства, но также имеет и цвет, который обрабатывает самостоятельно (потому что могут существовать игровые объекты, имеющие несколько цветов). Поле special_effect мы пока рассматривать не будем.

Отрисовка мяча

Мяч в Breakout — это просто круг. В Pygame есть функция pygame.draw.circle() , получающая цвет, центр, радиус и дополнительный параметр ширины, который по умолчанию равен нулю. Как и в функции pygame.draw.rect() , если ширина равна нулю, то отрисовывается сплошной круг. Ball тоже является подклассом GameObject.

Так как мяч всегда движется (в отличие от кирпичей), он также имеет скорость, которая передаётся для обработки базовому классу GameObject . Класс Ball имеет небольшое отличие — параметры x и y обозначают его центр, а параметры x и y, передаваемые базовому классу GameObject являются верхним левым углом ограничивающего прямоугольника. Чтобы преобразовать центр в верхний левый угол, достаточно вычесть радиус.

Отрисовка ракетки

Ракетка — это ещё один прямоугольник, двигающийся влево и вправо в ответ на нажатия игроком клавиш со стрелками. Это значит, что положение ракетки в разных кадрах может отличаться, но в процессе отрисовки это просто прямоугольник, который должен рендериться в текущей позиции, какой бы она ни была. Вот как выглядит соответствующий код:

Заключение

В этой части мы узнали о классе TextObject и о том, как рендерить текст на экране. Также мы познакомились с тем, как рисовать объекты: кирпичи, мяч и ракетку.

В третьей части мы узнаем, как работает обработка событий и как Pygame позволяет нам перехватывать события и реагировать на них (нажатия клавиш, движение мыши и нажатия кнопок мыши). Также мы рассмотрим такие элементы игрового процесса, как движение мяча, задание его скорости и перемещение ракетки.

Стрелялка с Pygame №4: графика

Четвертая часть проект «Стрелялка с Pygame». Если пропустили, обязательно вернитесь и начините с первой части. В этот раз речь пойдет об использовании заготовленной графики.

В этой серии уроков будет создана полноценная игра на языке Python с помощью библиотеки Pygame. Она будет особенно интересна начинающим программистам, которые уже знакомы с основами языка и хотят углубить знания, а также узнать, что лежит в основе создания игр.

Выбор графики

В уроке, посвященном спрайтами, затрагивалась тема Opengameart.org — источника бесплатного арта для игр; и популярного местного автора, Kenney. Kenney создал набор арта, который прекрасно подойдет для этой стрелялки. Он называется «Space Shooter Pack». Найти его можно здесь:

Он включает массу качественных изображений с космическими кораблями, лазерами, астероидами и так далее.

Архив содержит несколько папок. Для этого проекта нужно папка PNG со всеми изображениями по отдельности. Для спрайтов пока что нужно только три, а также изображение звездного неба для фона.
Изображение игрока
Изображение врага
Изображение выстрела
Фон игры

Изображения необходимо скопировать туда, где игра сможет их найти. Лучше всего создать новую папку в том же месте, где хранится код игры. Назовем ее «img».

Загрузка изображений

Чтобы быть уверенными в том, что код будет работать в любой операционной системе, нужно использовать функцию os.path , которая определяет правильный путь к файлам вне зависимости от ОС.

В верхней части программы необходимо определить местоположение папки img :

Прорисовка фона

Теперь можно приступать к загрузке фонового изображения. Загрузку ассетов необходимо производить до игрового цикла и кода запуска:

Теперь можно прорисовать фон в разделе Draw игрового цикла до прорисовки любого из спрайтов:

blit — это олдскульный термин из компьютерной графики, который обозначает прорисовку пикселей одного изображения на другом. В этом случае — прорисовку фона на экране. Теперь фон выглядит намного лучше:

Изображения спрайтов:

Теперь можно загрузить изображения спрайтов:

Начнем с игрока — необходимо заменить зеленый прямоугольник, то есть self.image и не забыть убрать параметр image.fill(GREEN) , который больше не нужен:

Тем не менее имеется пара проблем. Во-первых, картинка чуть больше, чем требуется. Есть два варианта: 1) открыть ее в графическом редакторе (Photoshop, GIMP) и отредактировать; 2) поменять размер прямо в коде. Выбираем второй вариант. Для этого понадобится функция Pygame под названием transform.scale() . Уменьшим изображение вдвое — до размера 50х30 пикселей.

Вторая проблема — черный прямоугольник вокруг корабля. Чтобы это исправить, нужно назначить прозрачный цвет с помощью set_colorkey :

Если повторить то же самое для классов Bullet и Mob (хотя их размер менять не нужно), игра будет выглядеть намного лучше:

Итого

Теперь в игре есть графика, и это помогает заметить новую проблему: астероиды уничтожают корабль, даже когда не касаются его. В следующем уроке поработаем над тем, чтобы столкновения работали корректно.

Python Pygame: Looping Background

Featured Img Background Loop Pygame

Hi there! Today I am going to teach you how to make a fun a very fun looping background in Pygame! So let’s begin!

STEP 1: Importing Pygame

We will be importing the pygame module to start off with. We would also be initializing pygame into our program. We will also import python.locals library for the basic functionalities of the pygame window

The code for the same is shown below.

STEP 2: Creating a basic window

The next thing that is needed is to create variables to set the width and height of the game window. For now, let’s keep both width and height as 1000 and 500 respectively.

To create a window object using pygame function named display.set_mode and pass the height and width of the game window.

The code for the same is shown below:

STEP 3: Adding a background image

To add the background image all we need to do is use the function named image.load and add the path of the image as the parameter.

We will also be sizing the image to make sure it fully fills up the whole screen. And for that, we will be using transform.scale function and pass our original image along with the scaling size i.e. the screen dimensions.

The code for the same is shown below:

But this code will only display the window for some split seconds and then it’s gone. We don’t need that!

So we will add the logic which will make sure the screen keeps displaying until and unless the X on the screen is clicked by the user.

Let me show you the code first.

In the code, we created a running variable that is set True by default. The application runs as long as the running variable stays True.

And in order to place the image, we have to put a blit function inside the running loop. The blit function will take the image variable and the coordinates of the image.

To set the end game logic we will be keeping track of all the events and check the type of event happening in the game. If the event type is pressing of X button on the screen, we set the running value is False.

But the displaying of the background image is still not complete. In order to do that, we will add an display.update function to update the screen with all the elements declared.

After the whole screen is loaded and closed we quit the pygame we initialized earlier.

After we did all the necessary we will end up with a screen shown below. (Your background image or window shape may differ if you chose a different background image or size of the screen)

Screen01 Loop Bg

Screen01 Loop Bg

STEP 4: Looping background with Pygame

Our main aim is to loop the background image along the width of the screen. So for that, we will make use of an iterator, i and initialize it with 0 value to start off with.

We would be decreasing this iterator (i) because we have to go ahead along the with.

The progress of the code along with the necessary changes are shown in the code below. The changed lines are highlighted as well to make it easier for you to understand.

The video below shows the result of the code is. Oh and see the looping background to the right! But the end doesn’t look quite right.

The problem here is that we are not redrawing the image. Hence, the program stays with the last configuration of the pixels loaded.

Now in order to solve the issue, we are going to test the situation by putting a background color when the image is loaded completely. For the same we will be using fill function and pass the RBG format for the color. For now we will be using Black.

The code like for the same is shown below. This line will come right before the background image loading command.

The output of the same is shown below.

But instead of having black color, we want to load the background image after the width is over for the background image. For the same, we will be using the blit function and apply the background image at the future coordinates. The code line for the same is shown below.

The output after the code line is added is shown below. The background images displays itself twice but then returns to the back background again. We don’t want that.

Now the cause of this happening is that i reaches negative of the width of the screen. We need to handle the same situation and that is done by using the blit function when i reaches negative of the width. Also i value is reset i.e. set to 0.

The code for the same is shown below. This code is added between the i decrement command and the initial loading background image.

The final code is shown below. Hope you are now clear with all the concepts.

The final output of the code is shown below.

Conclusion

This type of background loops can be used to create some basic 2D games like a simple running or jumping game.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *