Перейти к содержимому

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

  • автор:

Модули 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

Как работать с изображениями. Модули image и transform

Для фотореалистичных изображений лучше всего использовать JPEG, т.к. незначительные потери практически не скажутся на визуальном восприятии, но изображение будет хорошо сжато. Для искусственных изображений с большим наличием однотонных областей (например, клип-арт) где четкость границ и однотонность заливки имеет первостепенное значение, лучше выбирать формат PNG. Кроме того, этот формат хранит альфа-канал для прозрачного фона (в JPEG такой возможности нет).

Программа ниже инициализирует Pygame и выводит в консоль значение функции get_extended():

import pygame pygame.init() W, H = 600, 400 sc = pygame.display.set_mode((600, 400)) pygame.display.set_caption("Изображения") pygame.display.set_icon(pygame.image.load("app.bmp")) clock = pygame.time.Clock() FPS = 60 WHITE = (255, 255, 255) RED = (255, 0, 0) YELLOW = (239, 228, 176) print( pygame.image.get_extended() ) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() clock.tick(FPS)

Как видите, в данном случае Pygame возвращает 1, значит, можно использовать форматы PNG и JPEG. Теперь загрузим в программе изображение машинки:

car_surf = pygame.image.load("images/car.bmp")

Здесь используется функция load(), в которой указывается путь к изображению (относительно исполняемого файла на Питоне) и на выходе она формирует поверхность с изображением машинки. Далее, мы можем отобразить содержимое этой поверхности уже знакомым нам способом:

car_rect = car_surf.get_rect(center=(W//2, H//2)) sc.blit(car_surf, car_rect) pygame.display.update()

После выполнения программы увидим в центре окна изображение машины: Выглядит не очень. Добавим фон в виде изображения песка:

bg_surf = pygame.image.load("images/sand.jpg") sc.blit(bg_surf, (0, 0))

Стало лучше, но белый фон у машинки явно выделяется на фоне песка. Давайте укажем Pygame, что белый цвет следует воспринимать как прозрачный:

car_surf.set_colorkey((255, 255, 255))

Теперь намного лучше. Однако, если имеется файл с альфа-каналом (прозрачным фоном), то оно будет сразу отображаться нужным образом:

finish_surf = pygame.image.load("images/finish.png") sc.blit(finish_surf, (0, 0))

Следующий важный момент, особенно при разработке динамических игр, перевод пикселей загруженных изображений в формат пикселей главной поверхности:

car_surf = pygame.image.load("images/car.bmp").convert() finish_surf = pygame.image.load("images/finish.png").convert_alpha() bg_surf = pygame.image.load("images/sand.jpg").convert()

В этом случае, перерисовка поверхностей будет выполняться быстрее. Причем, обратите внимание, изображение в формате PNG с альфа-каналом преобразуется методом convert_alpha(), а не convert(). Вообще, эти строчки равносильны следующей операции:

car_surf = pygame.image.load("images/car.bmp") car_surf = car_surf.convert()

То есть, методы convert() и convert_alpha() – это методы класса Surface, которые возвращают новую поверхность с измененным представлением пикселей. При этом прежняя поверхность остается без изменений. Например, если переписать последнюю строчку вот так:

car_surf2 = car_surf.convert()

то пиксели car_surf2 будут приведены к формату главной поверхности, а пиксели car_surf останутся прежними – без изменений.

Трансформация поверхностей

Предположим, что мы теперь хотели бы уменьшить масштаб изображения фона, чтобы песок был более мелкий. Это можно сделать с помощью модуля pygame.transform содержащий различные функции трансформации поверхностей. Подробное их описание можно посмотреть на странице официальной документации: https://www.pygame.org/docs/ref/transform.html Итак, мы воспользуемся функцией: pygame.transform.scale(Surface, (width, height), DestSurface = None) -> Surface Здесь первый параметр – преобразуемая поверхность; (width, height) – ее новые значения ширины и высоты. В нашей программе вызовем эту функцию так:

bg_surf = pygame.transform.scale(bg_surf, (bg_surf.get_width()//3, bg_surf.get_height()//3))

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

car_up = car_surf car_down = pygame.transform.flip(car_surf, 0, 1) car_left = pygame.transform.rotate(car_surf, 90) car_right = pygame.transform.rotate(car_surf, -90)

Далее, определим переменные для хранения текущего вида машинки и ее скорости:

car = car_up speed = 5

А внутри главного цикла будем выполнять перерисовку главного окна с текущим видом и положением машинки:

while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() bt = pygame.key.get_pressed() if bt[pygame.K_LEFT]: car = car_left car_rect.x -= speed if car_rect.x  0: car_rect.x = 0 elif bt[pygame.K_RIGHT]: car = car_right car_rect.x += speed if car_rect.x > W-car_rect.height: car_rect.x = W-car_rect.height elif bt[pygame.K_UP]: car = car_up car_rect.y -= speed if car_rect.y  0: car_rect.y = 0 elif bt[pygame.K_DOWN]: car = car_down car_rect.y += speed if car_rect.y > H-car_rect.height: car_rect.y = H-car_rect.height sc.blit(bg_surf, (0, 0)) sc.blit(finish_surf, (0, 0)) sc.blit(car, car_rect) pygame.display.update() clock.tick(FPS)
  • pygame.image – загрузка/сохранение изображений;
  • pygame.transform – трансформация поверхностей.

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » цвет фона в pygame

#1 Май 10, 2018 21:52:44

rascally_rabbit Зарегистрирован: 2016-09-22 Сообщения: 28 Репутация: 0 Профиль Отправить e-mail

цвет фона в pygame

Помогите, пожалуйста, с pygame
Нижеприведенный код работает без ошибок, но цвет фона окна не изменяется.

import sys import pygame def run_game(): pygame.init() screen = pygame.display.set_mode((900, 600)) pygame.display.set_caption("Alien Invasion") bg_color = (230, 230, 230) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() screen.fill(bg_color) pygame.display.flip() run_game() 

Отредактировано rascally_rabbit (Май 10, 2018 21:53:20)

#2 Май 10, 2018 22:07:14

Romissevd От: Счастье Зарегистрирован: 2015-03-01 Сообщения: 533 Репутация: 76 Профиль Отправить e-mail

цвет фона в pygame

import sys import pygame def run_game(): pygame.init() screen = pygame.display.set_mode((900, 600)) pygame.display.set_caption("Alien Invasion") bg_color = (230, 230, 230) screen.fill(bg_color) pygame.display.flip() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() run_game() 

Проблема в том, что твоя программа доходит до выполнения цикла и зависает, пока не выполнишь закрыть окно, затем по код выполняется дальше, но ты этого уже не видишь…

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

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

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