Корректирующая настройка Rect заставляет игрока взлететь в воздух - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть еще одна проблема, и на этот раз это нужно делать, когда игрок прыгает или приседает. Когда они выполняют описанные выше действия, они взлетают невероятно высоко в воздух, но странным является то, что переменная rect.y, похоже, не меняет слишком сильно. Я хотел бы любую помощь, которую вы можете предложить мне. Для изображения это может быть что угодно в этом примере, если наклон составляет 16 пикселей меньше, а переход меньше на 4 кадра.

import pygame

class Player(pygame.sprite.Sprite):

    idle = True
    inAir = False
    crouching = False

    firstTime = True

    def update(self):

        self.calc_grav()

        tempCoord = self.rect
        self.rect = self.image.get_rect()
        self.rect.x = tempCoord.x
        print(str(self.crouching) + " with y co-ordinate of: " + str(self.rect.y))
        if self.crouching and self.firstTime:
            self.rect.y = tempCoord.y + 16
            self.firstTime = False
        elif not self.crouching and not self.inAir:
            self.rect.y = tempCoord.y
            self.firstTime = True
        elif self.inAir and self.firstTime:
            self.rect.y = tempCoord.y + 4
            self.firstTime = False

        self.rect.y += self.change_y

    def calc_grav(self):

        if self.change_y == 0:
            self.change_y = 1
        else:
            self.change_y += 0.25

        # See if we are on the ground.
        if self.rect.y >= constants.SCREEN_HEIGHT and self.change_y >= 0:
            self.change_y = 0
            self.rect.y = constants.SCREEN_HEIGHT

    def jump(self):

            self.change_y = -8.5

    def crouch(self):

        self.crouching = True

class Game(object):

    def __init__(self):

        self.size = [constants.SCREEN_WIDTH, constants.SCREEN_HEIGHT]
        self.player = Player()

        self.active_sprite_list = pygame.sprite.Group()

        self.player.rect.x = 120
        self.player.rect.y = constants.SCREEN_HEIGHT - self.player.rect.height
        self.active_sprite_list.add(self.player)

    def processEvents(self,screen):

        for event in pygame.event.get(): # User did something
            if event.type == pygame.QUIT: # If user clicked close
                return True

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP or event.key == pygame.K_w:
                    self.player.jump()
                if event.key == pygame.K_DOWN or event.key == pygame.K_s:
                    self.player.crouch()

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_s or event.key == pygame.K_DOWN:
                    self.player.crouching = False

        return False

    def displayFrame(self, screen):

        self.current_level.draw(screen)
        self.active_sprite_list.draw(screen)
        self.kick_list.draw(screen)

        pygame.display.flip()

def main():
    """ Main Program """
    pygame.init()

    # Set the height and width of the screen
    size = [constants.SCREEN_WIDTH, constants.SCREEN_HEIGHT]
    screen = pygame.display.set_mode(size)

    pygame.display.set_caption("Modular Program")

    #Loop until the user clicks the close button.
    done = False

    # Used to manage how fast the screen updates
    clock = pygame.time.Clock()

    game = Game()

    while not done:

        done = game.processEvents()
        game.displayFrame(screen)
        clock.tick(60)

if __name__ == "__main__":
    main()

Извините, если я пропустил какой-либо важный код, я попытался сузить как можно больше, и, возможно, удалили какой-то важный код.

Обновление: игра работает идеально без настройки прямоугольника, однако, когда игрок приседает, он начинает плавать в воздухе, что побеждает цель приседания в первое место, поскольку оно должно сделать хитбокс меньше, а не просто создать иллюзию приседания.

...