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

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

  • автор:

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

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
import pygame pygame.init() win = pygame.display.set_mode((500, 500)) pygame.display.set_caption("First game") walkRight = [pygame.image.load('sprite1.png')] walkLeft = [pygame.image.load('sprite1.png')] background_image = pygame.image.load("bg.png").convert() screen.blit(background_image [0,0]) clock = pygame.time.Clock() x = 50 y = 430 width = 24 height = 48 speed = 5 isJump = False jumpCount = 10 left = False right = False animCount = 0 def drawWindow(): global animCount 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)) else: win.blit(playerStand, (x, y)) win.blit(bg, (0, 0)) pygame.display.update() run = True while run: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and x > 5: x -= speed left = True right = False elif keys[pygame.K_RIGHT] and x  500 - width - 5: 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 drawWindow() pygame.quit()

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

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

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

Класс TextObject

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

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

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

import pygame class TextObject: def __init__(self, x, y, text_func, color, font_name, font_size): self.pos = (x, y) self.text_func = text_func self.color = color self.font = pygame.font.SysFont(font_name, font_size) self.bounds = self.get_surface(text_func()) def draw(self, surface, centralized=False): text_surface, self.bounds = \ self.get_surface(self.text_func()) if centralized: pos = (self.pos[0] - self.bounds.width // 2, self.pos[1]) else: pos = self.pos surface.blit(text_surface, pos) def get_surface(self, text): text_surface = self.font.render(text, False, self.color) return text_surface, text_surface.get_rect() def update(self): pass

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

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

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

import pygame pygame.init() screen = pygame.display.set_mode((800, 600)) clock = pygame.time.Clock() while True: screen.fill((192, 192, 192)) pygame.display.update() clock.tick(60)

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

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

import pygame pygame.init() screen = pygame.display.set_mode((800, 600)) clock = pygame.time.Clock() background_image = pygame.image.load('images/background.jpg') while True: screen.blit(background_image, (0, 0)) pygame.display.update() clock.tick(60)

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

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 мы пока рассматривать не будем.

import pygame from game_object import GameObject class Brick(GameObject): def __init__(self, x, y, w, h, color, special_effect=None): GameObject.__init__(self, x, y, w, h) self.color = color self.special_effect = special_effect def draw(self, surface): pygame.draw.rect(surface, self.color, self.bounds)

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

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

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

import pygame from game_object import GameObject class Ball(GameObject): def __init__(self, x, y, r, color, speed): GameObject.__init__(self, x - r, y - r, r * 2, r * 2, speed) self.radius = r self.diameter = r * 2 self.color = color def draw(self, surface): pygame.draw.circle(surface, self.color, self.center, self.radius)

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

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

import pygame import config as c from game_object import GameObject class Paddle(GameObject): def __init__(self, x, y, w, h, color, offset): GameObject.__init__(self, x, y, w, h) self.color = color self.offset = offset self.moving_left = False self.moving_right = False def draw(self, surface): pygame.draw.rect(surface, self.color, self.bounds)

Заключение

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

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

  • pygame
  • python 3
  • программирование игр

Задний фон и персонажи игры. Программирование в Python PyGame

Задний фон и персонажи игры

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

Загрузка рисунка Функция pygame.image.load () загружает изображение с диска.

5 слайд Загрузка рисунка Функция pygame.image.load () загружает изображение с диска. Графический формат, который pygame распознает всегда, -это BMP (Paint) Функция pygame.image.get_extended () то можно загрузить ряд других форматов. Общая строка загрузки рисунка img = pygame.image.load(«название файла (например: picture.jpg)»)

Вывод на экран screen =blit(image,(x,y)) изображение копируется из одного мес.

6 слайд Вывод на экран screen =blit(image,(x,y)) изображение копируется из одного места в другое, начиная с координаты (х,у) верхнего левого угла Pygame.surfase.blit помещает одно изображение поверх другого. Метод blit () применяется к той поверхности, на которую «накладывается». blit() позволяет переносить картинку, сохранённую в screen на экран в координатах (0,0)

Изменение размера изображения new_image= pygame.transform.scaie(image,(width.

7 слайд Изменение размера изображения new_image= pygame.transform.scaie(image,(width,height)) image,(width,height) отображает название, длину и ширину изображения, которое вводиться. Rect используется для управления прямоугольными областями и сохраняет их. Pygame.surfase.convert изменяет формат пикселей изображения Pygame.surfase.set_colorkey Устанавливает прозрачную поверхность

Код программы Impot pygame pygame.init() screen=pygame.display.set_mode((400.

8 слайд Код программы Impot pygame pygame.init() screen=pygame.display.set_mode((400,300)) jaulay_surf=pygame.image.load(‘001.bmp’).convert() # загрузка фонового изображения jaulay_surf.set_colorkey((255,255,255)) # устанавливает прозрачную поверхность jaulay_rect= jaulay_surf.set_rect(center=(200,150)) # изображение размещается в центре экрана screen.blit(jaulay_surf, jaulay_rect) # изображение помещается на место для рисунка bala_surf=pygame.image.load(‘bala. png’).convert() # загрузка основного изображения bala _rect= bala_surf.set_rect(bottomringht==(300,270)) screen.blit(bala_surf, jaulay_rect) pygame.display.update() wpygame.display.update() running=True while running: for event in pygame.event.get(): if even.type== pygame.QUIT: running=False pygame.quit()

Для вас предлагаю самостоятельно выполнить задание с предложенными рисунками.

9 слайд Для вас предлагаю самостоятельно выполнить задание с предложенными рисунками. Воспользуйтесь учебником или электронным учебником пройдя по ссылке https://www.opiq.kz/kit/43/chapter/3113

Рабочие листы
к вашим урокам

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

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

Luxury Car Rental in Miami | Reserve a Premium Vehicle with RealCar