Как сделать перемещение объекта в python

от admin

Обработка ввода и анимации¶

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

Мы с вами уже знакомы с методом получения всех произошедших событий — pygame.event.get() , который возвращает события, произошедшие с последнего обращения.

Помимо событий выхода из приложения pygame.QUIT , есть множество других — например, нажатия клавиш pygame.KEYDOWN или отпускания pygame.KEYUP .

Рассмотрим взаимодействие с событиями на примере небольшой программы, в которой по нажатию клавиш показывается квадрат:

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

Как передвигать объекты в canvas tkinter мышкой

Я пробовал функцию move, но она не подходит, так как мне нужно передвигать объекты по заданным координатам.

Для перемещения фигур на canvas по координатам используйте метод coords.

Пример (по клику по canvas перемещаем круг):

insolor's user avatar

Положение объектов на Canvas (на холсте) задаётся в координатах. Эти координаты хранятся в самих объектах, созданных на холсте. Чтобы передвинуть объект, его нужно перерисовать в новом месте. Для этого нужно просто изменить его координаты. Для этого есть метод coords(). Нужно передать в него новые координаты объекта.

Одни объекты имеют простую координату x,y (такие как например Text). Но некоторые объекты могут иметь и более сложное обозначение в пространстве. Например, при создании овала нужно передать: (левая_граница_по_x, нижняя_граница_по_y, правая граница_по_x, верхняя граница_по_y).

При передвижении объекта нужно передавать тот же тип координат, что при создании, но уже для нового места, куда мы передвинули объект. Для этого нужно взять координаты положения указателя на холсте и на их основе указать новые координаты объекта в метод coords().

Чтобы это сделать мы используем метод tag_bind(). В него мы передадим:

имя_объекта который мы передвигаем;

событие (действие которое совершает пользователь и на которое реагирует наша программа);

и действие которое программа должна совершить на событие совершённое пользователем.

Делается это вот так: имя_экземпляра_класса_Canvas.tag_bind(имя_объекта, событие, действие).

Метод bind() реагирует на событие на всём холсте. Если использовать его, то привязать событие к конкретному объекту не получится. Регистрироваться событие будет на всей площади холста.

На месте «действия» лучше передавать функцию или метод. (Я приведу пример с функцией) Делать это лучше через lambda. Благодаря этому действие будет совершаться не сразу при запуске программы, а лишь тогда, когда пользователь совершит «событие» и метод coords() полноценно сработает, запустив «действие» через lambda.

Метод coords() передаёт в функцию «действия» координаты объекта в виде аргумента. Чтобы перехватить эти координаты, нужно в своей функции предусмотреть аргумент. Рекомендуется давать ему имя event

В event’е хранятся координаты указателя в момент события. Мы достаём их и на их основе генерируем координаты для нашего объекта, с учётом его размеров.

canvas move(), Movement of items

move() to move rectangle in Canvas

widget : Item to move on canvas
x : Jump or step value in right direction( — value for left side movement)
y : Jump of step value in down direction ( — value for Up side movement)

On click of the button we execute the function my_move(), inside this function we will use move() to shift the rectangle r1 in right-down direction.

Buttons to move element in different directions

We placed four buttons and each button will trigger respective function to move the rectangle in different directions.

Movement using arrow keys

Here we are adding four directional arrow keys to trigger the matching functions.
More about tkinter events →

Include this code before my_w.mainloop()

Moving Image

move() to move image in Canvas

In above code we used one rectangle as object to move. In place of rectangle we will use one image, here we are keeping the same nam r1 so the same code can be used.

Читать:
Почему пищит жесткий диск при запуске и не включается

Непрерывное движение объекта в Pygame вдоль осей X, Y и по диагонали

Движение объекта в Pygame

Непрерывное движение объекта в Pygame вдоль осей X, Y и по диагонали

Как показывает практика, движение — это жизнь! Поэтому сегодня мы вдохнем жизнь в сотворенный посредством Pygame объект и научим его двигаться без учета сигналов с клавиатуры! Для начала мы рассмотрим движение объекта в Pygame по прямой вдоль оси X, затем развернем объект и зададим ему движение вдоль оси Y, и в заключение — оформим диагональное перемещение объекта. Однако сначала предлагаю взглянуть на исходный код.

Исходные данные

Давайте взглянем на исходный код: у нас имеется экран csreen шириной 500px и высотой 300px, а также изображение мыши «mouse.png», расположенное на экране по заданным координатам: mouseX = 0, mouseY = 200:

При запуске кода мы увидим в левом нижнем углу экрана притаившуюся мышку с повернутой вправо мордочкой:

Что будем делать?

Необходимо научить мышку двигаться непрерывно:

  • по горизонтали вдоль оси Х
  • по вертикали вдоль оси Y
  • по диагонали из левого нижнего угла в правый верхний угол

Общий принцип непрерывного движения в Pygame на примере движения вдоль оси X

В настоящий момент для вывода изображения мышки на экран мы используем цикл while (while True: ..) . То есть пока открыто игровое поле, мы осуществляем вывод изображения на экран в цикле по заданным координатам через каждые 30 мс (что определено строкой pygame.time.delay(30)).

В одной секунде содержится 1000 миллисекунд

Так как под движением в Pygame подразумевается перемещение объекта на заданную позицию через определенный промежуток времени, то для смещения мыши на 5px каждые 30 мс, нужно в цикле while увеличивать значение координаты X на 5px. Для этого добавим в исходный код всего 2 строчки: строку с определением переменной скорости speed, в которой будем хранить заданное смещение 5px расположим перед циклом while; а строку, задающее смещение изображение: mouseX += speed расположим в теле цикла while. В итоге получим зеленую поляну с мышкой, бегущей по горизонтальной прямой:

Код непрерывного движения объекта в Pygame по горизонтали:

Непрерывное движение объекта в Pygame вдоль оси Y

Для наглядности, сдвинем начальную позицию мышки ближе к центру, переопределив переменные стартовой позиции, как mouseX=200 и mouseY=200.

В соответствии с описанным выше принципом, зададим объекту движение по горизонтали, только изменять будем координату mouseY. В связи с тем, что точка с нулевыми координатами в Pygame располагается в верхнем левом углу поля, то при движении объекта вверх, значение координаты Y будет уменьшаться на заданное в переменной speed значение: Y -= speed. Однако, прежде чем мы добавим эту строчку в цикл while, предлагаю развернуть нашу мышку мордочкой вправо(т.е. на 90 градусов) с помощью функции pygame.transform.rotate(mouse, 90):

Код непрерывного движения объекта в Pygame по вертикали
Полученный результат:

Непрерывное движение объекта по диагонали в Pygame

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

1. Сначала повернем мышь так, чтобы ее мордочка смотрела по направлению движения. Для этого используем функцию pygame.transform.rotate(mouse, 30).

2. Затем подкорректируем стартовую позицию объекта, чтобы повернутое изображение «выезжало» точно из левого нижнего угла: moveX=-13, moveY=218.

3. После этого, в цикле while зададим смещение по оси Х на величину speed: mouseX += speed. Кроме того, определим смещение по оси Y: так как размер игровой сцены 500×300, то при движении к правому верхнему углу поля, смещение мыши по оси Y должно быть меньше горизонтального смещения примерно в 300/500 или в 3/5 раз. Таким образом, определим смещение по Y, как: mouseY -= 3/5*speed.

Похожие статьи