некорректно себя ведет обработчик событий
Некорректно отрабатывают события на нажатии кнопок 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()
Источник: Stack Overflow на русском