這節課我們來談談事件,什麼是事件呢?
事實上,我們可以看到,遊戲就是一個死循環,如果我們不去干預它的話,它會自己玩得很開心,像之前我們寫的亂跑的小蛇。而事件就是Pygame 提供給我們去干預它的機制,例如我們點關閉,就會產生QUIT 事件,我們處理這個QUIT 事件的方法就是調用sys.exut() 方法來退出整個程序。
事件隨時都可能發生,比如你在窗口上面移動鼠標,點擊鼠標或者敲擊鍵盤的按鍵,這些都會產生事件,並且信息量是非常大的。Pygame 的做法就是將這所有產生的事件都放在一個叫做事件隊列裡,然後我們通過for 語句迭代出每一個事件,對我們關注的事件進行處理,像我們剛才關注的QUIT 事件。如下面代碼:
-
for event in pygame.event.get():
-
if event.type == pygame.QUIT:
-
我們現在來寫一個代碼,將程序運行期間產生的所有事件記錄並保存到一個文件中。大家可以先寫一下,再看下面的代碼:
-
-
-
-
-
-
-
size = width, height = 800, 600
-
-
screen = pygame.display.set_mode(size)
-
pygame.display.set_caption("初次见面,请大家多多关照!")
-
-
f = open("record.txt", "w")
-
-
-
for event in pygame.event.get():
-
f.write(str(event) + "\n")
-
if event.type == pygame.QUIT:
-
-
-
得到的record.txt 文件裡面就可以看到在程序運行期間的所有事件。
接下來我們希望將這些事件顯示在屏幕上,這就涉及到要在屏幕上顯示文本的功能,或者要求我們在Surface 對像上來打印文字,但是很遺憾的告訴大家,Pygame 並沒有辦法讓你在一個Surface 對像上面繪製你想要的文字,但是Pygame 也提供了可以達到同樣效果的途徑,我們就需要使用到font 模塊的render() 方法。
這個render() 方法就是將顯示的文字活生生的渲染成一個Surface 對象,這樣你就可以調用blit() 方法將一個Surface 對象複製到另一個Surface 上面。
我們就來開始寫代碼吧:
-
-
-
-
-
-
-
size = width, height = 800, 600
-
-
screen = pygame.display.set_mode(size)
-
pygame.display.set_caption("Python Demo")
-
-
-
-
-
font = pygame.font.Font(None, 20)
-
line_height = font.get_linesize()
-
-
-
-
-
for event in pygame.event.get():
-
if event.type == pygame.QUIT:
-
-
-
screen.blit(font.render(str(event), True, (0, 255, 0)), (0, position))
-
-
-
-
-
-
-
在代碼運行過程中,會將產生的事件依次顯示在屏幕上,大家可能對於打印的事件內容和含義還搞不清楚,下表列出了所有常用的Pygame 事件及其含義。
例如MOUSEMOTION,它有3個屬性,pos 表示當前坐標位置,rel 表示距離上一個位置的相對距離,buttons 是一個三元組,表示你按下了哪一個按鈕。
接下來我們就可以做一件事了,讓瘋狂的小蛇受控制了。
我們就不止關注QUIT 事件了,我們還需要關注KEYDOWN。(按鍵事件)
-
-
-
-
-
-
-
size = width, height = 600, 400
-
-
-
-
-
clock = pygame.time.Clock()
-
-
-
screen = pygame.display.set_mode(size)
-
-
pygame.display.set_caption("初次见面,请大家多多关照!")
-
-
-
turtle = pygame.image.load("python.png")
-
-
position = turtle.get_rect()
-
-
-
r_head = pygame.transform.flip(turtle, True, False)
-
-
-
for event in pygame.event.get():
-
if event.type == pygame.QUIT:
-
-
-
if event.type == pygame.KEYDOWN:
-
if event.key == pygame.K_LEFT:
-
-
-
if event.key == pygame.K_RIGHT:
-
-
-
if event.key == pygame.K_UP:
-
-
if event.key == pygame.K_DOWN:
-
-
-
-
position = position.move(speed)
-
-
if position.left < 0 or position.right > width:
-
-
turtle = pygame.transform.flip(turtle, True, False)
-
-
-
-
if position.top < 0 or position.bottom > height:
-
-
-
-
-
-
screen.blit(turtle, position)
-
-
-
-
-
-
0 留言:
發佈留言