python学习-飞机大战
一、pygame正確安裝
1.安裝:pip install pygame
2.驗證安裝:python -m pygame.examples.aliens;安裝ok即會出現如下圖所示動畫
二、使用pygame創建圖像窗口
1.游戲的初始化和退出;要使用pygame提供的所有功能之前,必須先調用init方法;在游戲結束,需要調用quit方法
2.在游戲中,所有可見的元素都是以矩形區域來描述位置的;要描述一個矩形區域有4個要素(x,y(width,height));pygame.Rect用于專門描述矩形區域的
(pygame.Rect是一個比較特殊的類,內部只是封裝了一些數字計算,不需要執行pygame.init()方法就能直接使用)
舉個例子:
三.創建游戲主窗口;
模塊:pygame.display;用于創建、管理游戲窗口 方法:pygame.display.set_mode():初始化游戲顯示窗口pygame.display.update():刷新屏幕內容顯示,稍后使用set_moed(resolution=(0,0),flags=0,depth=0) →Surfaceresolution:指定屏幕的寬和高;默認創建的窗口大小和屏幕大小一致
flags:指定屏幕的附加選項,例如是否全屏等等,默認不需要傳遞
depth:表示顏色的位置,默認自動匹配
Suface返回值;暫時可以理解為游戲的屏幕,游戲的元素都需要被繪制到游戲的屏幕上
注意:必須使用變量記錄set_mode方法的返回結果!(因為后續所有的圖像繪制都基于這個返回結果)
舉個例子:
四.理解圖像并實現圖像繪制;
圖像文件初始是保存在磁盤上,如需使用,第一步就需要被加載到內存;要在屏幕上看到某一個圖像的內容,需要按照三個步驟:
①.使用pygame.image.load();加載圖像的數據 【load(file_path)】
②.使用游戲屏幕對象,調用blit方法將圖像繪制到指定位置怕【blit(圖像,位置)】
③.調用pygame.display.update()方法更新整個屏幕的顯示
舉個例子:
import pygame pygame.init()#游戲代碼: screen = pygame.display.set_mode((480, 700)) #寬480,高700#繪制背景圖像 """ ①.使用pygame.image.load();加載圖像的數據 ②.使用游戲屏幕對象,調用blit方法將圖像繪制到指定位置 ③.調用pygame.display.update()方法更新整個屏幕的顯示 """bg = pygame.image.load("./images/background.png") #load方法需要有返回值;將背景圖片的地址寫入 screen.blit(bg, (0, 0)) #blit方法里傳入倆個參數:圖像,位置 pygame.display.update() #必須要使用這個方法,才能更新到屏幕上 #游戲循環;為了做到游戲程序啟動后,不會立即退出, while True:passpygame.quit()在游戲中,能夠看到的游戲元素大多是圖像;
圖像文件初始是保存在磁盤上的,如果需要使用,第一步就需要被加載到內存
要在屏幕上看到某一個圖像的內容,需要按照三個步驟:
①.使用pygame.image.load()加載圖像的數據
②.使用游戲屏幕對象,調用blit方法,將圖像繪制到指定位置
③.調用pygame.display.update()方法更新整個屏幕的顯示
五.繪制英雄圖像,并在屏幕上顯示
""" 需求: 1.加載me1.png圖像,創建英雄費飛機 2.將英雄飛機繪制在屏幕的(200,500)位置 3.調用屏幕更新顯示飛機圖像 """import pygame pygame.init()#游戲代碼: screen = pygame.display.set_mode((480, 700)) #寬480,高700#繪制背景圖像 """ ①.使用pygame.image.load();加載圖像的數據 ②.使用游戲屏幕對象,調用blit方法將圖像繪制到指定位置 ③.調用pygame.display.update()方法更新整個屏幕的顯示 """bg = pygame.image.load("./images/background.png") #load方法需要有返回值;將背景圖片的地址寫入 screen.blit(bg, (0, 0)) #blit方法里傳入倆個參數:圖像,位置 pygame.display.update() #必須要使用這個方法,才能更新到屏幕上 #游戲循環;為了做到游戲程序啟動后,不會立即退出# 繪制英雄的飛機并更新在屏幕上 hero = pygame.image.load("./images/me1.png") screen.blit(hero, (200, 500)) pygame.display.update() while True:passpygame.quit()透明圖像:
png格式的圖像是支持透明的,在繪制圖像時,透明區域不會顯示任何內容,但是如果下方已經有內容,會透過透明區域顯示出來
六.update方法的作用
可以在所有繪制工作完成后,統一調用update方法
7.游戲循環
游戲循環的作用:
①.保證游戲不會直接退出
②.變化圖像位置-動畫效果 (每隔1/60s移動一下所有圖像的位置,調用pygame.display.update()更新屏幕顯示)
③.檢測用戶交互 ——按鍵,鼠標等
游戲由2個部分組成:游戲初始化 + 游戲循環
而游戲循環的開始,才意味著游戲的正式開始
游戲初始化:
①.設置游戲窗口
②.繪制圖像初始位置
③.設置游戲時鐘
游戲循環:
①.設置刷新幀率
②.檢測用戶交互
③.更新所有圖像位置
④.更新屏幕顯示
游戲時鐘(利用時鐘設置游戲循環的刷新幀率):
pygame專門提供了一個類:pygame.time.Clock()可以非常方便的設置屏幕繪制速度)刷新幀率;要使用時鐘對象,需要倆步
1)在游戲初始化創建一個時鐘對象
2)在游戲循環中讓時鐘對象調用tick(幀率)方法
tick方法會根據上次被調用的時間,自動設置游戲循環中的延時
英雄動畫效果實現:
""" 需求: 1.在游戲初始化定時一個pygame.Rect的變量記錄英雄的初始位置 2.在游戲循環中每次讓英雄的y-1(向上移動) 3.y<=0將英雄移動到屏幕的底部 """import pygame pygame.init()#游戲代碼: screen = pygame.display.set_mode((480, 700)) #寬480,高700#繪制背景圖像 """ ①.使用pygame.image.load();加載圖像的數據 ②.使用游戲屏幕對象,調用blit方法將圖像繪制到指定位置 ③.調用pygame.display.update()方法更新整個屏幕的顯示 """bg = pygame.image.load("./images/background.png") #load方法需要有返回值;將背景圖片的地址寫入 screen.blit(bg, (0, 0)) #blit方法里傳入倆個參數:圖像,位置 #游戲循環;為了做到游戲程序啟動后,不會立即退出# 繪制英雄的飛機并更新在屏幕上 hero = pygame.image.load("./images/me1.png") screen.blit(hero, (200, 500)) pygame.display.update()#創建游戲時鐘對象 clock = pygame.time.Clock()#定義rect記錄飛機的初始位置 hero_rect = pygame.Rect(200, 500, 102, 126)#游戲循環:意味著游戲的正式開始 while True:clock.tick(60)#2.修改飛機的位置hero_rect.y -=50#判斷飛機的位置if hero_rect.y <=0:hero_rect.y = 700#3.調用blit方法繪制圖像screen.blit(bg, (0, 0))#繪制游戲背景; 為了飛機回到原點,沒有殘影screen.blit(hero, hero_rect)#4.調用update方法更新顯示pygame.display.update()pygame.quit()在游戲中監聽事件:
………………………………省略,沒有詳細的說明了~附帶代碼
plane_main.py
plane_sprites.py
import random import pygame # 屏幕大小的常量 SCREEN_RECT = pygame.Rect(0, 0, 480, 700)#刷新的幀率 FRAME_PER_SEC =60#定義敵機定時器的事件常量 CREATE_ENEMY_EVENT = pygame.USEREVENT#英雄發射子彈事件 HERO_FIRE_EVENT = pygame.USEREVENT + 1""" 該文件是封裝游戲中所有需要使用的精靈子類;提供游戲的相關工具;(比如屏幕尺寸大小,游戲精靈子類) """#創建游戲精靈基類;并繼承pygame.sprite.Sprite class GameSprite(pygame.sprite.Sprite):def __init__(self, image_name, speed=1):#調用父類的初始化方法super().__init__()#加載圖像self.image = pygame.image.load(image_name)#設置尺寸self.rect = self.image.get_rect()#記錄速度self.speed = speeddef update(self):#默認在垂直方向移動self.rect.y += self.speed#創建游戲背景精靈 class BackGround(GameSprite):def __init__(self, is_alt=False):# 1. 調用父類方法實現精靈的創建(image/rect/speed)super().__init__("./images/background.png")# 2. 判斷是否是交替圖像,如果是,需要設置初始位置if is_alt:self.rect.y = -self.rect.heightdef update(self):# 1. 調用父類的方法實現super().update()# 2. 判斷是否移出屏幕,如果移出屏幕,將圖像設置到屏幕的上方if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.height#創建敵機精靈 class Enemy(GameSprite):def __init__(self):#1.調用父類的方法,創建敵機精靈,并且指定敵機的圖像super().__init__("./images/enemy1.png")#2.設置敵機的隨機初始速度self.speed = random.randint(1, 3)#3.設置敵機的隨機初始位置self.rect.bottom = 0max_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0, max_x)def update(self, *args):#1.調用父類的方法,讓敵機在垂直方向運動super().update()#2.判斷是否飛出屏幕,如果是,需要將敵機從精靈組刪除if self.rect.y >= SCREEN_RECT.height:# print("敵機飛出屏幕")# kill方法可以將精靈從所有精靈組中移出,精靈就會被自動銷毀self.kill()def __del__(self):pass#創建英雄精靈 class Hero(GameSprite):def __init__(self):#1.調用父類方法,設置圖像和速度super().__init__("./images/me1.png", 0)#2.設置英雄的初始位置self.rect.centerx =SCREEN_RECT.centerxself.rect.bottom =SCREEN_RECT.bottom - 120#3.創建子彈的精靈組self.bullets = pygame.sprite.Group()def update(self):#1.英雄在水平方向移動self.rect.x += self.speed#控制英雄不能離開屏幕if self.rect.x < 0:self.rect.x = 0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.rightdef fire(self):print("發射子彈……")for i in (0, 1, 2):#1.創建子彈精靈bullet = Bullet()#2.設置精靈的位置bullet.rect.bottom = self.rect.y - i * 20bullet.rect.centerx = self.rect.centerx#3.將精靈添加到精靈組self.bullets.add(bullet)#創建子彈精靈類 class Bullet(GameSprite):def __init__(self):#調用父類方法,設置子彈圖片和設置初始速度super().__init__("./images/bullet1.png", -2)def update(self):#調用父類方法,讓子彈沿垂直方向飛行super().update()#判斷子彈是否飛出屏幕if self.rect.bottom < 0:self.kill()def __del__(self):print("子彈被銷毀……")總結
以上是生活随笔為你收集整理的python学习-飞机大战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: H5微信分享记录
- 下一篇: 淘宝双十一自动化领喵币python脚本