как заставить объекты двигаться плавно - PullRequest
0 голосов
/ 20 мая 2018

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

from tkinter import *
from tkinter.constants import LEFT
root = Tk()
c = Canvas(root, width=400, height=400)
tank = c.create_rectangle(200,200,250, 250, outline = 'dark green', 
fill='dark green')
c.pack()

class Tank:
    def move_left(self):
        c.move(tank, -5, 0)
    def move_right(self):
        c.move(tank, 5,0)
    def move_up(self):
        c.move(tank, 0, -5) 
    def move_down(self):
        c.move(tank, 0, 5)           

c.bind('<Left>', Tank.move_left)
c.bind('<Right>', Tank.move_right)
c.bind('<Up>', Tank.move_up)
c.bind('<Down>', Tank.move_down)
c.focus_set()            
root.mainloop()     

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вы можете использовать несколько логических значений (вверх, вправо, влево, вниз), представляющих направление движения танка.Когда клавиша нажата, установите для логического значения значение true, а после отпускания установите логическое значение false.Создайте игровой цикл, используя отдельный цикл thread / while с import threading, и в игровом цикле проверьте, является ли одно из логических значений истинным.Например, если логическое представление right равно true, тогда программа добавит к x-координате резервуара.

0 голосов
/ 20 мая 2018

Первая часть вашей проблемы - захватить KeyPress и KeyRelease события вместо ключевых событий.

Но тогда все становится сложнее.Вы хотите, чтобы танк двигался каждые, скажем, 120 мс, не так быстро, как это возможно, верно?Таким образом, единственное, что вы можете сделать, это настроить обратный вызов after, чтобы вы могли запускать некоторый код каждые 120 мс, а ключевые события просто устанавливали некоторый флаг, который говорит вам, как перемещать танк (или не перемещать его) на основена то, что было нажато.

Это выполнимо, но следующая проблема еще больше: Tkinter фиксирует ключевые события на высоком уровне - после любого переназначения вашей ОС (так что вы получаете E вместо shiftи e), что включает в себя автоповтор.Чтобы обойти это, вы должны написать некоторый код для «разбора» вручную.

Это все еще выполнимо, но это не легко.И это не идеально - быстрое нажатие клавиш может обмануть любой алгоритм разбора, который вы придумали, а быстрое нажатие клавиш - это то, что вы часто хотите разрешить в игре.

Лучшее решение, вероятно, начинать ссовершенно другая библиотека, например PyGame Zero вместо Tkinter.Библиотека, предназначенная для игр, будет иметь рамочный цикл, поэтому вам не нужно будет использовать after и проверять несколько флагов, она будет записывать «сырые» события клавиатуры, чтобы вы могли немедленно реагировать на них и т. Д.Кроме того, и вы хотите, например, использовать спрайты для своих танков, вам не придется изобретать эти колеса, как это было бы с Tkinter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...