2017-10-12 78 views
1

我工作的pygame的游戏,并试图实现游戏的介绍。我希望有两个角色四处移动并说话,玩家需要按空间向前移动对话并让介绍动画继续。编程游戏介绍动画

虽然我没有问题,而在游戏主循环(使用密钥作为输入),实施前奏“动画”被证明是比我想很难移动在屏幕上的主角。

我的本意是为这两个字符走在屏幕上不同的地方,并停止,而他们交谈。然后开始在不同的方向再走,等

下面是现在我实现,但它不工作,我所期望的代码,游戏时间过长有时加载,因为我加入这个新的组成部分,也是因为它不是一个循环运动(不像我的主要游戏循环中那样是一个重复的while循环),而是一系列相当定义的事件,我不知道如何处理它。

我一直在做的是从main_loop函数(这是我的主While循环中的函数)调用一个函数intro。我注意到因为我没有运行重复循环,刷新不能正常工作,我必须多次调用我的更新(或翻转)显示,以避免字符离开屏幕上的前一个位置,但它反正仍然发生)。再次,整个事情真的很慢。

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. 

编辑:我已经成功通过简单地在我的高清介绍使用While循环(),然后使用内解决这个问题的几种IF是那些获得由两个条件触发声明:1,步骤数字(允许我跟踪动画实例)和2,get_ticks()数字,它允许我控制动画的速度。然后由于While循环,通过在我刚刚提到的IF语句中使用额外的IF语句,所有事情都会重复X次。希望这个问题很容易理解。

+0

欢迎来到[so]。你自己解决这个问题很好。作为问答网站,您可以*并鼓励*在下面的答案框中发布您的答案。记住,问题框是针对问题的,答案框是答案。谢谢! –

回答

-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 

这使得具有3个像素5次的更新,以便替代它,你有1个像素3X发生快15次的更新。

现在回答你的问题: pygame的工作,当你有事情在for循环中,所以看看你的代码在这里:在您的实现

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) 

注意如何循环。

+0

我试着改变我的代码,但它不断粉碎。我没有遇到任何错误,但是当游戏开始时,我只是得到一个白色的屏幕,没有任何反应。我需要进一步调查,但我认为也许我应该使用While循环而不是for循环。只是一个想法。 – Zeprog