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

Как удалить нарисованный объект в pygame

  • автор:

Как удалить нарисованные прямоугольники в 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:

tijko's user avatar

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.

ouflak's user avatar

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 удалить объект

Мне нужна помощь в удалении объекта, я имею в виду удаление, а не рисование или другие вещи. Мой код на данный момент:

Вот что делает меня моим игроком и врагом:

Так что да, вот как я делаю свои пули, игрока и врагов. Не обращайте внимания на остальное, это необходимо, потому что в моем сообщении много кода.

Ответы (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, поэтому она перестанет ее рисовать, и на следующей итерации основного цикла пуля будет нарисована фоном и «исчезнет».

python — как отменить "window.blit" в pygame или удалить объект (спрайт), который я сделал

Я пытаюсь удалить спрайт всякий раз, когда я нажимаю на него, однако, я не могу получить oringinal элемент с экрана. кажется, как только я визуализую, или «рисую» его там, он остается там permentaelly. Как я могу изменить следующий код, чтобы избавиться от «blit», созданного в классе после его нажатия?

В коде есть немало проблем.

Blitting не следует делать до основного цикла.

Было бы лучше, если бы «Скрытый объект» изменил свою позицию. Измените его, добавив позицию в конструктор и используйте его в методе draw.

Метод рисования никогда не заканчивается. Вам нужно заменить операторы while инструкциями if. Также вы не рисуете второе изображение, когда spritestay — False. Наверное, вы хотели разжечь Clear.png.

Если Clear.png является просто пустым изображением, нет никакого смысла бить его вообще. Так это становится:

Вы ничего не возвращаете из функции рисования, поэтому после

d — Нет. Вы не используете d в любом месте, чтобы удалить это.

Вы создаете объект HiddenObject для каждого кадра. Я думаю, что лучше переместить его перед циклом.

Последний вопрос заключается в том, что вы не заполняете экран каким-либо цветом. Это может быть реальная проблема, с которой вы боролись. Вот как работает бьющий.

Вы художник, а перед вами холст. Если вы возьмете кисть и нарисуете что-нибудь, как вы можете избавиться от нее? Ну, единственный способ — нарисовать что-то поверх него. В pygame мы используем метод заполнения, чтобы заполнить всю поверхность определенным цветом.

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

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