2017-10-12 110 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