一.簡介
-
pygame
-
頂級pygame包
pygame.init - 初始化所有導入的pygame模塊 pygame.quit - uninitialize所有pygame模塊 pygame.error - 標准的pygame例外 pygame.get_error - 獲取當前錯誤消息 pygame.set_error - 設置當前的錯誤消息 pygame.get_sdl_version - 獲取SDL的版本號 pygame.get_sdl_byteorder - 獲取SDL的字節順序 pygame.register_quit - 注冊pygame退出時要調用的函數 pygame.encode_string - 編碼Unicode或字節對象 pygame.encode_file_path - 將Unicode或字節對象編碼為文件系統路徑 pygame包代表其他人使用的頂級包。Pygame本身被分解成許多子模塊,但這不會影響使用pygame的程序。
為方便起見,pygame中的大多數頂級變量都放在名為“pygame.locals”的模塊中。除了'import pygame'之外,這意味着與'from
pygame.locals
import *' 一起使用 。當你'導入pygame'時,會自動導入所有可用的pygame子模塊。請注意,某些pygame模塊被視為“可選”,可能無法使用。在這種情況下,pygame將提供占位符對象而不是模塊,可用於測試可用性。
-
pygame.
init
() -
初始化所有導入的pygame模塊init() - >(numpass,numfail)
初始化所有導入的pygame模塊。如果模塊失敗,則不會引發異常,但如果成功那么失敗的總數將作為元組返回。您始終可以手動初始化單個模塊,但
pygame.init()
初始化所有導入的pygame模塊是一種方便的方法來啟動所有操作。init()
各個模塊的功能會在失敗時引發異常。您可能希望單獨初始化不同的模塊以加速您的程序或不使用您的游戲沒有的東西。
init()
不止一次調用它是安全的:重復調用將不起作用。即使您擁有pygame.quit()
所有模塊也是如此。
-
pygame.
quit
() -
uninitialize所有pygame模塊退出() - >無
取消初始化之前已初始化的所有pygame模塊。當Python解釋器關閉時,無論如何調用此方法,因此您的程序不應該需要它,除非它想要終止其pygame資源並繼續。不止一次調用此函數是安全的:重復調用無效。
注意,
pygame.quit()
取消初始化所有pygame模塊不會退出程序。考慮讓你的程序以與普通python程序結束相同的方式結束。
-
異常
pygame.
error
-
標准的pygame例外raise pygame.error(message)
pygame或
SDL
操作失敗時會引發此異常。您可以捕獲任何預期的問題並處理錯誤。始終會引發有關問題的描述性消息的異常。派生自RuntimeError異常,也可用於捕獲這些引發的錯誤。
-
pygame.
get_error
() -
獲取當前錯誤消息get_error() - > errorstr
SDL
維護內部錯誤消息。當引發pygame.error()
標准的pygame異常時,通常會給你這條消息。您很少需要調用此函數。
-
pygame.
set_error
() -
設置當前的錯誤消息set_error(error_msg) - >無
SDL
維護內部錯誤消息。當引發pygame.error()
標准的pygame異常時,通常會給你這條消息。您很少需要調用此函數。
-
pygame.
get_sdl_version
() -
獲取SDL的版本號get_sdl_version() - > major,minor,patch
返回
SDL
庫的三個版本號。此版本在編譯時構建。它可用於檢測pygame可能無法使用哪些功能。get_sdl_version是pygame 1.7.0中的新功能
-
pygame.
get_sdl_byteorder
() -
獲取SDL的字節順序get_sdl_byteorder() - > int
返回
SDL
庫的字節順序。它返回LIL_ENDIAN
小端字節順序和BIG_ENDIAN
大端字節順序。get_sdl_byteorder是pygame 1.8中的新功能
-
pygame.
register_quit
() -
注冊pygame退出時要調用的函數register_quit(callable) - > None
當
pygame.quit()
未初始化所有pygame模塊時,將調用所有已注冊的退出函數。Pygame模塊在初始化時會自動執行此操作。常規pygame用戶不需要此功能。
-
pygame.
encode_string
() -
編碼Unicode或字節對象encode_string([obj [,encoding [,errors [,etype]]]]) - > bytes或None
obj:如果是Unicode,則編碼; if bytes,返回不變; 如果有的話,返回None; 如果沒有給出,則引發SyntaxError。
encoding(string):如果存在,則使用編碼。默認為'unicode_escape'。
errors(string):如果給出,如何處理不可編碼的字符。默認為'backslashreplace'。
etype(異常類型):如果給定,則為編碼錯誤引發異常類型。默認值為UnicodeEncodeError,由返回
PyUnicode_AsEncodedString()
。對於默認編碼和錯誤值,應該沒有編碼錯誤。此函數用於編碼文件路徑。支持關鍵字參數。
在pygame 1.9.2中添加(主要用於單元測試)
-
pygame.
encode_file_path
() -
將Unicode或字節對象編碼為文件系統路徑encode_file_path([obj [,etype]]) - > bytes或None
obj:如果是Unicode,則編碼; if bytes,返回不變; 如果有的話,返回None; 如果沒有給出,則引發SyntaxError。
etype(異常類型):如果給定,則為編碼錯誤引發異常類型。默認值為UnicodeEncodeError,由返回
PyUnicode_AsEncodedString()
。此函數用於編碼pygame中的文件路徑。編碼是由返回的編解碼器
sys.getfilesystemencoding()
。支持關鍵字參數。在pygame 1.9.2中添加(主要用於單元測試)
-
-
pygame.version
-
包含版本信息的小模塊
pygame.version.ver - 版本號作為字符串 pygame.version.vernum - 版本的整數整數 pygame.version.rev - 構建的存儲庫修訂版 這個模塊會自動導入到pygame包中,並提供一些變量來檢查已經導入的pygame版本。
-
pygame.version.
ver
-
版本號作為字符串ver ='1.2'
這是表示為字符串的版本。它也可以包含一個微型版本號
e.g.
,'1.5.2'
-
pygame.version.
vernum
-
版本的整數整數vernum =(1,5,3)
該版本的變量可以很容易地與相同格式的其他版本號進行比較。檢查pygame版本號的示例如下所示:
if pygame.version.vernum < (1, 5): print 'Warning, older version of pygame (%s)' % pygame.version.ver disable_advanced_features = True
-
pygame.version.
rev
-
構建的存儲庫修訂版rev ='a6f89747b551 +'
從中構建此程序包的存儲庫檢出的Mercurial節點標識符。如果標識符以加號'+'結尾,則包中包含未提交的更改。請在錯誤報告中包含此修訂號,特別是對於非發布的pygame構建。
-
二.代碼實現
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Sat Jan 30 12:21:29 2019 4 5 @author: zhen 6 """ 7 8 import pygame 9 import time 10 import random 11 from pygame.locals import * 12 """ 13 1.搭建界面,主要是完成窗口和背景圖片 14 """ 15 16 17 def main(): 18 # 1.創建一個窗口,用來顯示內容 19 screen = pygame.display.set_mode((480, 620), 0, 32) 20 # 設置名稱 21 pygame.display.set_caption('飛機大戰') 22 # 2.創建一個和窗口大小一樣的圖片用來充當背景 23 background = pygame.image.load("D:\圖片\stars2.jpg") 24 # 3.創建飛機 25 plane = pygame.image.load("D:\圖片\hero3.png") 26 # 4.創建敵機 27 dj = pygame.image.load("D:\圖片\dj1.png") 28 # 創建飛機坐標變量 29 x = 220 30 y = 570 31 # 創建敵機初始坐標 32 djx = 0 33 djy = 0 34 # 設置敵機移動方向 35 dj_move_direct = "right" 36 # 創建友軍飛機子彈 37 fires = [] 38 x_loc = [] 39 y_loc = [] 40 # 創建友軍子彈的初始位置 41 fx = x + 20 42 fy = 540 43 # 友軍子彈,默認不顯示 44 fire_show = "false" 45 # 創建敵機子彈 46 djzds = [] 47 djx_loc = [] 48 djy_loc = [] 49 # 敵機子彈初始位置 50 djzdx = 0 51 djzdy = 0 52 while True: 53 # 設定需要顯示的背景圖片,把背景圖片覆蓋窗口 54 screen.blit(background, (0, 0)) 55 # 顯示飛機 56 screen.blit(plane, (x, y)) 57 # 顯示友軍子彈 58 if fire_show == "true": 59 for i in range(len(fires)): 60 if fire_show == "true": 61 y_loc[i] = y_loc[i]-5 62 screen.blit(fires[i], (x_loc[i], y_loc[i])) 63 64 # 顯示敵機 65 screen.blit(dj, (djx, djy)) 66 # 敵機自動移動 67 if djx > 400: 68 dj_move_direct = "left" 69 elif djx < 0: 70 dj_move_direct = "right" 71 72 if dj_move_direct == "right": 73 djx += 1 74 else: 75 djx -= 1 76 77 # 添加敵機子彈 78 rand = random.randint(1, 100) 79 if rand == 6 or rand == 8: 80 djzd = pygame.image.load("D://圖片/zd3.png") 81 djzds.append(djzd) 82 djx_loc.append(djx + 30) 83 djy_loc.append(djy + 40) 84 # 顯示敵機子彈 85 for i in range(len(djzds)): 86 djy_loc[i] = djy_loc[i] + 5 87 screen.blit(djzds[i], (djx_loc[i], djy_loc[i])) 88 # 更新需要顯示的內容 89 pygame.display.update() 90 # 獲取事件 91 for event in pygame.event.get(): 92 # 判斷是否點擊了退出按鈕 93 if event.type == QUIT: 94 print("exit") 95 exit() 96 elif event.type == KEYDOWN: 97 # 檢測是否是按鍵A或左方向鍵 98 if event.key == K_a or event.key == K_LEFT: 99 print("event.key == K_a or event.key == K_LEFT") 100 if x > 0: 101 x -= 10 102 # 檢測是否是按鍵D或右方向鍵 103 elif event.key == K_d or event.key == K_RIGHT: 104 print("event.key == K_d or event.key == K_RIGHT") 105 if x < 420: 106 x += 10 107 elif event.key == K_SPACE: 108 fire_show = "true" 109 # 創建新的友軍子彈,面向過程編程已經出現麻煩的情況了,坐標要分開放置 110 fire = pygame.image.load("D://圖片/fire5.png") 111 fires.append(fire) 112 x_loc.append(x + 20) 113 y_loc.append(fy) 114 print("fire") 115 # 休眠 116 time.sleep(0.01) 117 118 119 if __name__ == "__main__": 120 main()
三.結果
敵機開火&同時開火
四.分析
使用pygame編寫一些小型游戲簡潔易上手,在使用面向過程的編碼方式編寫時,隨着邏輯復雜提高,代碼的不斷增加的情況下,編碼越賣越復雜且難以修改,建議使用面向對象的編碼方式!
五.素材
敵機:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_dj1.png
敵機子彈:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_zd3.png
友軍:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_hero3.png
友軍子彈:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_fire5.png