2013-02-24 130 views
1

我想在Python中使用pygame和IDLE開發一個簡單的遊戲。自從昨天以來,我已經通過各種渠道瞭解了這些語言(以及一般的編程語言),即使如此,我也遇到了一些問題和誤解。所以,如果任何人都可以請教我如何繼續(或者指出一些好的學習材料的方向),那麼我將非常感激。爲什麼PyGame追蹤圖像?

到目前爲止,我已經得到了一小部分代碼,這些代碼構成了我的遊戲理念的基礎,所以我會在這裏發佈它並列出我的一些問題。

import pygame 

def main(): 


pygame.init() 


logo = pygame.image.load("coolblack.jpg") 
pygame.display.set_icon(logo) 
pygame.display.set_caption("Battleship") 


screenWidth = 800 
screenHeight = 600 
screen = pygame.display.set_mode((screenWidth, screenHeight)) 


bgd_image = pygame.image.load("grid.png") 
#-------------------------------------------------------------------- 
#the image named 'image' should be above 'bgd_image' but below 'cv9' 
#in fact, everything should be above bgd_image, especially 'cv9' 
#-------------------------------------------------------------------- 
image = pygame.image.load("coolblack.jpg") 
cv9 = pygame.image.load("ussessexcv9.gif").convert_alpha() 


xposCv9 = 400 
yposCv9 = 510 


step_xCv9 = 1 
step_yCv9 = 1 


screen.blit(bgd_image, (0,0)) 
screen.blit(image, (400,300)) 
screen.blit(cv9, (xposCv9, yposCv9)) 


pygame.display.flip() 
clock = pygame.time.Clock() 
running = True 

#--------------------------------------------- 
#I've got a pretty good idea (sort of) about 
#what is happening in the section 
#below this point, however it seems that 
#the image 'cv9' creates a trail of itself 
#every time it moves, so how could I make it 
#so that it doesn't do so? 
#--------------------------------------------- 
while running: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: 
      running = False 
    if xposCv9>screenWidth-64 or xposCv9<0: 
     step_xCv9 = -step_xCv9 
    if yposCv9>screenHeight-64 or yposCv9<0: 
     step_yCv9 = -step_yCv9 
    xposCv9 += step_xCv9 
    yposCv9 += step_yCv9 
    screen.blit(cv9, (xposCv9, yposCv9)) 
    pygame.display.flip() 
    clock.tick(60) 


if __name__=="__main__": 
    main() 

回答

2

pygame的工作方式是它內部具有您正在更新的屏幕表示。所以,它開始全黑,然後你做你的第一個「blit」。這將更新內部表示。然後當你調用「pygame.display.flip」時,它會在屏幕上顯示該表示。但是,這並不會自動將您的圖像「清除」回到您的下一幀的所有黑色。所以,在下一幀中,你再次閃爍(稍微向左邊說),並且第一個blit仍然存在,創建你的「蹤跡」。

因此,對於您正在做的事情來說,最好的辦法是在您的循環中清除屏幕的內部表示,然後開始繪製下一幀。你可以「清除」的畫面用單一顏色填充的方法,像這樣......

BLACK = (0,0,0) 
.... 
screen.blit(cv9, (xposCv9, yposCv9)) 
pygame.display.flip() 
clock.tick(60) 
screen.fill(BLACK) # Add this to "clear" the screen. 

請注意,如果你選擇走這條路,這意味着你將需要重新繪製所有的每一個元素幀(不僅僅是自最後一幀以來改變的那些)。

順便說一句,如果你想知道,有一個很好的理由爲什麼框架不會自動清除結束。在某些情況下,只更新更新屏幕的各個部分可能會更快。這可能會導致某些應用程序的性能提升。但是,如上例所示,最好從清除屏幕開始。

+0

非常感謝,這對我非常有幫助! – Moshi 2013-02-24 07:51:04