前言
本系列文章将會以通俗易懂的對話方式進行教學,對話中将涵蓋了新手在學習中的一般問題。此系列将會持續更新,包括别的語言以及實戰都将使用對話的方式進行教學,基礎程式設計語言教學适用于零基礎小白,之後實戰課程也将會逐漸更新。
若有想學習的内容可以在評論區留言,根據大家的要求持續更新。點贊過十萬就算化成灰我也更新下一篇。(肯定不到,也會更的。)
作者簡介
作者名:1_bit
簡介:CSDN部落格專家,2020年部落格之星TOP5,藍橋簽約作者。15-16年曾在網上直播,帶領一批程式小白走上程式員之路。
部落格位址:https://i1bit.blog.csdn.net
🐰小C:小媛,上一節我們繪制了一個場景,移動了角色,那麼這一節我們就開始控制主角并且讓他進行移動吧?
👸小媛:我怎麼感覺你突然變得好心了,以前每一節就講一點内容,然後就開始跟我拌嘴水字數,這一節怎麼直奔主題?😂
🐰小C:有嘛?是你跟我拌嘴的好嘛?你不信去看聊天記錄。
👸小媛:真的嗎?那還不是你在水字數。
🐰小C:哈哈哈,這一節不水了,開始玩真的吧。
👸小媛:趕緊的,你又水了 224 個md字數了。😂
🐰小C:行,我們先看一下我們上一節的代碼。
import pygame
pygame.init()
screen=pygame.display.set_mode((600,800))
pygame.display.set_caption("這是一個飛機遊戲")
icon=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
bg=pygame.image.load(r'E:\2dsrc\src\img\bg.png')
hero=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
pygame.display.set_icon(icon)
heroX=250 #x坐标
#遊戲主循環
while True:
#事件周遊
for event in pygame.event.get():
if event.type==pygame.QUIT:
exit()
heroX=heroX-3
screen.blit(bg,(0,0))
screen.blit(hero,(heroX,680))
pygame.display.update()
複制
🐰小C:上一節我們隻是使用了代碼對主角進行移動,那麼現在我們改一下,我們按上,主角就往上走、按下主角就往下走,其它按鍵依次類推如何?
👸小媛:行,你說啥就是啥,終于不廢話了。 😰
🐰小C:不不不,還是需要點情節來讓整個氛圍輕松的。
👸小媛:趕緊吧,别廢話,真是禁不起誇。
🐰小C:哈哈哈,其實我們剛剛已經擷取到了這個遊戲中發生的所有事件 pygame.event.get(),我們隻是從擷取的事件中判斷是否做了退出事件,那麼在這裡我們隻需要再判斷是否按下了特定的鍵,那麼就可以對特定的鍵做出反應了。
👸小媛:然後根據上一節所學,我們隻需要根據不同按鍵控制這個主角下一次繪制所在的位置就可以了吧?
🐰小C:是的,我們首先判斷按下什麼鍵吧。
import pygame
pygame.init()
screen=pygame.display.set_mode((600,800))
pygame.display.set_caption("這是一個飛機遊戲")
icon=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
hero=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
bg=pygame.image.load(r'E:\2dsrc\src\img\bg.png')
pygame.display.set_icon(icon)
#遊戲主循環
while True:
#事件周遊
for event in pygame.event.get():
if event.type==pygame.QUIT:
exit()
if event.type==pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
print('→')
elif event.key == pygame.K_LEFT:
print('←')
elif event.key == pygame.K_UP:
print('↑')
elif event.key == pygame.K_DOWN:
print('↓')
screen.blit(bg,(0,0))
screen.blit(hero,(heroX,680))
pygame.display.update()
複制
👸小媛:
if event.key == pygame.K_RIGHT
就是判斷是否按下的鍵嗎?
🐰小C:是的,
event.key
表示具體按下了什麼鍵,如果
event.key
等于
pygame.K_RIGHT
那麼就表示按下了右鍵頭,那麼就運作
print('→')
輸出列印出 → 箭頭。
👸小媛:明白了。然後
pygame.K_LEFT
是按下了左鍵、
pygame.K_UP
表示按下上鍵、
pygame.K_DOWN
表示按下了下鍵? 😶
🐰小C:是的,但是我們需要注意,必須是按下鍵後這個時間才會有
event.key
中的
key
這個類型,如果你沒按下是判斷不出來按下了什麼鍵,是以前面
if event.type==pygame.KEYDOWN:
這句代碼至關重要,表示了你按下鍵後才進行判斷。你可以運作程式感受一下。
👸小媛:哈哈哈,好好玩,我按下什麼就顯示什麼。 😎
🐰小C:都正确響應了吧?
👸小媛:是的。
🐰小C:那麼我們接下來就需要控制角色進行移動了。
👸小媛:我覺得有點會了,但是還需要你寫出來看一下,我總感覺我會出錯。
🐰小C:我們先控制角色左右移動吧?
👸小媛:可以呀,沒問題。 😎
🐰小C:我們知道,在這個螢幕中左右是控制 X 坐标,X越大那麼越靠右,X越小那麼就越靠左,我們按下左鍵的時候 X 軸的值就應該變小,如果按下右鍵那麼 X 軸的值就應該越大。我們隻需要在按下左右鍵的時候給一個變量賦予一個正值或者負值,正值表示往右負值表示往左,并且每次 hero 主句的 X 軸的值加上這個值就可以了。
import pygame
pygame.init()
screen=pygame.display.set_mode((600,800))
pygame.display.set_caption("這是一個飛機遊戲")
icon=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
hero=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
bg=pygame.image.load(r'E:\2dsrc\src\img\bg.png')
pygame.display.set_icon(icon)
heroX=250
heroY=680
stepX=0
#遊戲主循環
while True:
#事件周遊
for event in pygame.event.get():
if event.type==pygame.QUIT:
exit()
if event.type==pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
stepX=5
elif event.key == pygame.K_LEFT:
stepX=-5
elif event.key == pygame.K_UP:
print('↑')
elif event.key == pygame.K_DOWN:
print('↓')
heroX+=stepX
screen.blit(bg,(0,0))
screen.blit(hero,(heroX,heroY))
pygame.display.update()
複制
👸小媛:你在按下右鍵的時候給予了 stepX 變量正值,按下左鍵給予了 stepX 鍵負值,然後每次循環 heroX 就加上這個 stepX 值,這樣按下左就可以一直往左?按下右就可以一直往右?
🐰小C:是的。
👸小媛:是以你把 hero 的 Y 值使用了變量 heroY,這樣也是為了友善操作吧?
🐰小C:是的,觀察挺仔細,注意,我在循環前是建立了這幾個變量的。
heroX=250
heroY=680
stepX=0
複制
👸小媛:明白。
🐰小C:那我給你一個完整的代碼吧。
import pygame
pygame.init()
screen=pygame.display.set_mode((600,800))
pygame.display.set_caption("這是一個飛機遊戲")
icon=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
hero=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
bg=pygame.image.load(r'E:\2dsrc\src\img\bg.png')
pygame.display.set_icon(icon)
heroX=250
heroY=680
stepX=0
stepY=0
#遊戲主循環
while True:
#事件周遊
for event in pygame.event.get():
if event.type==pygame.QUIT:
exit()
if event.type==pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
stepX=5
elif event.key == pygame.K_LEFT:
stepX=-5
elif event.key == pygame.K_UP:
stepY=-5
elif event.key == pygame.K_DOWN:
stepY=5
heroX+=stepX
heroY+=stepY
screen.blit(bg,(0,0))
screen.blit(hero,(heroX,heroY))
pygame.display.update()
複制
👸小媛:上面的 stepY 就是新建立的變量用來判斷是按上還是按下?
🐰小C:是的,跟 stepX 一樣。
👸小媛:哈哈哈,可以移動了。 😎