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

Как очистить экран в pygame

  • автор:

Как очистить экран от ВСЕХ объектов в PyGame + Pymunk?

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

Периодически — экран переполняется, да и производительность падает ввиду того, что объектов для обработки слишком много.

Ну так вот. Как очистить пространство от всех созданных объектов?

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

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

Комментировать
Решения вопроса 1
michadimin @michadimin Автор вопроса

Сам нашёл ответ.

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

Как очистить экран от старой записи? — Python PyGame — Ответ 15200756

Делаю паузу в игре, все работает, только вот когда я нажимаю на кнопку пауза у меня выскакивает текст, который должен выводить Игра начнется через: 3,2,1 ну понятно, да. Но вот этот текст не стирается через секунду а накладывается друг на друга, памогите разобраться (я думаю это всё из-за цикла, но это не точно )

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
def pausa(): while pausa_button == True: if pygame.mouse.get_pressed()[0]: count = myfont.render("Игра начнется через: 3", False, (0, 0, 0)) win.blit(count, (0,0)) pygame.display.flip() time.sleep(1) pygame.display.flip() count = myfont.render("Игра начнется через: 2", False, (0, 0, 0)) win.blit(count, (0,0)) pygame.display.flip() time.sleep(1) pygame.display.flip() count = myfont.render("Игра начнется через: 1", False, (0, 0, 0)) win.blit(count, (0,0)) pygame.display.flip() time.sleep(1) break for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit()
Меню пользователя @ redded123

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Готовые ответы и решения:

Как к новой учетной записи в Windows XP привязать профиль старой?
В "учетных записях пользователей" случайно удалил свою основную учетную запись. Остался стандартный.

Как программно изменять поля записи в старой доброй FoxPro для DOS?
Как программно изменять поля какой-либо записи? Т.е. происходить это должно без ведома.

* как очистить записи idmap, кэш
Разбираюсь с контролером домена, в смысле шлифую, изучаю параметры. Слепая установка прошла.

Как очистить экран
uses System.Windows.Forms, System.Drawing; uses FormsABC; type Fun = integer; MyForm =.

как очистить экран
как очистить экран Добавлено через 1 минуту помогите пожалуйста

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как програмно ‘очистить’, удалить все записи из MSFlexGrid?
Как програмно ‘очистить’, удалить все записи из MSFlexGrid. И еще вопрос. При добавлении записи в.

Как очистить MaskEdBox от предидущей записи с сохранением маски?
Как очистить MaskEdBox от предидущей записи в VB6 с сохранением маски? Для TextBox это выглядит.

Как очистить экран в программе?
Всем привет, у меня возникла такая проблема, мне нужно что б когда пользователь например вписал.

Как очистить экран от нарисованного
Добрый вечер. Помогите плиз решить задачку: Напишите приложение, которое изображает эллипсы, а по.

Как очистить экран (shell)
Как очистить все, что написано на экране?

Как очистить surface в pygame?

На моем surface рисуются квадраты через pygame.draw.rect(. ). Как я могу очистить весь surface с этими квадратами?

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Argument 1 must be pygame.Surface, not tuple
pygame.draw.circle(game_window, RED , pos, 20) выдает ошибку argument 1 must be.

TypeError: argument 1 must be pygame.Surface, not str
Нужно было сделать игру танчики. Почти сделал и хотел бы вывести счетчик жизней но выводит ошибку .

TypeError: argument 1 must be pygame.Surface, not instance
Здравствуйте, изучаю пистон. В этом примере карта отрисовывается. import pygame, sys from.

