У меня есть еще одна проблема, и на этот раз это нужно делать, когда игрок прыгает или приседает. Когда они выполняют описанные выше действия, они взлетают невероятно высоко в воздух, но странным является то, что переменная 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()
Извините, если я пропустил какой-либо важный код, я попытался сузить как можно больше, и, возможно, удалили какой-то важный код.
Обновление: игра работает идеально без настройки прямоугольника, однако, когда игрок приседает, он начинает плавать в воздухе, что побеждает цель приседания в первое место, поскольку оно должно сделать хитбокс меньше, а не просто создать иллюзию приседания.