通过Pygam函数对sprite表动画进行计时

2024-06-17 11:28:23 发布

您现在位置:Python中文网/ 问答频道 /正文

这几天我一直在做我的第一个游戏,我刚刚成功地得到了跳跃和奔跑的动画。你知道吗

在我继续之前,我正在尝试清理我的代码。我注意到大多数有经验的用户的代码几乎90%都是函数,所以我很自然地尝试去模仿(可能是愚蠢的,因为我不知道自己在做什么)。你知道吗

我偶然发现的一个问题是,在开放式代码中工作的间隔计时方法在分离为函数时不再工作。一方面,我喜欢组织不同的职能,这种感觉比以前更加复杂。你知道吗

下面是我关于移动和拉动精灵的干净函数。我不确定我是否发布了所有相关信息,因此请告知我是否可以提供其他信息:

## CREATES SPRITESHEET VARIABLE
def player(spritesheet,moveInput):
    marine = []
    for nbr in range(0,5,1):
       marine.append(spritesheet.subsurface(64*(nbr),64,64,64))

    for nbr in range(5,7,1):
       marine.append(spritesheet.subsurface(64*(nbr-5),0,64,64))

    for nbr in range(7,8,1):
       marine.append(spritesheet.subsurface(64*(nbr-5),0,64,64))

    return marine

## FIGURES OUT WHERE PLAYER WANTS TO MOVE
def playermove():
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            mainloop = False # pygame window closed by user
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                mainloop = False # user pressed ESC
        if event.type == pygame.KEYDOWN:    
            if event.key == pygame.K_LEFT:
                moveInput[0] = True;
            if event.key == pygame.K_RIGHT:
                moveInput[1] = True;
            if event.key == pygame.K_UP:
                moveInput[2] = True;
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                moveInput[0] = False;
            if event.key == pygame.K_RIGHT:
                moveInput[1] = False;
            if event.key == pygame.K_UP:
                moveInput[2] = False;

    return moveInput

## RETURNS FRAME FROM SPRITE LIST
def aniframe(moveInput,cycletime):
    interval = .25
    frame = 0
    if not moveInput[0] and not moveInput[1]:
        if cycletime > interval:
            frame = 5
            frame += 1
            cycletime = 0
            if frame > 6:
                frame = 5

    if moveInput[0]:
        if cycletime > interval:
            frame += 1
            cycletime = 0
            if frame > 4:
                frame = 0

    if moveInput[1]:
        if cycletime > interval:
            frame += 1
            cycletime = 0
            if frame > 4:
                frame = 0
    return frame

playersprite = player(spritesheet,moveInput)


screen.blit(playersprite[aniframe(moveInput,cycletime)], (x,y))

Tags: keyineventfalseforiftypeframe
1条回答
网友
1楼 · 发布于 2024-06-17 11:28:23

我要把这归咎于cycletime。您正在aniframe()中修改它,但更改不会离开函数,因为数字是按值传递的,而不是按引用传递的。你也得把它还回去。例如,return frame,cycletime,然后在函数外,have frame,cycletime=aniframe(moveInput,cycletime)

相关问题 更多 >