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

от admin

Как добавить фоновое изображение в Pygame?

new для pygame просто интересно, как я собираюсь добавить фоновое изображение в саму игру? это мой код до сих пор, я использовал bg как способ импортировать свое изображение, но сам файл py отказывается загружать.

3 ответа

Эта проблема может быть легко решена. Для вашего фона вам понадобится изображение размером с экран. Не забудьте добавить pygame.init() в начале игры, чтобы начать ее и свои способности. Функция для этого изображения может быть использована следующим образом:

Это позволит программе загружать ваше изображение с помощью этой функции, когда вы вызываете ее следующим образом:

И вам также понадобятся эти две строки в вашем цикле while :

Это заполнит ваш белый экран и поместит фоновое изображение поверх него, но под ваши другие спрайты и объекты.
Предложения: Вы должны сделать другой класс для своего другого спрайта (возможно, причина, по которой изображение не появляется). Пример может выглядеть следующим образом:

Затем вы можете активировать его так:

Выберите координаты для a и b . Затем вы можете разжечь изображение на экране, как это, но после вашего фона blit statement:

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

new to pygame just wondering how i would go about adding a background image into the game itself? this is my code so far, i’ve been using the bg as a way to import my image but the py file itself refuses to load up.

3 Answers 3

For background I always make an image the size of my game window or smaller then before all of the images are displayed, I blit that image to 0,0.

Hope this helps.

This problem can be easily solved. You will need an image the size of your screen for your background. Please remember to add pygame.init() at the beginning of your game to be able to start it and its abilities. A function for this picture can be used like this:

This will allow the program to load your image through this function when you call it like this:

And you will also need these two lines in your while loop:

This will fill your screen white and put the background image over it but under your other sprites and objects.
Suggestions: You should make another class for your other sprite (maybe the reason why the image is not appearing). An example could be like:

You could then «activate» it like this:

Select the coordinates for a and b . You can then blit the image on to the screen like this but after your background blit statement:

Pygame tutorial #3: rendering images, drawing background for the text.

In previous tutorial I explained how message display function works and how it’s written. Now, we’ll be writing a function that renders images, and draws a background for our text.

Rendering images is quite straightforward, and all it requires is to load the image and add it to the surface. Simple and easy enough.

Pygame supports a dozen of image extensions, like these:

JPG, PNG, GIF, BMP, PCX, TGA, TIF, LBM, PBM, XPM.

If you want to easily access the images in your game, put them in the same folder where your python script is executed. This allows us to display image using only the filename of the file instead of the full path to it:

Now, let’s get to drawing the background.

In point&click/novel games, the text is usually displayed in dialog boxes with a background. Let’s take “Doki Doki Literature Club!” for instance:

The function that draws rectangles is pygame.draw.rect() .
Please note, that we’ll be using this function in order to render text. If you’re unfamiliar with it, I suggest you reading the previous part of the tutorial.

text_rect argument requires 4 values: width&height of the rectangle, and X&Y position of the rectangle. Here’s a list of arguments for the background we are going to use throughout this tutorial: [1366,168,0,600] . Let’s fill the lower part of the screen with white color.

message_display(*normal_message, "Ah mountains. The nature is truly beatiful.", True, [1366,168,0,600])

Here’s the result:

Let’s fix it a little bit…

Yes, we will pass a color instead of True/False via the rect_draw variable. This is a good solution, but probably renaming the rect_draw argument would make it prettier.
Time to give the function another try!

message_display(*normal_message, "Ah mountains. The nature is truly beatiful.", (0,0,0), [1366,168,0,600])

Let’s add an image now. Just google “Mountain wallpapers 1366×768”, and render it at 0,0 XY.

This looks a lot better, but as you can see, the background is not transparent. You might wonder what’s the problem with making the rectangle transparent, as it is easy enough to add an “alpha” value to the color we’re using. But the problem is that, we cannot draw transparent rectangles, even when adding another “alpha” value. Gustavo clearly says that there’s no way to do so, but to create another surface, set its transparency to a specific value, and then add to our main surface. Here’s how I’ve done it:

Quick breakdown on this piece of code: you pass a list of values, where the first 2 are width and height of the surface, then the color, and finally, transparency value. The less the transparency value the more it’s transparent. The minimum value is 0, which is 100% transparent, and the maximum is 255, which is, as you may have guessed, not transparent at all.

Читать:
Html как сделать проверку пароля c

The first line creates a surface. Then, it fills the surface with the specified color and sets its transparency. And finally, the surface is added to the main surface.
Also, the calculations at the end are made to render the rectangle at a proper X&Y position.
The result:

At this point, the project begins to take great shape! The only thing it lacks is clickability and music, and we could proudly call it a game!

Создание игр на 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 позволяет нам перехватывать события и реагировать на них (нажатия клавиш, движение мыши и нажатия кнопок мыши). Также мы рассмотрим такие элементы игрового процесса, как движение мяча, задание его скорости и перемещение ракетки.

Похожие статьи