def __init__(self, x, y): sprite.Sprite.__init__(self) load_souces() self.image = None self.xvel = MOVE_SPEED self.yvel = MOVE_SPEED self.rect = Rect(x, y, 30, 10) self.state = 'stop' # Направление для определения анимации покоя self.direction = LEFT # TODO: Бинарная матрица self.anim_left = Animation(LEFT_SPRITES) self.anim_right = Animation(RIGHT_SPRITES) self.anim_up = Animation(UP_SPRITES) self.anim_down = Animation(DOWN_SPRITES) self.anim_stop_left = Animation(LEFT_STOP_SPRITES) self.anim_stop_right = Animation(RIGHT_STOP_SPRITES) self.left = self.right = self.up = self.down = False
class Player(sprite.Sprite): def __init__(self, x, y): sprite.Sprite.__init__(self) load_souces() self.image = None self.inventory = [] self.xvel = MOVE_SPEED self.yvel = MOVE_SPEED self.rect = Rect(x, y, 30, 10) self.state = 'stop' self.fixme = 1 # Направление для определения анимации покоя self.direction = LEFT # TODO: Бинарная матрица self.anim_left = Animation(LEFT_SPRITES) self.anim_right = Animation(RIGHT_SPRITES) self.anim_up = Animation(UP_SPRITES) self.anim_down = Animation(DOWN_SPRITES) self.anim_stop_left = Animation(LEFT_STOP_SPRITES) self.anim_stop_right = Animation(RIGHT_STOP_SPRITES) self.left = self.right = self.up = self.down = False def event(self, e): if e.type == KEYDOWN and e.key == K_LEFT: self.left = True if e.type == KEYDOWN and e.key == K_RIGHT: self.right = True if e.type == KEYDOWN and e.key == K_UP: self.up = True if e.type == KEYDOWN and e.key == K_DOWN: self.down = True if e.type == KEYUP and e.key == K_RIGHT: self.right = False if e.type == KEYUP and e.key == K_LEFT: self.left = False if e.type == KEYUP and e.key == K_UP: self.up = False if e.type == KEYUP and e.key == K_DOWN: self.down = False def update(self, dt, objects, camera_change): """ Обновление состояния объекта. dt - сколько миллисекунд прошло с прошлого вызова данного метода """ if self.left: self.xvel = -MOVE_SPEED # Лево = x- n self.state = 'move' self.direction = LEFT if self.right: self.xvel = MOVE_SPEED # Право = x + n self.state = 'move' self.direction = RIGHT if self.up: self.yvel = -MOVE_SPEED self.state = 'move' if self.down: self.yvel = MOVE_SPEED self.state = 'move' if not(self.left or self.right or self.up or self.down): # стоим, когда нет указаний идти self.xvel = 0 self.yvel = 0 self.state = 'stop' # self.rect.y += self.yvel # self.rect.x += self.xvel # self.collision(0, self.yvel, objects) self.collision(self.xvel, self.yvel, objects) camera_change = (-self.xvel, -self.yvel) print(camera_change) # # Анимация for anim in [self.anim_right, self.anim_left, self.anim_up, self.anim_down, self.anim_stop_left, self.anim_stop_right]: anim.update(dt) if self.left: self.image = self.anim_left.get_sprite() if self.right: self.image = self.anim_right.get_sprite() if self.up: self.image = self.anim_up.get_sprite() if self.down: self.image = self.anim_down.get_sprite() if self.state == 'stop' and self.direction == LEFT: self.image = self.anim_stop_left.get_sprite() if self.state == 'stop' and self.direction == RIGHT: self.image = self.anim_stop_right.get_sprite() return camera_change def render(self, screen): x = self.rect.x - self.image.get_rect().width / 7 y = self.rect.y - self.image.get_rect().height + self.rect.height screen.blit(self.image, (x, y)) def collision(self, xvel, yvel, objects): for o in objects: if self.rect.colliderect(o["object"].rect): # если есть пересечение платформы с игроком print(1) if xvel < 0: # если движется вправо self.rect.left = o["object"].rect.right # то не движется вправо # o["object"].rect.left = self.rect.right self.xvel = 0 if xvel > 0: # если движется влево self.rect.right = o["object"].rect.left # то не движется влево # o["object"].rect.right = self.rect.left self.xvel = 0 if yvel > 0: self.rect.bottom = o["object"].rect.top # o["object"].rect.top = self.rect.bottom self.yvel = 0 if yvel < 0: self.rect.top = o["object"].rect.bottom # o["object"].rect.bottom = self.rect.top self.yvel = 0 def area_collision(self, objects): for o in objects: if self.rect.colliderect(o["object"].area): print(o) return True, o return False, None