编程游戏介绍动画

时间:2017-10-12 22:14:36

标签: python animation pygame

我在Pygame上玩游戏,并试图实施游戏介绍。我希望有两个角色四处移动并且说话,玩家需要按空格键向前移动对话并继续介绍动画。

虽然在主游戏循环(使用键作为输入)时在主屏幕上移动主角没有问题,但实现了介绍"动画"证明比我想象的更难。

我的目的是让这两个角色走到屏幕上的不同位置,并在他们说话时停下来。然后开始以不同的方向再次行走,等等。

以下是我现在正在实施的代码,但它没有按照我的预期运行,因为我添加了这个新部分并且因为它不是循环运动(不是重复的),所以游戏有时需要加载太长时间虽然在我的主要游戏循环中循环,但是一系列相当明确的事件,我不确定如何处理它。

我一直在做的是从intro函数调用一个名为main_loop的函数(这是我的主要While循环函数)。我注意到因为我没有运行重复循环,然后刷新无法正常工作,我必须多次调用我的更新(或翻转)显示以避免角色离开之前的位置在屏幕上但无论如何它仍然会发生)。同样,整件事情真的很慢。

def intro():

    #VARIABLES
    P1_x = 280 #starting position
    P1_y = 380 #starting position
    P1_dir = 3 #for the player sprite sheet loading
    NPC_x = 240
    NPC_y = 280
    NPC_dir = 2

    #LOAD PLAYER CLASSES
    P1 = player(P1_x, P1_y, P1_dir)
    P2 = npc(NPC_x, NPC_y, NPC_dir)

    gameDisplay.fill(black)

    #DRAW BACKGROUND MAP PLUS BACKGROUND OBJECTS
    draw_layer(intro_int_matrix, house_tiles, house_tiles_W, house_tiles_H)
    draw_layer_2(intro_int_matrix_2, intro_house_2, intro_house_2_W, intro_house_2_H)

    #LOOP (TRIED WITH "WHILE" ALSO) TO MAKE THE PLAYER MOVE A BIT IN A DIRECTION AND THEN STOP
    for i in range (5):
        P1.update(3, 0, P1_dir) #THE 3 IS THE DISTANCE TO MOVE IN X-AXIS, and 0 in Y axis
        pygame.display.update() 
        pygame.time.delay(300) #TRIED ADDING A DELAY SO IT DOES NOT MOVE TOO FAST BUT DOES NOT HELP MUCH

    #THE IDEA OF SETTING X AND Y TO 0 IS TO STOP THE MOVEMENT          
    P1.update(0, 0, P2_dir)
    draw_layer(intro_int_matrix, house_tiles, house_tiles_W, house_tiles_H)
    draw_layer_2(intro_int_matrix_2, intro_house_2, intro_house_2_W, intro_house_2_H)
    pygame.display.update() 
    pygame.time.delay(1000)

    #SHOW DIALOGUE....AND WAIT FOR "SPACE" INPUT

    #THEN I WILL INCLUDE ANOTHER "FOR" LOOP TO KEEP ON MOVING TO A DIFFERENT POSITION AND CALLING THE DIALOGUE IN BETWEEN ETC, BUT I WANT TO SOLVE THE MOVEMENT PART FIRST.
编辑:我设法通过在我的def intro()中使用While循环来解决这个问题,然后在里面使用几个由两个条件触发的IF语句:1,步骤编号(允许我跟踪动画实例)和2,get_ticks()数字,它允许我控制动画的速度。然后由于While循环,所有内容都通过在我刚刚提到的IF语句中使用其他IF语句重复X次。希望对于遇到此问题的人来说,这很容易理解。

1 个答案:

答案 0 :(得分:-1)

在实现图形移动时,一个好的经验法则是使用很多非常小的步骤,而不是一些缓慢的大步骤。因此,在您的情况下,您希望有一个for循环,暂停时间较短,并且每次更新时移动字符的次数较少。例如,我编辑了你的循环:

for i in range (15):
    P1.update(1, 0, P1_dir) #THE 3 IS THE DISTANCE TO MOVE IN X AXIS, and 0 
in Y axis
    pygame.display.update() 
    pygame.time.delay(100) #TRIED ADDING A DELAY SO IT DOES NOT MOVE TOO FAST BUT DOES NOT HELP MUCH

这使得它不是5个像素的5次更新,而是有1个像素的15个更新发生3倍的速度。

现在回答你的问题:当你在for循环中有东西时,Pygame会工作,所以在这里看看你的代码:

P1.update(0, 0, P2_dir)
draw_layer(intro_int_matrix, house_tiles, house_tiles_W, house_tiles_H)
draw_layer_2(intro_int_matrix_2, intro_house_2, intro_house_2_W, 
intro_house_2_H)
pygame.display.update() 
pygame.time.delay(1000)

在您的实现中,您没有正在运行的循环,您只能一次调用绘制函数,然后延迟1秒。一个正确的实现是将它包装在for循环中,以便在你进行对话时游戏将不断刷新:

for i in range(300): # first dialog popup
    P1.update(0, 0, P2_dir)
    draw_layer(intro_int_matrix, house_tiles, house_tiles_W, house_tiles_H)
    draw_layer_2(intro_int_matrix_2, intro_house_2, intro_house_2_W, 
    intro_house_2_H)
    #implement 1st part of dialog
    pygame.display.update() 
    pygame.time.delay(10)

for i in range(300): # second dialog popup
    P1.update(0, 0, P2_dir)
    draw_layer(intro_int_matrix, house_tiles, house_tiles_W, house_tiles_H)
    draw_layer_2(intro_int_matrix_2, intro_house_2, intro_house_2_W, 
    intro_house_2_H)
    #implement 2nd part of dialog
    pygame.display.update() 
    pygame.time.delay(10)

注意这是如何循环的。