М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
Danyaizbanu
Danyaizbanu
25.03.2023 01:38 •  Информатика

Какая команда нужна для загрузки фонового изображения в pygame?

👇
Ответ:
Koshaplay57
Koshaplay57
25.03.2023

Модули pygame.image и pygame.transform. Урок 9

Загрузка и сохранение изображений в Pygame

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

import pygame

pygame.init()

 

sc = pygame.display.set_mode((400, 300))

sc.fill((100, 150, 200))

 

dog_surf = pygame.image.load('dog.bmp')

dog_rect = dog_surf.get_rect(bottomright=(400, 300))

sc.blit(dog_surf, dog_rect)

 

pygame.display.update()

 

while 1:

   for i in pygame.event.get():

       if i.type == pygame.QUIT:

           exit()

 

   pygame.time.delay(20)

dog1.png

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

...

 

dog_surf = pygame.image.load('dog.bmp')

dog_surf.set_colorkey((255, 255, 255))

 

...

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

dog2.png

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

...

sun_surf = pygame.image.load('sun.png')

sun_rect = sun_surf.get_rect()

sc.blit(sun_surf, sun_rect)

 

...

dog_sun.png

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

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

...

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

dog_surf.set_colorkey((255, 255, 255))

...

sun_surf = pygame.image.load('sun.png').convert_alpha()

...

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

...

dog_surf = pygame.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:

           exit()

       elif i.type == pygame.KEYUP and i.key == pygame.K_s:

           pygame.image.save(sc, 'day.png')

 

...

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

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

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

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

import pygame

pygame.init()

 

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:

           exit()

       elif i.type == pygame.KEYUP and i.key == pygame.K_f:

           # собака перевернется слева направо

           flip = pygame.transform.flip(dog_surf, 1, 0)

           sc.fill((100, 150, 200))

           sc.blit(flip, dog_rect)

           pygame.display.update(dog_rect)

 

   pygame.time.delay(20)

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

...

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()

 

...

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

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

car.png

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

4,4(17 оценок)
Открыть все ответы
Ответ:
MMMOZG
MMMOZG
25.03.2023

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

#include <stdio.h>

#include <stdlib.h>     // предоставляет rand() и srand()

#include <time.h>       // предоставляет time()

 

// число строк в массиве:

#define M 5

// длина каждой строки:

#define N 7

 

int main ()

{

   srand(time(NULL));      // новая точка отсчета рнд

   int B[M][N];            // массив

   int cnt;                // число отрицательных

   int i, j;

 

   // заполняем массив случайными:

   for (i=0; i<M; i++)

       for (j=0; j<N; j++)

           B[i][j] = rand() %21 - 10;

 

   // считаем отрицательные:

   for (i=0; i<N; i++)

   {

       cnt = 0;        // перед каждым новым столбцом сбрасываем счетчик отрицательных

       for (j=0; j<M; j++)

           if (B[i][j] < 0) cnt++;

       printf("column #%i, count is: %d\n", i, cnt);

   }

 

   return 0;   // конец программы

4,4(60 оценок)
Ответ:
Доо43
Доо43
25.03.2023

SCREEN 7
cls
LINE (60, 20)-(0, 80)
LINE (60, 20)-(120, 80)
LINE (0, 80)-(120, 80)
LINE (80, 40)-(80, 20)
LINE (80, 20)-(100, 20)
LINE (100, 20)-(100, 60)
LINE (20, 80)-(20, 160)
LINE (20, 160)-(100, 160)
LINE (100, 160)-(100, 80)
LINE (30, 160)-(30, 110)
LINE (30, 110)-(60, 110)
LINE (60, 110)-(60, 160)
LINE (70, 90)-(90, 90)
LINE (90, 90)-(90, 110)
LINE (90, 110)-(70, 110)
LINE (70, 110)-(70, 90)
LINE (80, 90)-(80, 110)
LINE (70, 100)-(90, 100)
CIRCLE (200, 20), 20
LINE (150, 20)-(170, 20)
LINE (230, 20)-(250, 20)
LINE (180, 40)-(160, 60)
LINE (220, 40)-(240, 60)
LINE (200, 50)-(200, 70)

4,6(74 оценок)
Это интересно:
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