#python #tkinter #tkinter-canvas
#python #tkinter #tkinter-canvas
Вопрос:
Привет, ребята, я создаю игру на python tkinter, в которой вы управляете персонажем, способным стрелять в то место, куда вы нажимаете. Я хочу, чтобы маркер перемещался к точке, на которую нажал игрок, и за ее пределы всегда с одинаковой скоростью, используя методы move и after, и у меня нет знаний математики, чтобы подумать об уравнении, которое вычисляет расстояния x и y, необходимые для перемещения маркера к точке, на которую нажал игрок, и за ее пределы, пока он не достигнет конца холста. Есть идеи? спасибо за ваше время и ответ
У меня уже есть класс player и tkinter, а также метод, который создает маркер по щелчку и передает ему координаты щелчка. Теперь мне нужно рассчитать изменение x и y после одного обновления
def fly(self):
self.app.canvsas.move(self.bullet, x and y you calculated)
self.app.canvas.after(some refresh time, self.fly)
Ответ №1:
Вероятно, вы захотите присвоить пуле значения x_speed и y_speed при ее запуске, а затем обновлять каждый кадр, перемещая указанную величину. Допустим, вы нажимаете на (cx,cy)
с начальным местоположением маркера, равным (sx,sy)
. Отсюда вы захотите задать угол для поиска cos(angle)
и sin(angle)
. К счастью, мы можем получить это, даже не определяя угол! При прямом расстоянии от точки щелчка и начальной точки r = ((sx-cx)**2 (sy-cy)**2)**0.5
мы будем иметь:
cos_angle = (cx-sx)/r
sin_angle = (cy-sy)/r
Которое можно сохранить в вашем экземпляре bullet и умножить на скорость вашей пули, чтобы получить, как далеко вы хотите переместить указанную пулю в x
и y
направлении:
def updatebulletbycallingthiseveryframe(self):
self.x = self.bullet_speed*self.cos_angle
self.y = self.bullet_speed*self.sin_angle
Это позволит маркеру двигаться вечно, добавьте проверку, чтобы увидеть, выходит ли он за пределы, и удалите маркер, если это произойдет.
Комментарии:
1. Я попытался реализовать это, и маркеры имеют разную скорость, некоторые медленные, некоторые более быстрые, должен ли я установить ту же скорость для метода after, что и для метода move или differnet, и сбалансировать их?
2. В вашем классе bullet у меня была бы переменная с именем
self.bullet_speed
, которая может отличаться для каждого маркера, если вы хотите. Если все они имеют одинаковую скорость, этот метод должен работать нормально. Вы можете заставить свою программу распечатать значения дляcos_angle
иsin_angle
момента запуска пули, чтобы посмотреть, имеют ли они смысл.