Как поставить картинку на фон в pygame
Перейти к содержимому

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

  • автор:

Chapter 11: Растровая графика и звук

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

Одна лишь графика не сможет сделать игру атмосферной. Играм нужен звук! Здесь мы добавим звук в вашу игру.

11.1 Хранение программы в папке

fig.create_a_folder

Программы, рассмотренные до этого момента, представляли из себя лишь один .py файл. Добавляя картинки и звуки, появляется больше файлов, являющимися частями игры. Легко перемешать эти файлы с другими программами. Для предотвращения беспорядка будет правильным разместить более сложные программы в отдельные папки. Перед началом любого подобного проекта, щёлкните на кнопке “new folder” и используйте только что созданную папку как место размещения всех новых файлов.

11.2 Установка фонового изображения

fig.background_image

Нужно установить фоновое изображение для вашей игры? В этом примере мы используем изображение, данное ниже. Щёлкните по нему правой кнопкой мыши и сохраните его в только что созданную для вашей игры папку.

Любая картинка, используемая в игре должна быть такого размера, каким ей нужно быть показанной на экране. Не пытайтесь загрузить картинку 5000х5000 пикселей из камеры с большим разрешением в окне 800х600. Используйте программу для редактирования графики (подойдёт даже MS Paint) и измените размер картинки перед её использованием.

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

pygame.image.load("saturn_family1.jpg")

Загрузка картинки не означает её отображение. Для того, чтобы можно было использовать эту картинку позднее, нам нужно задать значение переменной равное тому, что вернёт команда load() . В этом случае, будет создана новая переменная background_image . Этот вариант показан ниже:

background_image = pygame.image.load("saturn_family1.jpg")

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

background_image=pygame.image.load("saturn_family1.jpg").convert()

Загрузка изображения должна быть произведена до основного игрового цикла. Хотя вполне возможно загрузить картинку во время главного игрового цикла, это заставит программу загружать картинку с диска примерно 20 раз в секунду. Это абсолютно не нужно. Картинку нужно загрузить лишь раз, в начале работы программы.

Для отображения картинки, программа использует команду blit() . Это “переносит” биты на экран. Мы однажды уже использовали эту команду для вывода текста на игровой экран.

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

screen.blit(background_image, [0,0])

Этот код переносит картинку, сохранённую в background_image на экран в координатах (0,0).

11.3 Передвижение картинки

fig.player_image

Этот раздел описывает движение красного креста по экрану. Картинка может быть взята здесь:

Для подготовки картинки, способной передвигаться по экрану с помощью мыши, потребуется та же самая команда, что и раньше:

player_image = pygame.image.load("player.png").convert()

Внутри главного цикла программы, достаются координаты мыши, а затем передаются в другую функцию blit как координаты для рисования картинки:

# Достать текущую позицию мыши. # Это вернёт позицию как список из двух номеров. player_position = pygame.mouse.get_pos() x=player_position[0] y=player_position[1] # Скопировать картинку на экран: screen.blit(player_image, [x,y])

fig.nontrans_background

Появляется проблема. Картинка, красный крест с белым фоном, рисутеся следующим образом:

Нам же нужен только красный крест. Хотя картинки являются прямоугольниками, нам иногда нужна абсолютно другая форма. Чтобы обойти это ограничение, нужно сказать программе, чтобы она считала один цвет “прозрачным”, таким образом не отображая его. Это можно сделать сразу же после загрузки. Следующий пример делает белый цвет (предполагая, что white уже задана как переменная) прозрачным:

player_image.set_colorkey(white)

fig.jpeg_artifacts

Это сработает с большим количеством файлов с расширениями .gif и .png. Это не будет так хорошо работать с большинством .jpg файлов. Формат jpeg отлично подходит для хранения фотографий, но он незаметно меняет картинку для уменьшения её размера. Это значит, что не весь цвет фона будет одинаковым. Нижеприведённая картинка с красным крестом была сохранена как jpeg. Белый цвет вокруг креста — не совсем (255,255,255), а просто очень близок к белому.

11.4 Звуки

