Как удалить нарисованные прямоугольники в pygame?
Я хочу случайным образом рисовать прямоугольники на экране, однако, если количество прямоугольников, которые уже были нарисованы, превышает, допустим, 3, я хочу начать удаление «старых», то есть тех, которые рисуются на экране для самое время.
Я пытался каждый раз сохранять прямоугольник в переменной и добавлять его в список, думая, что позже я смогу удалить его. Что ж, не сработало. Поэтому я хотел бы знать, есть ли какое-нибудь решение моей проблемы.
3 ответа
Удалите генерацию новых квадратов из метода draw :
Вы должны перерисовывать всю сцену в каждом кадре цикла приложения. Очистите отображение перед рисованием квадратов, затем нарисуйте все квадраты в списке и, наконец, обновите отображение:
Если вы хотите, чтобы приложение продолжало отвечать, вы не можете отложить цикл приложения на time.sleep . Используйте pygame.time.get_ticks() , чтобы получить текущий количество миллисекунд с момента pygame.init() и создание нового квадрата по истечении случайного времени:
Сохраните очередь всех нарисованных в данный момент прямоугольников, и всякий раз, когда список превышает длину, скажем, 3, просто нарисуйте белый прямоугольник (или любого другого цвета вашего фона), используя сохраненные координаты.
Просто уберите прямоугольник с экрана.
Например, если размер вашего дисплея 800×600 пикселей, измените координаты прямоугольника X, Y на 1000,1000. Его больше не будет видно на экране
how to remove draw objects from pygame window?
I am creating a game using pygame and python. I have drawn a rectangle in the window which acts as a button. But i need to know how to remove the button once it is clicked. Heres my code:
So yea i hope you can help me with this.
5 Answers 5
You would need to draw everything to the screen again except for the parts you don’t want in any more.
If you don’t have an array of surfaces to blit:
![]()
i think you should just create a blank screen for every frame and draw everything over again.
if you have different classes in your code try adding that part in too:
I just found out but you can also just set the width and height of your rectangle to 0, and draw it again. In my opinion, is that way easier.
![]()
u can make an array with all the objects and iterate the array to draw the objects and just delete the object from the array when u want to delete it
Как удалить нарисованный объект в pygame
Reddit and its partners use cookies and similar technologies to provide you with a better experience.
By accepting all cookies, you agree to our use of cookies to deliver and maintain our services and site, improve the quality of Reddit, personalize Reddit content and advertising, and measure the effectiveness of advertising.
By rejecting non-essential cookies, Reddit may still use certain cookies to ensure the proper functionality of our platform.
For more information, please see our Cookie Notice and our Privacy Policy .
Как удалить объект в pygame
How do I delete displayed objects in python with pygame?
I’m trying to make asteroids drop from the top straight to the bottom of the screen and then disappear. To do this I have made multiple objects of class Asteroid, however I can’t delete them afterwards.
Is there any way to delete them?
2 Answers 2
You need to implement a delete method in the Asteroid class, and call i.delete() in your if condition.
How to delete depends on how they are shown in the first place.
In pygame your objects should usually be subclasses of pygame.sprite.Sprite and should be stored in sprite groups which allow you to update and render all contained sprites by calling the update and draw methods. You can remove the sprites from the corresponding groups by calling their kill method.
In this example I add Projectile sprites to the all_sprites group each frame and kill them if they are outside of the game_area rect. pygame.Rect s have a contains method that you can use to check if one rect is inside of another rect. Alternatively, you can just check if the rect’s x or y attributes are less than 0 or greater than the screen’s width and height.
![]()
-
The Overflow Blog
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.6.15.43497
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Pygame удалить объект
Мне нужна помощь в удалении объекта, я имею в виду удаление, а не рисование или другие вещи. Мой код на данный момент:
Вот что делает меня моим игроком и врагом:
Так что да, вот как я делаю свои пули, игрока и врагов. Не обращайте внимания на остальное, это необходимо, потому что в моем сообщении много кода.
Ответы (4)
Короче говоря, ваш враг должен быть экземпляром некоторого Sprite подкласса, и вы должны добавить его к экземпляру Group (а не создавать свой собственный enemy_list ). Если вы хотите, чтобы враг умер, вы можете вызвать для него метод kill() , который удалит его из Group . Это служит для его удаления из игры, поскольку вы должны использовать методы объекта Group для обновления и рисования всех содержащихся в нем спрайтов (но не убитых).
Было бы полезно изучить спрайты и SpriteGroups, чтобы отслеживать объекты в вашей игре. . В них встроен набор функций, которые упростят задачу.
Вот демонстрация, которая группирует спрайты, удаляя те, которые сталкиваются с указателем мыши:
Нажатие кнопки мыши создает больше спрайтов, а нажатие клавиши пробела изменяет их положение.
Метод update() спрайта пули будет регулировать положение спрайта по его скорости, например self.rect.x += SPEED , и вам нужно будет вызывать метод .update() группы спрайтов пули в каждом игровом цикле.
Итак, у вас есть список вражеских позиций в enemy_list . Хорошее начало. Я не вижу bullet_list , поэтому предполагаю, что за раз будет только одна пуля, расположенная в _3 _, _ 4_.
Итак, основной цикл этой программы может выглядеть примерно так:
Столкновение с противником и удаление списка может выглядеть примерно так, как показано ниже. (Я старался максимально соответствовать внешнему виду вашего кода.)
Мы делаем итерацию по списку врагов, проверяя наличие коллизии. Как только попадание обнаружено, он сохраняет индекс пораженного врага и останавливает цикл.
Следующим шагом будет удаление врага из списка. Я написал это в отдельном блоке, а не помещал его перед break в цикле. Это связано с тем, что при изменении списка при его повторении могут произойти непредвиденные результаты. В данном случае все было бы нормально, но новичку следует опасаться этого.
Я предполагаю, что на экране отображается только один маркер, поскольку вы не упомянули список маркеров. Вы, вероятно, создаете пулю, попав в пробел, или что-то в этом роде, что я оставлю здесь. Одна вещь, которую следует учитывать в вашей bullets() функции, — это то, что вы выполняете перемещение, рисование и проверку на столкновение в одной и той же функции. Обратите внимание: всегда полезно сделать так, чтобы функция выполняла только одно действие.
Итак, чтобы создать пулю, у вас должна быть логическая переменная create_bullet . Так:
вы говорите, что хотите удалить его, а не просто рисовать поверх него. Однако способ, которым pygame создает «движущийся / видео-подобный» экран , заключается в непрерывном рисовании. Например: игрок обращается в точке (10, 10), а затем в точке (20, 10), поэтому это выглядит так, как будто игрок переместился. Однако это делается очень быстро, поэтому вы не увидите, как он «исчезает» и «появляется снова». Итак, вот что делает приведенный выше код.
Когда нажимается пробел, он «создает» пулю, устанавливая ее значения x и y на текущую позицию игрока, и устанавливает create_bullet = true. Затем на каждой итерации основного цикла, если create_bullet истинно, он перемещается, а затем рисует пулю. Если пуля выходит за пределы экрана или сталкивается с противником, create_bullet = False, поэтому она перестанет ее рисовать, и на следующей итерации основного цикла пуля будет нарисована фоном и «исчезнет».
Pygame удалить объект
Мне нужна помощь в удалении объекта, и я имею в виду удаление, а не рисование или другие вещи. Мой код до сих пор:
Вот что делает мой игрок и враг:
Так что да, именно так я делаю свои пули, игрока и врагов. Пожалуйста, игнорируйте остальное, это необходимо, потому что в моем сообщении много кода.
Привет привет привет
4 ответа
Лучший способ решить вашу проблему — научиться использовать объекты Sprite в пигейм. Вместе с объектами Group они уже могут делать то, что вы хотите, прямо из коробки.
Короче говоря, ваш «враг» должен быть экземпляром некоторого подкласса Sprite , и вы должны добавить его к экземпляру Group (вместо того, чтобы создавать свой собственный enemy_list ). Когда вы хотите, чтобы враг умер, вы можете вызвать для него метод kill() , который удалит его из Group . Это служит для удаления его из игры, поскольку вы должны использовать методы объекта Group для обновления и отрисовки всех содержащихся в нем спрайтов (но не тех, которые были уничтожены).
Было бы полезно изучить спрайты и группы спрайтов для отслеживания сущностей в вашей игре. . В них встроено множество функций, которые упрощают работу.
Вот демонстрация, которая группирует спрайты, удаляя те, которые сталкиваются с указателем мыши:
Нажатие кнопки мыши создает больше спрайтов, а нажатие клавиши пробела рандомизирует их положение.
Метод update() спрайта пули регулирует положение спрайта по его скорости, например. self.rect.x += SPEED , и вам нужно будет вызывать метод .update() группы спрайтов пули в каждом игровом цикле.
Итак, у вас есть список вражеских позиций в enemy_list . Это хорошее начало. Я не вижу bullet_list , поэтому буду предполагать только одну пулю за раз, расположенную в точках b_x , b_y .
Таким образом, основной цикл этой программы может выглядеть примерно так:
Где столкновение с противником и удаление списка может выглядеть примерно так, как показано ниже. (Я пытался максимально соответствовать внешнему виду вашего кода.)
Мы делаем итерацию по списку врагов, проверяя наличие коллизий. Как только попадание найдено, он сохраняет индекс того, какой враг был поражен, и останавливает цикл.
Следующим шагом будет удаление врага из списка. Я написал это в отдельном блоке, а не перед break в цикле. Это связано с тем, что при изменении списка во время его повторения могут возникнуть неожиданные результаты. В этом конкретном случае это было бы нормально, но новичку следует опасаться этого.
Я предполагаю, что на экране одновременно отображается только один маркер, поскольку вы не упомянули список маркеров. Вы, вероятно, создаете пулю, ударяя по пробелу или чему-то еще, что я здесь не упомяну. Одна вещь, которую следует учитывать в вашей функции bullets() , это то, что вы выполняете перемещение, рисование и проверку на столкновение в одной и той же функции. Обратите внимание: всегда полезно сделать так, чтобы функция выполняла только одну функцию.
Итак, чтобы создать пулю, у вас должна быть логическая переменная create_bullet . Так:
Вы говорите, что хотите удалить его, а не просто рисовать поверх него. Однако способ, которым pygame генерирует «движущийся/подобный видео» экран, заключается в непрерывном рисовании. Например: игрок рисуется в (10, 10), а затем рисуется в (20, 10), поэтому кажется, что игрок переместился. Однако это делается очень быстро, поэтому вы не видите, как он «исчезает» и «появляется снова». Итак, вот что делает приведенный выше код.
Когда нажат пробел, он «создает» пулю, устанавливая ее значения x и y в текущую позицию игрока и задавая create_bullet = true. Затем на каждой итерации основного цикла, если create_bullet имеет значение true, он перемещает, а затем рисует маркер. Если пуля выйдет за пределы экрана или столкнется с противником, create_bullet = False, тогда она перестанет ее рисовать и на следующей итерации основного цикла пуля будет отрисована фоном и «исчезнет».
Python-сообщество
Всем доброго времени суток! В Pygame через def сделана отрисовка спрайтов при событии:
Отредактировано Rad.89 (Июнь 14, 2022 07:28:50)
#2 Июнь 14, 2022 09:46:59
удаление спрайта Pygame
Ну наверное покажите больше кода — не гадат же нам как и откудова вы получаете ошибку
Влодение рускай арфаграфией — это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости
#3 Июнь 14, 2022 12:35:02
удаление спрайта Pygame
сократил, как оно идет по программе по порядку и все связанное с данным img:
Отредактировано Rad.89 (Июнь 14, 2022 12:36:19)
#4 Июнь 14, 2022 13:18:42
удаление спрайта Pygame
это оригинальный приём!
#5 Июнь 14, 2022 13:32:28
удаление спрайта Pygame
Приношу извинения, если код нафарширован визуальными ошибками. Пока только изучаю принцип работы. Если файлы нужны: могу скинуть.
#6 Июнь 14, 2022 13:36:40
удаление спрайта Pygame
и вот тут, когда нужно вызвать print (‘—–’) по щелчку мыши, вылезает ошибка:
#7 Июнь 14, 2022 13:54:42
удаление спрайта Pygame
Rad.89
совершенно справедливо пишет
я тоже не нашел в какой строке кода определена переменная player_poo, её просто нет в вашем коде