Форум сайта python.su
Всем привет
Сорри если ошибся разделом и это в ГУИ надо. Пишу игру простейшую на tkinter, вопрос в следующем, как обработать события нажатия одновременно двух клавиш. Например жму влево или вправо, объект двигается в сторону, одновременно нажимаю клавишу вверх, при этом объект делает действие на клавишу вверх и перестает двигаться вправо, хотя клавиша не отпущена, нужно ее отпустить и снова нажать чтобы он поехал вправо.
Вот код:
from tkinter import * import random import time class Pushka: def __init__(self): self.id = window.create_rectangle(0, 0, 100, 20, fill = 'blue') #создаем пушку window.move(self.id, 350, 570) #двигаем пушку на координаты self.move = 0 self.beginTimeBullet = 0 self.hasBullet = 0 window.bind_all('<KeyPress-Left>', self.sidePushka) window.bind_all('<KeyPress-Right>', self.sidePushka) window.bind_all('<KeyPress-Up>', self.shoot) def sidePushka(self, event): pos = window.coords(self.id) if event.keysym == 'Left' and pos[0] >=5: self.move = -3 elif event.keysym == 'Right' and pos[2] <= window.winfo_width()-5: self.move = 3 def movePushka(self): window.move(self.id, self.move, 0) self.move = 0 def shoot(self, event): pos = window.coords(self.id) self.hasBullet = 1 center = pos[2]-(pos[2]-pos[0])/2 self.bullet = window.create_rectangle(center, window.winfo_height()-40, center, 0, outline='red') # создаем выстрел self.beginTimeBullet = time.time() def deleteBullet(self): if self.hasBullet: if self.beginTimeBullet != 0: if (time.time() - self.beginTimeBullet) > 0.03: window.delete(self.bullet) tk = Tk() tk.title('Игра') window = Canvas(tk, width = 800, height = 600) window.pack() pushka = Pushka() while True: pushka.movePushka() pushka.deleteBullet() tk.update_idletasks() tk.update() #time.sleep(0.01) #tk.mainloop()
Офлайн
Никто ничего не может сказать по поводу вопроса?
Офлайн
Вообще ткинтер вещ в себе, и для создания игр не самый лучший вариант.
Но если в двух словах, то тебе нужно отслеживать не только кейпресс но и кейрелиз. Соответсвенно вносить\убирать в список или множество в зависимости от от того нажали или отпустили кнопку. И должен быт метод который проверяет по списку какие кнопки нажаты, и в зависимости от этого выполняет нужные действия. ну като так.
[code python][/code]
Офлайн
Для создания игр есть pygame. Там есть коллизии, звук и анимация. В книге, “Изучаем Python. Программирование игр, визуализация данных, веб-приложения” Эрик Мэтиз, подробный разбор создания именно такой игры.
Решение этой задачи там через флаги:
при нажатии клавиши влево - флаг влево true, отпускаем false ,
в цикле while запускается метод update() объекта, который в зависимости от флага двигает объект на заданую дистанцию. Подробнее в книге, там разбор кода подробный, прямо построчный.
Можешь попробовать прикрутить это решение к своему коду, не уверен что это того стоит.
Офлайн