Этот раздел использует звук щелчка, который быть может скачан с помощью нажатия правой кнопки мыши здесь и выбора “save link as” (или “save target as”, в зависимости от того, как это пишется в вашем браузере)

Так же как и картинки, звуки должны быть загружены перед использованием. Это должно быть проделано только один раз, до главного цикла программы. Следующая команда загружает звуковой файл и создаёт переменную click_sound для того, чтобы ссылаться на него:

click_sound = pygame.mixer.Sound("click.wav")

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

for event in pygame.event.get(): if event.type == pygame.QUIT: done=True if event.type == pygame.MOUSEBUTTONDOWN: click_sound.play()

Pygame не сможет проигрывать все .wav файлы, которые можно найти в интернете. Если бесплатная программа VLC Media Player не сможет проиграть звук, то не сможет это сделать и Pygame.

11.5 Полный код

""" Sample Python/Pygame Programs Simpson College Computer Science http://programarcadegames.com/ http://simpson.edu/computer-science/ Explanation video: http://youtu.be/4YqIKncMJNs Explanation video: http://youtu.be/ONAK8VZIcI4 Explanation video: http://youtu.be/_6c4o41BIms """ import pygame # Define some colors WHITE = (255, 255, 255) BLACK = (0, 0, 0) # Call this function so the Pygame library can initialize itself pygame.init() # Create an 800x600 sized screen screen = pygame.display.set_mode([800, 600]) # This sets the name of the window pygame.display.set_caption('CMSC 150 is cool') clock = pygame.time.Clock() # Before the loop, load the sounds: click_sound = pygame.mixer.Sound("laser5.ogg") # Set positions of graphics background_position = [0, 0] # Load and set up graphics. background_image = pygame.image.load("saturn_family1.jpg").convert() player_image = pygame.image.load("playerShip1_orange.png").convert() player_image.set_colorkey(BLACK) done = False while not done: for event in pygame.event.get(): if event.type == pygame.QUIT: done = True elif event.type == pygame.MOUSEBUTTONDOWN: click_sound.play() # Copy image to screen: screen.blit(background_image, background_position) # Get the current mouse position. This returns the position # as a list of two numbers. player_position = pygame.mouse.get_pos() x = player_position[0] y = player_position[1] # Copy image to screen: screen.blit(player_image, [x, y]) pygame.display.flip() clock.tick(60) pygame.quit()

11.6 Проверка пройденного

