Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 27, 2018 21:34:08

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

Нажатие 2х кнопок

Всем привет

Сорри если ошибся разделом и это в ГУИ надо. Пишу игру простейшую на 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()

Офлайн

#2 Янв. 29, 2018 12:16:18

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

Нажатие 2х кнопок

Никто ничего не может сказать по поводу вопроса?

Офлайн

#3 Янв. 29, 2018 16:20:02

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Нажатие 2х кнопок

Вообще ткинтер вещ в себе, и для создания игр не самый лучший вариант.
Но если в двух словах, то тебе нужно отслеживать не только кейпресс но и кейрелиз. Соответсвенно вносить\убирать в список или множество в зависимости от от того нажали или отпустили кнопку. И должен быт метод который проверяет по списку какие кнопки нажаты, и в зависимости от этого выполняет нужные действия. ну като так.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#4 Фев. 1, 2018 13:03:44

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

Нажатие 2х кнопок

Для создания игр есть pygame. Там есть коллизии, звук и анимация. В книге, “Изучаем Python. Программирование игр, визуализация данных, веб-приложения” Эрик Мэтиз, подробный разбор создания именно такой игры.

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

Можешь попробовать прикрутить это решение к своему коду, не уверен что это того стоит.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version