外星人入侵開發總結
設置屏幕大小、遊戲名稱、背景顏色
pygame.init() #初始化背景設置
ai_settings = Settings()
screen = pygame.display.set_mode((120, 800))
pygame.display.set_caption("外星人入侵")
set_mode()就是設置遊戲屏幕寬高的函數,座標原點在電腦屏幕左上角。
set_caption()就是設置遊戲名稱的函數
背景顏色
#設置背景顏色
bg_color = (230, 230, 230)
screen.fill(ai_settings.bg_color) #只能有一個參數
screen.fill()函數只能傳遞一個參數,設置背景的顏色。
這些基本的參數可用在一個文件中寫,然後在其他文件中引用。
讓屏幕繪製可見
# 讓最近繪製的屏幕可見
pygame.display.flip()
這句代碼必須有,不然所有的screen設置都無法顯示。 正常在每個循環中都會重新設置
設置鍵盤和鼠標監聽事件
def check_events(ai_settings,screen,ship,bullets):
""" 響應按鍵和鼠標事件,在這個方法中指定需要檢查的事件 """
# 事件都是通過pygame.event.get()方法獲取
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 每次按鍵都會註冊一個KEYDOWN
# 檢測到KEYDOWN事件時,我們需要檢查按下的是否是特定的鍵
elif event.type == pygame.KEYDOWN:
check_keydown_events(event,ai_settings,screen,ship,bullets)
# 鬆開方向鍵時觸發的事件,將moving_right or moving_left設爲false
elif event.type == pygame.KEYUP:
check_keyup_events(event,ship)
爲了能夠訪問Pygame檢測到的事件,需要使用pygame.event.get()函數,獲取事件,然後再通過event.type來判斷獲取的事件類型
鍵盤按鍵事件編碼大全
KeyASCII | ASCII | Common Name |
---|---|---|
K_BACKSPACE | \b | backspace |
K_TAB | \t | tab |
K_CLEAR | clear | |
K_RETURN | \r | return |
K_PAUSE | pause | |
K_ESCAPE | ^[ | escape |
K_SPACE | space | |
K_EXCLAIM | ! | exclaim |
K_QUOTEDBL | " | quotedbl |
K_HASH | # | hash |
K_DOLLAR | $ | dollar |
K_AMPERSAND | & | ampersand |
K_QUOTE | quote | |
K_LEFTPAREN | ( | left parenthesis |
K_RIGHTPAREN | ) | right parenthesis |
K_ASTERISK | * | asterisk |
K_PLUS | + | plus sign |
K_COMMA | , | comma |
K_MINUS | - | minus sign |
K_PERIOD | . | period |
K_SLASH | / | forward slash |
K_0 | 0 | 0 |
K_1 | 1 | 1 |
K_2 | 2 | 2 |
K_3 | 3 | 3 |
K_4 | 4 | 4 |
K_5 | 5 | 5 |
K_6 | 6 | 6 |
K_7 | 7 | 7 |
K_8 | 8 | 8 |
K_9 | 9 | 9 |
K_COLON | : | colon |
K_SEMICOLON | ; | semicolon |
K_LESS | < | less-than sign |
K_EQUALS | = | equals sign |
K_GREATER | > | greater-than sign |
K_QUESTION | ? | question mark |
K_AT | @ | at |
K_LEFTBRACKET | [ | left bracket |
K_BACKSLASH | \ | backslash |
K_RIGHTBRACKET | ] | right bracket |
K_CARET | ^ | caret |
K_UNDERSCORE | _ | underscore |
K_BACKQUOTE | ` | grave |
K_a | a | a |
K_b | b | b |
K_c | c | c |
K_d | d | d |
K_e | e | e |
K_f | f | f |
K_g | g | g |
K_h | h | h |
K_i | i | i |
K_j | j | j |
K_k | k | k |
K_l | l | l |
K_m | m | m |
K_n | n | n |
K_o | o | o |
K_p | p | p |
K_q | q | q |
K_r | r | r |
K_s | s | s |
K_t | t | t |
K_u | u | u |
K_v | v | v |
K_w | w | w |
K_x | x | x |
K_y | y | y |
K_z | z | z |
K_DELETE | delete | |
K_KP0 | keypad 0 | |
K_KP1 | keypad 1 | |
K_KP2 | keypad 2 | |
K_KP3 | keypad 3 | |
K_KP4 | keypad 4 | |
K_KP5 | keypad 5 | |
K_KP6 | keypad 6 | |
K_KP7 | keypad 7 | |
K_KP8 | keypad 8 | |
K_KP9 | keypad 9 | |
K_KP_PERIOD | . | keypad period |
K_KP_DIVIDE | / | keypad divide |
K_KP_MULTIPLY | * | keypad multiply |
K_KP_MINUS | - | keypad minus |
K_KP_PLUS | + | keypad plus |
K_KP_ENTER | \r | keypad enter |
K_KP_EQUALS | = | keypad equals |
K_UP | up arrow | |
K_DOWN | down arrow | |
K_RIGHT | right arrow | |
K_LEFT | left arrow | |
K_INSERT | insert | |
K_HOME | home | |
K_END | end | |
K_PAGEUP | page up | |
K_PAGEDOWN | page down | |
K_F1 | F1 | |
K_F2 | F2 | |
K_F3 | F3 | |
K_F4 | F4 | |
K_F5 | F5 | |
K_F6 | F6 | |
K_F7 | F7 | |
K_F8 | F8 | |
K_F9 | F9 | |
K_F10 | F10 | |
K_F11 | F11 | |
K_F12 | F12 | |
K_F13 | F13 | |
K_F14 | F14 | |
K_F15 | F15 | |
K_NUMLOCK | numlock | |
K_CAPSLOCK | capslock | |
K_SCROLLOCK | scrollock | |
K_RSHIFT | right shift | |
K_LSHIFT | left shift | |
K_RCTRL | right control | |
K_LCTRL | left control | |
K_RALT | right alt | |
K_LALT | left alt | |
K_RMETA | right meta | |
K_LMETA | left meta | |
K_LSUPER | left Windows key | |
K_RSUPER | right Windows key | |
K_MODE | mode shift | |
K_HELP | help | |
K_PRINT | print screen | |
K_SYSREQ | sysrq | |
K_BREAK | break | |
K_MENU | menu | |
K_POWER | power | |
K_EURO | Euro |
加載圖片 添加圖片元素
以ship.py爲例
class Ship():
def __init__(self,ai_settings, screen):
""" 初始化飛船設置其初始化位置"""
self.screen = screen
self.ai_settings = ai_settings
# 加載飛船圖像並獲取其外接矩形
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
#將每艘新飛船放在屏幕底部中央
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
# 在飛船的屬性center中存儲小數值
self.center = float(self.rect.centerx)
# 添加一個向右移動的屬性 初始化爲False
# 在向右鍵按下時,爲真,鬆開爲False,實現按住持續移動
self.moving_right = False
self.moving_left = False
通過pygame.image.load()函數加載圖片,存放圖片素材的文件最好與ship.py在同一級目錄。
self.image.get_rect() 是獲取圖片所佔用的矩形,此後就像操作一個矩形一樣操控圖片,簡單快捷高效。
screen.get_rect() 同理就是獲取屏幕的矩形。
兩個獲取的矩形rect其實都是爲了獲取對象的參數,方便設置位置等。可用使用矩形的四角和中心(x,y)座標來設置圖片的位置。
rect的對象還有center,centerx,centery屬性。
屬性 | 作用 |
---|---|
center | 即矩形中心,返回的是矩形中心的座標 |
centerx | 矩形x軸的中心,返回的是矩形x軸中心的x值 |
centery | 矩形y軸的中心,返回的是矩形y軸中心的y值 |
top | 矩形頂部 |
bottom | 矩形底部 |
left | 矩形左邊 |
right | 矩形右邊 |
這些值都是可用修改的。
在指定位置繪製圖片元素
""" 在指定位置繪製飛船"""
self.screen.blit(self.image,self.rect)
blit()向屏幕添加圖片元素,self.image傳遞的是圖片,self.rect傳遞是矩形元素,通過rect的centerx和bottom屬性設置的矩形圖片在屏幕中的位置
事件響應
def check_keydown_events(event,ai_settings,screen,ship,bullets):
# 響應按鍵 右方向鍵
# 通過讀取event.key,檢查按下的是否是右箭頭鍵
if event.key == pygame.K_RIGHT:
# 向右移動飛船
# ship.rect.centerx += 1 飛船向右移動
ship.moving_right = True
elif event.key == pygame.K_LEFT:
# 向左移動飛船
# ship.rect.centerx -= 1
ship.moving_left = True
elif event.key == pygame.K_SPACE: # 設置開火指令
fire_bullet(ai_settings, screen, ship, bullets)
# 按下Q時退出遊戲
elif event.key == pygame.K_q:
sys.exit()
def check_keyup_events(event ,ship):
# 響應鬆開
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ai_settings,screen,ship,bullets):
""" 響應按鍵和鼠標事件,在這個方法中指定需要檢查的事件 """
# 事件都是通過pygame.event.get()方法獲取
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 每次按鍵都會註冊一個KEYDOWN
# 檢測到KEYDOWN事件時,我們需要檢查按下的是否是特定的鍵
elif event.type == pygame.KEYDOWN:
check_keydown_events(event,ai_settings,screen,ship,bullets)
# 鬆開方向鍵時觸發的事件,將moving_right or moving_left設爲false
elif event.type == pygame.KEYUP:
check_keyup_events(event,ship)
簡單的講,就是按某個鍵,pygame檢測到這個鍵被觸發,然後找到對應的處理方法,然後觸發相應的響應事件。
這裏就是控制飛船的移動,也就是修改飛船的位置參數。
有按鍵按下事件,鬆開事件,單擊按動事件
將子彈設置成從飛船頂部發出
# 設置子彈的位置,位於飛船的正上方。
self.rect.centerx = ship.rect.centerx
self.rect.top = ship.rect.top
理解:pygame中元素的佈局其實是相對佈局。將A元素的rect參數設置成B元素的rect,則B元素是相對於A元素的佈局位置
創建元素編組,存儲生成的元素
# 創建一個用於存儲子彈的編組,存儲所有有效的子彈,
# 管理髮射出去的子彈
bullets = Group()
# 創建一個空編組,用於存儲全部外星人
aliens=Group()
其實就是將元素建個數組存起來,方便在需要的查找到該元素。
飛船開火事件
這種開火事件其實就是按一下空格生成一顆子彈,並且讓子彈移動。
elif event.key == pygame.K_SPACE: # 設置開火指令
fire_bullet(ai_settings, screen, ship, bullets)
def fire_bullet(ai_settings, screen, ship, bullets):
# 如果還沒有到達限制,就發射一顆子彈
# 創建一顆子彈,並將其加入到編組bullets中
# 按下空格時,發射子彈,並且限制子彈數量
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
感想
這樣的遊戲開發其實非常簡單,就是添加幾個元素,然後通過修改它的位置屬性來實現它的移動。
對動態的理解,遊戲的動態效果其實就是基於電腦高速的計算速度,每一次的繪製其實都是靜態的,但是通過非常快的速度對飛船的位置進行細微的修改,就實現了動態的效果,也就在不斷的循環刷新遊戲界面,所以一般電腦屏幕刷新率高的遊戲更流暢,電腦運行速度快的也更流暢。系統裏面其實有一個死循環,在不停的根據事件響應來刪掉舊的,更新添加。所以在遊戲開發中這個循環是必不可少的,而且最好是while循環來實現