def f(): return 10 x=f() print (x)
def f(x): x=x+10 return x x=10 f(x) print (x)
def f(x): x=x+10 return x def g(x): return x*2 print ( f( g(10) ) )
def f(x): x=x+10 return x def g(x): return x*2 print ( g( f(10) ) )
def f(x,y): return x/y x=20 y=5 print ( f(y,x) )
def f(x): return x*2 def g(x): return x-2 def h(x): return x+10 print ( f(5) + g(f(5)) + h(g(10)) ) print ( h(g(f(10))) )
x=len( [2,3,[5,6],[7,9]] print (x)

You are not logged in. Log in here and track your progress.

Copyright © 2017
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin

Модули pygame.image и pygame.transform

Функция load() модуля pygame.image загружает изображение и создает экземпляр Surface , на котором отображено это изображение. В load() передается имя файла. «Родным» форматом является BMP, однако если функция pygame.image.get_extended() возвращает истину, то можно загружать ряд других форматов: PNG, GIF, JPG и др.

import pygame as pg import sys W = 400 H = 300 sc = pg.display.set_mode((W, H)) sc.fill((100, 150, 200)) dog_surf = pg.image.load('dog.bmp') dog_rect = dog_surf.get_rect(bottomright=(W, H)) sc.blit(dog_surf, dog_rect) pg.display.update() while 1: for i in pg.event.get(): if i.type == pg.QUIT: sys.exit() pg.time.delay(20)

Загрузка BMP-изображения

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

dog_surf = pg.image.load('dog.bmp') dog_surf.set_colorkey((255, 255, 255))

Все пиксели, цвет которых совпадает с переданным в set_colorkey() значением, станут прозрачными.

set_colorkey

У формата PNG с альфа-каналом (когда для точек можно настраивать степень прозрачности; обычно устанавливается полностью прозрачный фон) таких проблем нет:

sun_surf = pg.image.load('sun.png') sun_rect = sun_surf.get_rect() sc.blit(sun_surf, sun_rect)

Изображение с альфа-каналом

Ко всем экземплярам Surface рекомендуется применять метод convert() , который, если не передавать аргументы, переводит формат кодирования пикселей поверхности в формат кодирования пикселей главной поверхности. При выполнении игры это ускоряет отрисовку поверхностей.

Если поверхность была создана на базе изображения с альфа-каналом, то вместо convert() надо использовать метод convert_alpha() , так как первый удаляет прозрачные пиксели (вместо них будет черный цвет). Таким образом, код загрузки и обработки изображений разных форматов должен выглядеть примерно так:

dog_surf = pg.image.load('dog.bmp').convert() sun_surf = pg.image.load('sun.png').convert_alpha()

Что по смыслу равносильно:

. dog_surf = pg.image.load('dog.bmp') dog_surf = dog_surf.convert() .

Метод convert() возвращает новую, конвертированную, поверхность. Он не изменяет ту, к которой применяется.

В модуле pygame.image есть функция save() , которая позволяет сохранять переданную ей поверхность (не обязательно главную) в формат BMP, TGA, PNG, JPEG. Пример:

while 1: for i in pygame.event.get(): if i.type == pygame.QUIT: sys.exit() elif i.type == pygame.KEYUP \ and i.key == pygame.K_s: pygame.image.save(sc, 'day.png') pygame.time.delay(20)

Изменение поверхностей

Модуль pygame.transform содержит функции для изменения поверхностей. Некоторые трансформации (например, изменение размера) приводят к ухудшению изображения из-за потери части пикселей. В таких случаях надо сохранять исходную поверхность и выполнять трансформации от нее.

Функции модуля transform , которые изменяют поверхности, возвращают новые. Первым аргументом им передается исходный Surface . Ниже приведены примеры использования наиболее востребованных функций.

Функция flip() переворачивает Surface по горизонтали и вертикали, к потери качества не приводит. Указывается поверхность и булевыми значениями оси переворота.

import pygame import sys sc = pygame.display.set_mode((400, 300)) sc.fill((100, 150, 200)) dog_surf = pygame.image.load('dog.bmp').convert() dog_surf.set_colorkey((255, 255, 255)) dog_rect = dog_surf.get_rect(center=(200, 150)) sc.blit(dog_surf, dog_rect) pygame.display.update() while 1: for i in pygame.event.get(): if i.type == pygame.QUIT: sys.exit() # При отжатии (нажать и отпустить) клавиши f elif i.type == pygame.KEYUP and i.key == pygame.K_f: # собака перевернется слева направо flip = pygame.transform.flip(dog_surf, True, False) sc.fill((100, 150, 200)) sc.blit(flip, dog_rect) pygame.display.update(dog_rect) pygame.time.delay(20)

Поворот и изменение размера:

import pygame import sys sc = pygame.display.set_mode((400, 300)) sc.fill((100, 150, 200)) dog_surf = pygame.image.load('dog.bmp').convert() dog_surf.set_colorkey((255, 255, 255)) dog_rect = dog_surf.get_rect(center=(200, 150)) sc.blit(dog_surf, dog_rect) pygame.display.update() # ждем 1 секунду перед изменением pygame.time.wait(1000) sc.fill((100, 150, 200)) # уменьшаем в два раза scale = pygame.transform.scale( dog_surf, (dog_surf.get_width() // 2, dog_surf.get_height() // 2)) scale_rect = scale.get_rect(center=(200, 150)) sc.blit(scale, scale_rect) pygame.display.update(dog_rect) pygame.time.wait(1000) sc.fill((100, 150, 200)) # поворачиваем на 45 градусов rot = pygame.transform.rotate(dog_surf, 45) rot_rect = rot.get_rect(center=(200, 150)) sc.blit(rot, rot_rect) pygame.display.update() while 1: for i in pygame.event.get(): if i.type == pygame.QUIT: sys.exit() pygame.time.delay(20)

Практическая работа

Допустим, у вас есть такое изображение вида сверху машины:

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

Курс с примерами решений практических работ:
pdf-версия

X Скрыть Наверх

Pygame. Введение в разработку игр на Python

Работа с изображениями

Для того чтобы использовать картинки в вашей программе вам надо сделать следующее:

  1. Загрузить/найти нужный файл в формате png
  2. Положить его в ту же папку где находится файл с кодом вашей программы ( .py )
  3. В программе написать следующую строчку

image = pygame.image.load('file.png').convert_alpha() 

image будет переменной с нашим изображением.

Как и любую переменную, картинку нужно загружать перед игровым циклом ( while running: ). Если вы используете несколько картинок, даже для одного предмета (например разные направления) загружайте их все один раз в начале программы и используйте в зависимости от ситуации.

Вывод на экран

screen.blit(image, (x, y)) 

Изображение нарисуется левым верхним углом в точке (x, y) .

Изменение размера

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

new_image = pygame.transform.scale(image, (width, height)) 

new_image будет вашей картинкой измененной до размеров width и height .

Поворот

new_image = pygame.transform.rotate(image, angle) 

повернет изображение image на angle градусов.

Внимание

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

image = pygame.transform.rotate(image, 5) 
image = pygame.transform.rotate(image, 1) image = pygame.transform.rotate(image, 1) image = pygame.transform.rotate(image, 1) image = pygame.transform.rotate(image, 1) image = pygame.transform.rotate(image, 1) 

Аналогично, если вы хотите чтобы картинка поворачивалась на 1 градус каждый кадр, нельзя писать

while running: . image = pygame.transform.rotate(image, 1) 

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

angle = 0 while running: . angle = angle + 1 rotated_image = pygame.transform.rotate(image, angle) 

Как задать фон окна в Pygame?

Я по книге написал рабочую игру, все отлично работает. Но вот в процессе создания фон можно понять только на определенный цвет, а хотелось бы фоном вставить определенную картинку. Если кто знает как решить подобную задачу подскажите как это сделать.

  • Вопрос задан более года назад
  • 228 просмотров

Комментировать
Решения вопроса 0
Ответы на вопрос 1

Привет! смотри: чтобы задать свой фон тебе нужна картинка, например формата: (png, jpg, jpeg)
после этого ты должен эту картинку закинуть в папку со своим кодом, тое-сть там где код в папке, туда и фон (фотку) закидываешь, тое-сть в одну папку с ним, а после чего пишешь:
bg = pygame.image.load(‘background.png’).convert()

объясняю: (bg) это переменная

pygame.image.load — это загрузить изображение(такая команда в pygame)

в скобках («название файла.png») или может быть («название файла.jpg»)

.convert() это такая команда чтобы сильно не лагало и небыло фризов, но она необязательная

но это ещё не всё. После этого тебе нужно задать команду: (я беру к примеру)
def drawWindow():
screen.blit(bg, (0, 0))

вот объяснение данной команды:
def — это такой термин(называй его как хочешь) он выполняет команду, например «drawWindow» (drawWindow) это название команды, и потом что в команде находится.

в нашем случае здесь в ‘def’ находится команда screen.blit(bg, (0, 0))
что она делает? она рисует объект (в нашем случае фон) на координатах которые мы там укажем.

screen.blit(. ) — «»screen»» это название нашего окна, которое мы указывали, а команда blit рисует фон или другие объекты: screen.blit(. )

bg — это переменная которую он будет рисовать, тое-сть наш фон, мы указывали её ранее:
(bg =pygame.image.load(‘название фото фона.png’).convert()

и потом координаты в скобках где должен быть фон, в моём случае это: (0, 0) тое-сть в самом углу и начале.

я тебе расписал всё подробно, чтобы ты вникнул и всё понял, надеюсь всё было понятно, не пугайся что так много написанно, команда сама-по себе выглядит вот так:

def drawWindow():
screen.blit(bg, (0, 0))

drawWindow() это нужно написать чтобы запустилась наша команда с: def

надеюсь помог тебе и у тебя всё получилось и получится, пока. Удачи!

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

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