некорректно себя ведет обработчик событий

Рейтинг: -3Ответов: 1Опубликовано: 10.07.2023

Некорректно отрабатывают события на нажатии кнопок a w s d прошу пояснить

from settings import *
import pygame as pg


class Unit:
    def __init__(self, surf, color, x, y, angle, angle_speed, size, speed):
        self.surf = surf
        self.color = color
        self.x = x
        self.y = y
        self.angle = angle
        self.size = size
        self.speed = speed
        self.angle_speed = angle_speed
        self.flags_move = [False, False, False, False]
        self.flags_key_move = [pg.K_a, pg.K_w, pg.K_d, pg.K_s]
        self.flags_commands_move = ['angle_left', 'move_forward', 'angle_right', 'move_back']

    def draw(self, event):
        self.move()
        self.key_event(event)
        self.draw_ship()
        self.draw_angle()

    def key_event(self, event):
        for e in event:
            self.key_flag_direction_controller(e, self.flags_move[0], self.flags_key_move[0])
            self.key_flag_direction_controller(e, self.flags_move[2], self.flags_key_move[2])
            self.key_flag_direction_controller(e, self.flags_move[1], self.flags_key_move[1])
            self.key_flag_direction_controller(e, self.flags_move[3], self.flags_key_move[3])

    def key_flag_direction_controller(self, e, direction, code):
        if e.type == pg.KEYDOWN and e.key == code:
            self.flags_move[direction] = True
        if e.type == pg.KEYUP and e.key == code:
            self.flags_move[direction] = False

    def move(self):
        for i in range(4):
            flag = self.flags_move[i]
            if flag:
                command = self.flags_commands_move[i]
                self.__getattribute__(command)()

    def move_forward(self):
        self.x = self.x + (math.sin(self.angle) * self.speed)
        self.y = self.y + (math.cos(self.angle) * self.speed)

    def move_back(self):
        self.x = self.x + (math.sin(self.angle) * self.speed)
        self.y = self.y + (math.cos(self.angle) * self.speed)

    def draw_ship(self):
        pg.draw.circle(self.surf, self.color, (self.x, self.y), self.size)

    def angle_left(self):
        self.angle += self.angle_speed

    def angle_right(self):
        self.angle -= self.angle_speed

    def draw_angle(self):
        x = self.x + (math.sin(self.angle) * self.size)
        y = self.y + (math.cos(self.angle) * self.size)
        start_pos = (self.x, self.y)
        end_pos = (x, y)
        pg.draw.line(self.surf, RED, start_pos, end_pos, 1)

и второй

from unit import Unit
from shipSettings import *


class App:
    def __init__(self):
        self.screen = pg.display.set_mode(RES)
        self.clock = pg.time.Clock()
        self.render_object_pool = []
        self.event = pg.event.get()

    def get_surface(self):
        return self.screen

    def add_render_object(self, render_object):
        self.render_object_pool.append(render_object)

    def run(self):
        while True:
            event = pg.event.get()
            for e in event:
                if e.type == pg.QUIT:
                    exit()
                if e.type == pg.KEYDOWN:
                    if e.key == pg.K_ESCAPE:
                        exit()

            self.screen.fill(NORMAL_WDG)

            [render_object.draw(event) for render_object in self.render_object_pool]

            pg.display.flip()
            self.clock.tick()


app = App()
ship = Unit(app.get_surface(), SH_COLOR, SH_X, SH_Y, SH_ANGLE, SH_ANGLE_SPEED, SH_SIZE, SH_SPEED)
app.add_render_object(ship)

if __name__ == '__main__':
    app.run()

Ответы

▲ 0

попробуй второй if заменить на elif, чтобы у тебя был перебор вариантов

   if e.type == pg.KEYDOWN and e.key == code:
                self.flags_move[direction] = True
            **elif** e.type == pg.KEYUP and e.key == code:
                self.flags_move[direction] = False