Найти - Пользователи
Полная версия: Нажатие 2х кнопок
Начало » Python для новичков » Нажатие 2х кнопок
1
Brain
Всем привет

Сорри если ошибся разделом и это в ГУИ надо. Пишу игру простейшую на 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()
Brain
Никто ничего не может сказать по поводу вопроса?
PEHDOM
Вообще ткинтер вещ в себе, и для создания игр не самый лучший вариант.
Но если в двух словах, то тебе нужно отслеживать не только кейпресс но и кейрелиз. Соответсвенно вносить\убирать в список или множество в зависимости от от того нажали или отпустили кнопку. И должен быт метод который проверяет по списку какие кнопки нажаты, и в зависимости от этого выполняет нужные действия. ну като так.
Vladimirv
Для создания игр есть pygame. Там есть коллизии, звук и анимация. В книге, “Изучаем Python. Программирование игр, визуализация данных, веб-приложения” Эрик Мэтиз, подробный разбор создания именно такой игры.

Решение этой задачи там через флаги:
при нажатии клавиши влево - флаг влево true, отпускаем false ,
в цикле while запускается метод update() объекта, который в зависимости от флага двигает объект на заданую дистанцию. Подробнее в книге, там разбор кода подробный, прямо построчный.

Можешь попробовать прикрутить это решение к своему коду, не уверен что это того стоит.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB