這次呢,讓我們重溫一下兒時的樂趣梧喷,用Python做一個飛機大戰(zhàn)的小游戲醉蚁。
接下來,讓我們一起走進“飛機大戰(zhàn)”锯玛。
一.確認模塊
pygame就是一個python模塊,專為電子游戲設計
官方網(wǎng)站:https://www.pygame.org/
***[在這里要學習第三方模塊兼蜈,通常最好的參考資料就在官方網(wǎng)站]
二.安裝pygame
命令為: sudo pip3 install pygame
三.驗證安裝
$ python3 -m pygame.examples.aliens
代碼塊
精靈類---plane_sprites
這個模塊放一些常用的工具和基礎類和精靈類
在其他模塊調(diào)用
import pygame
import random
設置游戲屏幕大小 這是一個常量
SCREEN_RECT = pygame.Rect(0,0,580,700)
敵機的定時器事件常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
定制一個精靈類攘残,需要繼承pygame提供的精靈類
需要定義的屬性有:
image圖片
rect坐標
speed速度
接下來開始寫敵機方面的內(nèi)容 產(chǎn)生敵機
先定義一個事件常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
我們還可以定義一個事件常量(發(fā)射子彈)
HERO_FIRE_EVENT = pygame.USEREVENT + 1
class GameSprite(pygame.sprite.Sprite):
def init(self,new_image,new_speed=1):
super().init()
#圖片
self.image = pygame.image.load(new_image)
#速度
self.speed = new_speed
#位置 獲取圖片的寬和高 get_rect()(0,0,寬,高)
self.rect = self.image.get_rect()
#精靈移動的速度 包括英雄精靈 背景精靈 敵機精靈 子彈精靈
self.speed = new_speed
def update(self):
#默認垂直方向移動 y軸控制垂直方向
self.rect.y += self.speed
#self.rect.x += 1
以上是游戲的基礎類饭尝,接下來設置背景類
明確背景類繼承自游戲的精靈類
class Background(GameSprite):
def init(self,is_alt = False):
#is_alt判斷是否為另一張圖像
#False表示第一張圖像
#Ture表示另外一張圖像
#兩張圖像交替循環(huán)
#傳圖片
super().init("/home/handi/下載/beijing.png")
if is_alt:
#如果是第二張圖片 初始位置為-self.rect.height
self.rect.y = -self.rect.height
#def init(self,new_image):
# super().init__(new_image)
def update(self):
#調(diào)用父類方法
super().update()
if self.rect.y >= SCREEN_RECT.height:
self.rect.y = -self.rect.height
敵機出場
class Enemy(GameSprite):
#敵機精靈
def init(self):
#1 調(diào)用父類方法 創(chuàng)建敵機精靈 并且指定敵機圖像
super().init("/home/handi/桌面/images/enemy1.png")
#2 設置敵機的隨機初始速度1~3
self.speed = random.randint(2,6)
#3 設置敵機的隨機初始位置
self.rect.bottom = 0
max_x =SCREEN_RECT.width -self.rect.width
self.rect.x = random.randint(0,max_x)
def update(self):
#1 調(diào)用父類方法 讓敵機在垂直方向運動
super().update()
#2 判斷是否飛出屏幕 如果是 需要將敵機從精靈組刪除
if self.rect.y >= SCREEN_RECT.height:
#print("敵機飛出屏幕")
#將精靈從精靈組中刪除
self.kill()
英雄出場
class Hero(GameSprite):
def init(self):
super().init("/homehandi/桌面/images/life.png",0)
self.bullet = pygame.sprite.Group()
#設置初始位置
self.rect.center =SCREEN_RECT.center
self.rect.bottom =SCREEN_RECT.bottom-120
self.move = False
def update(self):
#super().update()
if not self.move:
self.rect.x += self.speed
else:
self.rect.y += self.speed
#self.rect.y += self.speed
#飛機飛出屏幕
if self.rect.bottom <= 0:
self.rect.y = self.rect.bottom+SCREEN_RECT.height
elif self.rect.y >= SCREEN_RECT.height:
self.rect.y = -self.rect.height
if self.rect.right <= 0:
self.rect.x = self.rect.right+SCREEN_RECT.width
elif self.rect.x >= SCREEN_RECT.width:
self.rect.x = -self.rect.width
def fire(self):
#print("發(fā)射子彈")
for i in (1,2,3):
bullet = Bullet()
bullet.rect.bottom = self.rect.y-i*20
bullet.rect.center = self.rect.center
self.bullet.add(bullet)
子彈精靈
class Bullet(GameSprite):
def __init__(self):
super().__init__("/home//handi桌面/images/bullet1.png",-5)
def update(self):
super().update()
#判斷是否超出屏幕 如果是 從精靈組刪除
if self.rect.bottom < 0:
self.kill()
游戲主類---plane_main
import pygame
from plan_sprites import *
初始化
pygame.mixer.init()
pygame.mixer.music.load("/home/handi/下載/Mark Petrie - Kara Kul.mp3")
播放
pygame.mixer.music.play(loops =-1)
HERO_FIRE_EVENT = pygame.USEREVENT +1
class PlaneGame(object):
def init(self):
#print("游戲初始化")
#1.創(chuàng)建游戲窗口pygame.display.set_mode
self.screen = pygame.display.set_mode(SCREEN_RECT.size)
#2.創(chuàng)建游戲時鐘pygame.time.Clock()
self.clock = pygame.time.Clock()
#3.創(chuàng)建精靈和精靈組內(nèi)容較多 故封裝成一個方法
#調(diào)用創(chuàng)建精靈的方法
self.__creat_sprites()
#以上屬于游戲初始化時候的設置
#4.設置定時器 每隔多少秒創(chuàng)建一個敵機
#pygame.time.set_timer相當于寫了一個定時器 每隔一秒調(diào)用一次
pygame.time.set_timer(CREATE_ENEMY_EVENT,500)
#再寫一個定時器 發(fā)射子彈
pygame.time.set_timer(HERO_FIRE_EVENT,500)
#上面這一步定義了系統(tǒng)每隔0.5秒 調(diào)用一次pygame事件
#下面去事件監(jiān)聽方法里監(jiān)聽事件
def star_game(self):
while True:
# 1 設置幀率
self.clock.tick(200)
# 2 事件監(jiān)聽 主要監(jiān)聽我們鼠標鍵盤的一些事件
self.__event_handler()
# 3 碰撞檢測
self.__check_collide()
# 4 更新精靈和精靈組
self.__update_sprites()
# 5 更新顯示
pygame.display.update()
#以上都是要實時監(jiān)測的肯腕,so寫在循環(huán)里
#每1\60秒就會調(diào)用一次
創(chuàng)建精靈和精靈組
def __creat_sprites(self):
bg1 = Background()
#Ture 就表示是第二張圖片
bg2 = Background(True)
英雄
self.hero = Hero()
self.hero_group = pygame.sprite.Group(self.hero)
self.back_group = pygame.sprite.Group(bg1,bg2)
敵機組
self.enemy_group = pygame.sprite.Group()
事件監(jiān)聽
def __event_handler(self):
for event in pygame.event.get():
#如果某個按鍵按下 對應的值應該會是
keys_pressed = pygame.key.get_pressed()
#控制飛機移動
if keys_pressed[276]:
self.hero.move = False
self.hero.speed = -9
elif keys_pressed[275]:
self.hero.move = False
self.hero.speed = 9
elif keys_pressed[273]:
self.hero.move = True
self.hero.speed = -9
elif keys_pressed[274]:
self.hero.move = True
self.hero.speed = 9
else:
self.hero.speed = 0
if event.type == pygame.QUIT:
self.__game_over()
elif event.type == CREATE_ENEMY_EVENT:
#print("新的敵機產(chǎn)生")
self.enemy_group.add(Enemy())
發(fā)射子彈
elif event.type == HERO_FIRE_EVENT:
self.hero.fire()
更新精靈和精靈組
def __update_sprites(self):
for x in[self.back_group,self.enemy_group,self.hero_group,self.hero.bullet]:
x.update()
x.draw(self.screen)
def __check_collide(self):
碰撞檢測
1.子彈摧毀飛機
第一個參數(shù)和第二個參數(shù)是要參與碰撞檢測的精靈
第三個參數(shù)為Ture的時候 就是當碰撞的時候被碰撞的精靈從精靈組移除
pygame.sprite.groupcollide( self.enemy_group,self.hero.bullet, True, True)#子彈
2.敵機撞毀飛機
enemies = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
#判斷列表時候有內(nèi)容
if len(enemies)>0:
#讓英雄犧牲
self.hero.kill()
#結(jié)束游戲
PlaneGame.__game_over()
@staticmethod
def __game_over():
print("游戲結(jié)束")
#這是pygame提供的卸載模塊功能
pygame.quit()
#這是pygame本身提供的退出腳本的功能
exit()
#需要先卸載pygame模塊 然后退出腳本
if name == "main":
game = PlaneGame()
game.star_game()
以上呢就是我們做這個游戲的完整代碼,通過做這個小游戲有兩個目的:
1.強化面向?qū)ο蟪绦蛟O計
2.體驗使用pygame模塊進行游戲開發(fā)
嗨钥平,說了這么多实撒,還不趕快去試一試 姊途!