Как использовать if / elif внутри класса, когда вам нужны другие параметры?

#python #pygame

#python #pygame

Вопрос:

Я создаю класс, который помещает в него все команды, связанные с клавиатурой pygame, по крайней мере, все, что мне нужно, но когда я использую значение if или else, равное «переменной», которую я хочу определить позже, он возвращает ошибку, сообщающую мне, что она не определена.

Я не знаю достаточно, чтобы сказать в технических терминах, извините за ошибки. Я начал использовать button в качестве key() аргумента, и я получил ту же ошибку, затем я попытался использовать __init__() , но я пока не могу это использовать (не уверен, как), тогда я сделал таким образом…

 class control():
    def button(self, button):
        self.button = button
    def exit(self):
        if event.type == pygame.QUIT:
            pygame.quit()
    def key(self, axis, speed):
        if event.type == pygame.KEYDOWN:
            if event.key == self.button:
                axis = 0
                axis = speed


ctrl = control()
w = control().button(K_w)
s = control(K_s)
UP = control(K_UP)
DOWN = control(K_DOWN)


while True:
    for event in pygame.event.get():
        ctrl.exit()  
        w.key(y1, -5)
        s.key(y1,  5)
        UP.key(y2, -5)
        DOWN.key(y2,  5)
  
  File "C:/Users/Smith/PycharmProjects/untitled/venv/test0002.py", line 25, in <module>
    w = control().button(K_w)
NameError: name 'K_w' is not defined
  

Я хочу использовать функцию key для определения кнопки, чтобы я мог использовать ее позже для каждого ввода с клавиатуры, вместо того, чтобы каждый раз писать все это заново.

Ответ №1:

Сообщение об ошибке

имя ‘K_w’ не определено

происходит, потому что вы забыли пространство имен модуля.

Имя константы pygame.K_w вместо K_w . Константы помещаются в пространство имен модуля pygame.

Либо используйте полное имя константы:

 w = control().button(pygame.K_w)
  

или импортируйте константы pygame, см. pygame.locals

 from pygame.locals import *

# [...]

w = control().button(K_w)
  

Кроме того, переменные w никогда не определяются, потому что control() генерирует объект, но button() не возвращает никакого значения. Кнопка метода должна возвращать self :

 class control():
    def button(self, button):
        self.button = button
        return self
  

Но я рекомендую реализовать конструктор в классе, control а не метод button (конечно, вы можете сделать и то, и другое):

 class control():
    def __init__(self, button=0):
        self.button = button

ctrl = control()
w = control(K_w)
s = control(K_s)
UP = control(K_UP)
DOWN = control(K_DOWN)
  

Метод key должен возвращать новое значение параметра axis :

 class control():

    # [...]

    def key(self, axis, speed):
        if event.type == pygame.KEYDOWN:
            if event.key == self.button:
                axis = speed
        return axis

y1, y2 = 0, 0
while True:
    for event in pygame.event.get():
        ctrl.exit()  
        y1 = w.key(y1, -5)
        y1 = s.key(y1,  5)
        y2 = UP.key(y2, -5)
        Y2 = DOWN.key(y2,  5)