AttributeError: ‘pygame.Surface’ object has no attribute ‘bullet_width’
Всем привет, помогите пожалуйста решить ошибку. Вот полная ошибка: Traceback (most recent call.

При импорте pygame пишет что нет модуля pygame.base
Устанавливаю для kivy.Всё есть (sython,gsstreamer,kivy,pyscripter,python) , а вот фраем. pygame не.

1291 / 908 / 479
Регистрация: 05.12.2013
Сообщений: 3,073

Функции очистки у surface нет, можно залить цветом fill(), но это медленно или создать ract размером с surface, залить его цветом и отрисовать в surface или создать surface, залить цветом и сделать screen.blit() в основной surface

Регистрация: 17.05.2017
Сообщений: 97

ЦитатаСообщение от ТабуретY Посмотреть сообщение

Функции очистки у surface нет, можно залить цветом fill(), но это медленно или создать ract размером с surface, залить его цветом и отрисовать в surface или создать surface, залить цветом и сделать screen.blit() в основной surface

Я бы так и сделал, но у меня несколько сюрфейсов друг на друге.
1291 / 908 / 479
Регистрация: 05.12.2013
Сообщений: 3,073
Создать surface по размеру самого большого surface и всех накрыть
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Ошибка в pygame AttributeError: ‘pygame.Rect’ object has no attribute ‘blit’
Создаю игру, крестики нолики Почему возникает ошибка и как ее исправить? AttributeError.

Как работает surface.blit
К сожалению, в документации не описан аргумент area. Дайте ссылку на описание или подскажите, как.

Pygame ошибка module ‘pygame’ has no ‘init’ member
Всем здравствуйте. Недавно начал работать с VS code и выдает такая ошибка. Прикрепляю полностью.

pygame.error: cannot convert without pygame.display initialized
Только начал изучать спрайты Выдаёт ошибку: Traceback (most recent call last): File.

Как получить элемент surface из xml документа
Как получить surfase из xml документа. Далее хочу присвоить string str = "surface"; Выкладывать.

Chapter 5: Введение в графику

После этого, эта глава расскажет, как рисовать линии, прямоугольники, элипсы и дуги.

5.1 Компьютерная система координат

fig.apple3screen

В начале 80х, большинство компьютерных систем были основаными на тексте и не поддерживали графику как таковую. Рисунок 5.2(Собственность Wikimedia Commons) показывает раннюю программу бухгалтерского учёта, запущенную на Apple ][. Во время расположения текста на экране, программисты стали называть верхнюю строку 1. Экран содержал 24 строки, каждая длиной в 40 столбцов.

fig.simpleASCII

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

fig.spacewar

Набор символов был расширен, в него стали включать квадраты и другие примитивные рисовальные формы. Символы могли быть нарисованы разными цветами. Как показано на рисунке 5.4 графика стала более продвинутой. Поищите в интернете “ASCII art” и вы найдёте много разных примеров.

Текстовая система координат сохранилась даже тогда, когда компьютеры смогли контролировать вывод индивидуальных пикселей.

Координата $x$ работает так же, как и в прямоугольной системе координат. Но координата $y$ считается в обратном порядке. Вместо того, чтобы нулевой координате находиться в левом нижнем углу, она находится в левом верхнем. С увеличением значения $y$, позиция на экране смещается вниз подобно строкам текста.

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

5.2 Библиотека Pygame

fig.colorpicker

Бонус: некоторые сайты с выбором цветов задают значения цветов в шестнадцатиричном формате. Вы можете вводить шестнадцатиричные числа если вы начнёте их с 0x. Например:

white=[0xFF, 0xFF, 0xFF]

Со временем, программе потребуется использовать значение $\pi$ при рисовании дуг, поэтому сейчас хорошее время, чтобы создать переменную, содержащую значение $\pi$.

pi=3.141592653

5.4 Открыть окно

До этого момента, программы, которые мы создавали, выводили на экране лишь текст. Программы не открывали каких-либо окон, как это делают современны программы на Windows или Mac. Код для открытия окна — не сложный. Внизу приведён код, который создаст окно шириной в 700 и длиной в 500 пикселей:

# Задать ширину и высоту экрана size=[700,500] screen=pygame.display.set_mode(size)

Для чего set_mode ? Почему не open_window ? Причина в том, что эта команда может сделать намного больше, чем просто открыть окно. Она также может создавать игры, запускающиеся в полном экране. Это убирает меню с кнопкой “Пуск”, другие окна и даёт игре контроль над всем, что происходит на экране. Потому что этот режим использовать немного сложнее и большинство людей всё равно предпочитают играть в окне, мы пропустим детальную дискуссию о полноэкранных играх. Но если вы хотите узнать побольше о полноэкранных играх, прочитайте документацию по команде display у pygame.

Такде, почему size=[700,500] , а не size=700,500 ? В нормальных условиях Python не может сохранять два значения (высоту и ширину) в одну переменную. Единственная возможность это достигнуть — хранить номера в списке. Списки создаются с помощью помещения нескольких чисел в квадратные скобки. Это будет описано подробнее в более поздних главах, а пока просто имейте это ввиду при установке размеров окна.

Чтобы поставить заголовок окна, используйте следующую строку:

pygame.display.set_caption("Professor Craven's Cool Game")

5.5 Взаимодействие с пользователем

С кодом, который у нас есть на данный момент, программа сразу же зависнет после создания окна. Пользователь не сможет взаимодействовать с окном, не сможет даже закрыть его. Всё это должно быть запрограммировано. Код, добавляющий цикл ожидания, должен быть добавлен в программу, чтобы она ожидала, пока пользователь нажмёт “выйти.”

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

#Оставаться в цикле, пока пользователь не нажмёт на кнопку закрытия окна done=False # Используется для контроля частоты обновления экрана clock=pygame.time.Clock() # -------- Основной цикл программы ----------- while done==False: # ОБРАБОТКА ВСЕХ СОБЫТИЙ ДОЛЖНА БЫТЬ ПОД ЭТИМ КОММЕНТАРИЕМ for event in pygame.event.get(): # User did something if event.type == pygame.QUIT: # If user clicked close done=True # Flag that we are done so we exit this loop # ОБРАБОТКА ВСЕХ СОБЫТИЙ ДОЛЖНА НАХОДИТЬСЯ НАД ЭТИМ КОММЕНТАРИЕМ # ВСЯ ИГРОВАЯ ЛОГИКА ДОЛЖНА НАХОДИТЬСЯ ПОД ЭТИМ КОММЕНТАРИЕМ # ВСЯ ИГРОВАЯ ЛОГИКА ДОЛЖНА НАХОДИТЬСЯ НАД ЭТИМ КОММЕНТАРИЕМ # ВЕСЬ КОД ДЛЯ РИСОВАНИЯ ДОЛЖЕН НАХОДИТЬСЯ ПОД ЭТИМ КОММЕНТАРИЕМ # ВЕСЬ КОД ДЛЯ РИСОВАНИЯ ДОЛЖЕН НАХОДИТЬСЯ НАД ЭТИМ КОММЕНТАРИЕМ # Ограничить до 20 кадров в секунду clock.tick(20)

Со временем мы добавил код для обработки нажатий клавиш на клавиатуре или нажатий кнопки мыши. Этот код будет расположен между комментариями для обработки событий. Код, определяющий, как летят пули и сколько объектов будут двигаться, расположится между комментариями для игровой логики. Мы поговорим об этом в более поздних главах. Код для рисования пойдёт внутри соответствующих комментариев для рисования.

  • Пока не закончили(while not done):
    • Обработать каждое событие, такое, как закрытие окна, нажатие клавиш, нажатие кнопок мыши.
    • Запуск вычислений по передвижению объектов, обработке столкновений и т.д.
    • Очистка экрана и прорисовка всего

    Отказ от смешивания этих шагов делает программу проще для прочтения и понимания. Не проводите вычисления, рисование, вычисления, затем снова рисование. Также, найдите сходство с калькулятором, сделанным в первой главе: получение ввода, вычисление, вывод результата. Такой же принцип используется и здесь.

    Код для рисования рисунка на экране будет расположен внутри цикла while. C интервалом на часах(clock), поставленным на 10, содержание экрана будет перерисовываться 10 раз в секунду. Если будет поставлено слишком высокое значение, компьютер будет притормаживать, потому что все ресурсы уходят на перерисовку экрана. Если оно вовсе не находится в цикле, то экран не сможет корректно перерисовываться. Если рисунок снаружи цикла, экран может изначально показывать графику, но графика не будет показываться снова, если окно было свёрнуто, а новое окно было поставлено поверху.

    5.6 Завершение работы программы

    Сейчас, кликая по кнопке “закрыть” во время работы программы, в IDLE всё ещё будет показываться ошибка. Это проблематично, потому что на закрытие вылетевшей с ошибкой программы требуется куча щелчком мыши.

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

    pygame.quit ()

    5.7 Очистка экрана

    Следующий код чистит то, что могло было быть в окне с белым фоном. Помните, что перемення white была задана ранее, с помощью списка трёх значений RGB.

    # Очистить экран и установить фон screen.fill(white)

    fig.ellipse

    Следующий пример кода рисует прямоугольник. Первые два числа задают верхный левый угол (20, 20). Следующий два числа задают ширину в 250 пикселей, а затем высоту в 100 пикселей.

    Затем, двойка в конце означает ширину линии в 2 пикселя. Чем больше число, тем толще будет граница прямоугольника. Если это число равно 0, тогда у прямоугольника не будет границы. Вместо этого, он просто будет заполнен данным цветом.

    # Draw a rectangle pygame.draw.rect(screen,black,[20,20,250,100],2)

    5.13 Рисование эллипса

    Рисование эллипса похоже на рисование прямоугольника. Задаются те же самые граница прямоугольника, а компьютер уже сам рисует эллипс внутри этих границ.

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

    Смотря на картинку 5.7, можно заметить эллипс шириной в 250 и высотой в 100 пикселей. Верхний левый угол прямоугольника 250х100, находящийся в точке (20, 20). Замеьте, в самой этой точке ничего не рисуется. Когда оба нарисованы друг на друге, просто легче заметить каким образом задаётся рисование эллипса.

    # Нарисовать эллипс, используя прямоугольник для задания внешних границ pygame.draw.ellipse(screen,black,[20,20,250,100],2)

    5.14 Рисование дуги

    fig.arc

    Нижеприведённый код рисует четыре дуги, показывая разницу между квадрантами круга. Каждый квадрант нарисован своим цветом, чтобы было проще отличить сукции дуг. Результат можно наблюдать на рисунке 5.8.

    # Нарисовать дугу как часть эллипса. Использовать радианы # для нахождения нужного угла рисования. pygame.draw.arc(screen,green,[100,100,250,200], pi/2, pi, 2) pygame.draw.arc(screen,black,[100,100,250,200], 0, pi/2, 2) pygame.draw.arc(screen,red, [100,100,250,200],3*pi/2, 2*pi, 2) pygame.draw.arc(screen,blue, [100,100,250,200], pi, 3*pi/2, 2)

    5.15 Рисование многоугольника

    fig.triangle

    # Эта команда рисует треугольник используя функцию polygon pygame.draw.polygon(screen,black,[[100,100],[0,200],[200,200]],5)

    5.16 Текст

    fig.program_result

    """ Simple graphics demo Sample Python/Pygame Programs Simpson College Computer Science http://programarcadegames.com/ http://simpson.edu/computer-science/ """ # Import a library of functions called 'pygame' import pygame # Initialize the game engine pygame.init() # Define some colors BLACK = (0, 0, 0) WHITE = (255, 255, 255) BLUE = (0, 0, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) PI = 3.141592653 # Set the height and width of the screen size = (400, 500) screen = pygame.display.set_mode(size) pygame.display.set_caption("Professor Craven's Cool Game") # Loop until the user clicks the close button. done = False clock = pygame.time.Clock() # Loop as long as done == False while not done: for event in pygame.event.get(): # User did something if event.type == pygame.QUIT: # If user clicked close done = True # Flag that we are done so we exit this loop # All drawing code happens after the for loop and but # inside the main while not done loop. # Clear the screen and set the screen background screen.fill(WHITE) # Draw on the screen a line from (0,0) to (100,100) # 5 pixels wide. pygame.draw.line(screen, GREEN, [0, 0], [100, 100], 5) # Draw on the screen several lines from (0,10) to (100,110) # 5 pixels wide using a loop for y_offset in range(0, 100, 10): pygame.draw.line(screen, RED, [0, 10 + y_offset], [100, 110 + y_offset], 5) # Draw a rectangle pygame.draw.rect(screen, BLACK, [20, 20, 250, 100], 2) # Draw an ellipse, using a rectangle as the outside boundaries pygame.draw.ellipse(screen, BLACK, [20, 20, 250, 100], 2) # Draw an arc as part of an ellipse. # Use radians to determine what angle to draw. pygame.draw.arc(screen, BLACK, [20, 220, 250, 200], 0, PI / 2, 2) pygame.draw.arc(screen, GREEN, [20, 220, 250, 200], PI / 2, PI, 2) pygame.draw.arc(screen, BLUE, [20, 220, 250, 200], PI, 3 * PI / 2, 2) pygame.draw.arc(screen, RED, [20, 220, 250, 200], 3 * PI / 2, 2 * PI, 2) # This draws a triangle using the polygon command pygame.draw.polygon(screen, BLACK, [[100, 100], [0, 200], [200, 200]], 5) # Select the font to use, size, bold, italics font = pygame.font.SysFont('Calibri', 25, True, False) # Render the text. "True" means anti-aliased text. # Black is the color. This creates an image of the # letters, but does not put it on the screen text = font.render("My text", True, BLACK) # Put the image of the text on the screen at 250x250 screen.blit(text, [250, 250]) # Go ahead and update the screen with what we've drawn. # This MUST happen after all the other drawing commands. pygame.display.flip() # This limits the while loop to a max of 60 times per second. # Leave this out and we will use all CPU we can. clock.tick(60) # Be IDLE friendly pygame.quit()

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

    1. Прежде чем программа сможет использовать функции вроде pygame.display.set_mode() , какие две вещи должны произойти?
    2. Что делает функция pygame.display.set_mode() ?
    3. Для чего используется pygame.time.Clock ?
    4. Что делает цикл for event in pygame.event.get() ?
    5. Для этой строки кода:

    pygame.draw.line(screen,green,[0,0],[100,100],5)
    • Для чего нужен screen ?
    • Для чего нужны [0,0] и [100,100] ?
    • Что задаёт число 5 ?
    pygame.draw.ellipse(screen,black,[20,20,250,100],2)
    pygame.draw.polygon(screen,black,[[50,100],[0,200],[200,200],[100,50]],5)

    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 не будет опубликован. Обязательные поля помечены *