實(shí)戰(zhàn)項(xiàng)目:大戰(zhàn)外星人
pygame是跨平臺(tái)Python模塊醇锚,專(zhuān)為電子游戲設(shè)計(jì)续膳,包含圖像、聲音胖替,建立在SDL(Simple DirectMedia Layer)基礎(chǔ)上
一研儒、pygame各模塊和功能
在某些平臺(tái)下,有些功能可能沒(méi)有独令,可用None測(cè)試
if pygame.cdrom is None:
print "pygame.cdrom not available"
模塊名 | 功能 |
---|---|
pygame.cdrom | 訪問(wèn)光驅(qū) |
pygame.cursors | 加載光標(biāo) |
pygame.display | 訪問(wèn)顯示設(shè)備 |
pygame.draw | 繪制形狀端朵、線和點(diǎn) |
pygame.event | 管理事件 |
pygame.font | 使用字體 |
pygame.image | 加載和存儲(chǔ)圖片 |
pygame.joystick | 使用游戲手柄或類(lèi)似設(shè)置 |
pygame.key | 讀取鍵盤(pán)按鍵 |
pygame.mixer | 聲音 |
pygame.mouse | 鼠標(biāo) |
pygame.movie | 播放視頻 |
pygame.music | 播放音頻 |
pygame.overlay | 訪問(wèn)高級(jí)視頻疊加 |
pygame.rect | 管理矩形區(qū)域 |
pygame.sndarray | 操作聲音數(shù)據(jù) |
pygame.sprite | 操作移動(dòng)圖像 |
pygame.surface | 管理圖像和屏幕 |
pygame.surfarray | 管理點(diǎn)陣圖像數(shù)據(jù) |
pygame.time | 管理時(shí)間和幀信息 |
pygame.transform | 綻放和移動(dòng)圖像 |
二、創(chuàng)建Pygame窗口
import sys
import pygame
def run_game():
pygame.init()
screen = pygame.display.set_mode((1200,800))
pygame.display.set_caption("大戰(zhàn)外星人")
bg_color = (230,230,230)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(bg_color)
pygame.display.flip()
run_game()
pygame.init():初始化游戲并創(chuàng)建一個(gè)屏幕對(duì)像
screen = pygame.display.set_mode((1200,800)):創(chuàng)建一個(gè)顯示窗口燃箭,游戲的所有圖形元素都獎(jiǎng)在其中繪制冲呢,(1200,800)元組實(shí)參決定窗口的尺寸(寬1200高800)
pygame.display.set_caption("大戰(zhàn)外星人"):設(shè)置窗口標(biāo)題
pygame.event.get():接收用戶(hù)輸入事件(按鍵和移動(dòng)鼠標(biāo))
screen.fill(bg_color):設(shè)置背景顏色
pygame.display.flip():命令Pygame讓最近繪制的屏幕可見(jiàn),不斷刷新屏幕招狸,以顯示元素的位置敬拓,并在原來(lái)的位置隱藏元素,從而營(yíng)造平滑移動(dòng)的效果裙戏。
三乘凸、創(chuàng)建飛船
加載一幅圖像,再使用Pygame方法blit()繪制
import pygame
class Ship():
def __init__(self, screen):
self.screen = screen
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.screcn_rect.bottom
def blitme(self):
self.screen.blit(self.image, self.rect)
self.image = pygame.image.load() :加載飛船圖片累榜,并存儲(chǔ)到self.image中
get_rect():獲取圖像的屬性rect营勤,python能夠像處理矩形(rect對(duì)象)一樣處理圖像,處理rect對(duì)象時(shí)壹罚,可使用矩形四角(left,right,bottom,top)冀偶、坐標(biāo)(x,y)和中心的x(centerx)和y(centery)坐標(biāo),來(lái)指矩形的位置渔嚷。
self.screen.blit(self.image, self.rect):根據(jù)rect指定的位置將圖像繪制到飛屏幕上进鸠。
四、駕駛飛船
def check_events(ship):
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
ship.rect.centerx += 1
elif event.key == pygame.K_LEFT:
ship.rect.centerx -= 1
pygame.KEYDOWN:按下形病;pygame.KEYUP:彈起
** pygame.K_RIGHT:向右鍵客年; pygame.K_LEFT**:向左鍵
擴(kuò)展飛船功能:
1霞幅、允許不斷移動(dòng)
2、限制飛船的活動(dòng)范圍(不能超出屏幕)
五量瓜、飛船開(kāi)炮
1司恳、炮彈
class Bullet(Sprite):
def __init__(self, ai_settings, screen, ship):
super(Bullet,self).__init__()
self.screen = screen
self.rect = pygame.rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)
self.rect.centerx = ship.rect.centerx
self.rect.top = ship.rect.top
self.y = float(self.rect.y)
self.color = ai_settings.bullet_color
self.speed_factor = ai_settings.bullet_speed_factor
def update(self):
self.y -= self.speed_factor
self.rect.y = self.y
def draw_bullet(self):
pygam.draw.rect(self.screen, self.color, self.rect)
super(Bullet,self).init():Python2.7語(yǔ)法,也適用Python3绍傲,但Python3可以簡(jiǎn)寫(xiě)為:super()._init_()
pygame.rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height):創(chuàng)建矩形扔傅,第一個(gè)實(shí)參指定左上角x坐標(biāo),第二實(shí)參指定左上角y坐標(biāo)烫饼,第三實(shí)參指定矩形的寬猎塞,第四實(shí)參指定矩形的高度
self.rect.centerx = ship.rect.centerx和self.rect.top = ship.rect.top:調(diào)整矩形的位置
def update(self):向上移動(dòng)炮彈
pygam.draw.rect(self.screen, self.color, self.rect):使用self.color填充表示子彈的rect,并繪制到screen
2. 創(chuàng)建外星人
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
def __init__(selft, ai_settings, screen):
super().__init__()
self.screen = screen
self.ai_settings = ai_settings
self.image = pygame.image.load('image/alien.bmp')
self.rect = self.image.get_rect()
self.rect.x = self.rect.width
selft.rect.y = self.rect.height
self.x = float(self.rect.x)
def upate(self):
self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)
self.rect.x = self.x
def check_edges(self):
screen_rect = self.screen.get_rect()
if self.rect.right >= screen.right:
return True
elif self.rect.left <= 0:
return True
def blitme(self):
self.screen.blit(self.image, self.rect)
外星人默認(rèn)在屏幕左上方位置杠纵,并向右邊移動(dòng)荠耽,除了位置不同外,大部分與Ship類(lèi)相似
fleet_direction:控制外星人向左向右移動(dòng)比藻,如果到最右邊铝量,向下移動(dòng)并向左邊移動(dòng),如果到最左邊银亲,向下移動(dòng)并向右邊移動(dòng)
check_edges:檢查外星人是否到屏幕邊緣
3.創(chuàng)建多行外星人
def create_fleet(ai_settings, screen, ship, aliens):
alien = Alien(ai_settings,screen)
alien_widht = alien.rect.widht
availabe_width = screen.width -(2 * alien_width)
number_alien_x = available_width /(2 * alien_widht)
alien_height = alien.rect.height
availabled_height = aline.screen.height
- (3 * alien_height) - ship.height
number_alien_y = availabled_height / (2 *availabled_height )
for m in range(number_alien_y):
form n in range(number_alien_x):
aline = Alien(ai_settings, screen)
alien.x = aline_width +2 * alien_widht * n
alien.y = aline_height + 2 * alien_height* m
alien.rect.x = alien.x
alien.rect.y = alien.y
aliens.add(alien)
4.射殺外星人
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
遍歷組子彈組和外星人組慢叨,當(dāng)有子彈和外星人的rect重疊時(shí),groupcollid()在它返回的字典中添加一個(gè)鍵值對(duì)务蝠,兩個(gè)實(shí)參True告訴python刪除發(fā)碰撞的子彈和外星人
5. 結(jié)束游戲
創(chuàng)建游戲統(tǒng)計(jì)信息類(lèi):
class GameStats():
def __init__(self, ai_settings):
self.ai_setting = ai_settings
self.game_active = True
self.reset_stats()
def reset_stats(self):
self.ship_left = self.ai_settings.ship_limit
外星人撞到飛船或外得人到達(dá)屏幕底部時(shí)拍谐,需結(jié)束游戲
pygame.sprite.spritecollideany(ship,alines):檢查外星人和飛船是否相撞,檢查編組是否有成員開(kāi)發(fā)業(yè)有靈發(fā)生碰撞请梢,并在找到與精靈發(fā)生碰撞的成員后停止遍歷,并返回找到的第一個(gè)發(fā)生碰撞的外星人力穗,如果沒(méi)有發(fā)生碰撞毅弧,返回None
def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):
aliens.empty()
bullets.empty()
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
if stats.ship_left > 0:
stats.ship_left -= 1
sleep(0.5)
else:
stats.game_active = False
def check_alien_bottom(ai_settings, stats, screen, ship, aliens, bullets):
screen_rect = screen.get_rect()
for alien in aliens.sprites():
if alien.rect.bottom >= screen_rect.bottom:
ship_hit(ai_settings, stats,screen, ship,aliens,bullets)
break
第十四章 記分
添加Play按鈕
import pygame.font
class Button():
def __init__(self,ai_settings, screen, msg):
self.screen = screen
self.screct_rect = screen.get_rect()
self.width, self.height = 200,50
self.color = (0,250,0)
self.text_color = (255,255,255)
self.font = pygame.font.SysFont(None,48)
self.rect = pygmae.Rect(0,0,self.width,self.height)
self.rect.center = self.screen_rect.center
self.prep_msg(msg)
def prep_msg(self, msg):
self.msg_img = self.font.render(msg, True, self.text_color,self.color)
self.msg_image_rect = self.msg_img.get_rect()
self.msg_image_rect.center = self.rect.center
def draw_button(self):
self.screen.fill(self.color,self.rect)
self.screen.blit(self.msg_img,self.msg_image_rect)
pygame.font讓pygame能夠?qū)⑽谋句秩镜狡聊簧?br> **pygame.font.SysFont(None,48)
**:指定使用什么字體來(lái)渲染文本,實(shí)參None讓python使用默認(rèn)字體当窗,48指定文本的字號(hào)
font.render():將存儲(chǔ)在msg中的文本轉(zhuǎn)換為圖像够坐,然后將圖像存儲(chǔ)中msg_img中,實(shí)參True指定開(kāi)啟反鋸齒功能崖面,剩下兩個(gè)分別是文本顏色和背景色
self.screen.fill():表示按鈕的矩形元咙,再調(diào)用一次screen.blit(),并向它傳遞一幅圖像與該圖像的關(guān)聯(lián)和rect對(duì)象
按鈕點(diǎn)擊事件
def check_play_button(ai_settings,screen, stats,ship,bullets,aliens, play_button,mouse_x,mouse_y):
button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y)
if button_clicked and not stats.game_active:
pygame.mouse.set_visible(False)
stats.game_active = True
stats.reset_stats()
aliens.empty()
bullets.empty()
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
**pygame.mouse.set_visible(False)
**:隱藏鼠標(biāo)
記分
顯示飛船數(shù)prep_ship()巫员,當(dāng)前得分prep_score()庶香,當(dāng)前等級(jí)prep_level()
import pygame.font
from ship import Ship
from pygame.sprite import Group
class Scoreboard():
def __init__(self, ai_settings, screen, stats):
self.screen = screen
self.screen_rect = screen.get_rect()
self.ai_settings = ai_settings
self.stats = stats
self.text_color = (30, 30, 30)
self.font = pygame.font.SysFont(None,48)
self.prep_score()
self.prep_level()
self.prep_ship()
def prep_score(self):
score_str = 'Scroe:' + str(self.stats.score)
self.msg_img = self.font.render(score_str, True, self.text_color,self.ai_settings.bg_color)
self.msg_image_rect = self.msg_img.get_rect()
self.msg_image_rect.right = self.screen_rect.right - 20
self.msg_image_rect.top = 20
def prep_level(self):
level_str = 'Level:'+str(self.stats.play_level)
self.level_img = self.font.render(level_str,True, self.text_color,self.ai_settings.bg_color)
self.level_img_rect = self.level_img.get_rect()
self.level_img_rect.right = self.screen_rect.right - 20
self.level_img_rect.top = 50
def prep_ship(self):
self.ships = Group()
for num in range(self.stats.ship_left):
ship = Ship(self.ai_settings, self.screen)
ship.rect.x = 10 + num * ship.rect.width
ship.rect.y = 10
self.ships.add(ship)
附代碼:
settings類(lèi)
class Settings():
"""存儲(chǔ)所有設(shè)置的類(lèi)"""
def __init__(self):
"""初始化游戲的設(shè)置"""
#屏幕設(shè)置
self.screen_width = 800
self.screen_height = 600
self.bg_color = (230,230,230)
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60,60,60
self.bullets_allowed = 100
self.space_x = 1
self.fleet_direction=1
self.fleet_drop_speed=20
self.speedup_scale =1.1
self.ship_limit = 3
self.init_dynamic_settings()
def init_dynamic_settings(self):
self.bullet_speed_factor = 1
self.alien_speed_factor = 1
self.ship_speed_factor = 1
def increase_speed(self):
self.ship_speed_factor *= self.speedup_scale
self.bullet_speed_factor *= self.speedup_scale
self.alien_speed_factor *= self.speedup_scale
ship類(lèi)
import pygame
from pygame.sprite import Sprite
class Ship(Sprite):
def __init__(self,ai_settings,screen):
super().__init__()
""""初始化飛船并設(shè)置其初始位置"""
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
# 移動(dòng)標(biāo)志
self.moving_right = False
self.moving_left = False
# 一直開(kāi)火
self.keeping_fire = False
def update(self):
"""根據(jù)移動(dòng)標(biāo)志調(diào)整飛船的位置 """
if self.moving_right and self.rect.right < self.screen_rect.right:
self.rect.centerx += self.ai_settings.ship_speed_factor
if self.moving_left and self.rect.left > 0:
self.rect.centerx -= self.ai_settings.ship_speed_factor
def blitme(self):
"""在指定位置繪制飛船"""
self.screen.blit(self.image,self.rect)
def center_ship(self):
self.rect.centerx = self.screen_rect.centerx
Bullet類(lèi)
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
""""一個(gè)對(duì)飛船發(fā)射子彈進(jìn)行管理的類(lèi)"""
def __init__(self,ai_settings, screen, ship):
""""在飛船所處的位置創(chuàng)建一個(gè)子彈對(duì)象"""
super(Bullet, self).__init__()
self.screen = screen
self.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)
self.rect.centerx = ship.rect.centerx
self.rect.top = ship.rect.top
self.y = float(self.rect.y)
self.color = ai_settings.bullet_color
self.speed_factor = ai_settings.bullet_speed_factor
def update(self):
"""向上移動(dòng)子彈"""
#更新表示子彈的小數(shù)值
self.y -= self.speed_factor
#更新表示子彈的rect的位置
self.rect.y = self.y
def draw_bullet(self):
"""在屏幕上繪制子彈"""
pygame.draw.rect(self.screen, self.color, self.rect)
Alien類(lèi)
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
def __init__(self,ai_settings,screen):
super(Alien,self).__init__();
self.screen = screen
self.ai_settings = ai_settings
self.image = pygame.image.load('images/alien.bmp')
self.rect = self.image.get_rect()
self.rect.x = self.rect.width
self.rect.y = self.rect.height
self.x = float(self.rect.x)
def update(self):
self.x += (self.ai_settings.alien_speed_factor *
self.ai_settings.fleet_direction)
self.rect.x = self.x
def blitme(self):
self.screen.blit(self.image,self.rect)
def check_edges(self):
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right or self.rect.left <= screen_rect.left :
return True
else:
return False
公共控制模塊
import sys
import time
import pygame
from time import sleep
from bullet import Bullet
from alien import Alien
def check_events(ai_settings,stats, screen,ship,bullets,aliens,play_button):
"""響應(yīng)按鍵和鼠標(biāo)事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_down_events(event, ai_settings, screen, ship, bullets)
elif event.type == pygame.KEYUP:
check_up_events(event, ai_settings, screen, ship, bullets)
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x,mouse_y = pygame.mouse.get_pos()
check_play_button(ai_settings,screen,stats,ship,bullets,aliens, play_button,mouse_x,mouse_y)
def check_down_events(event,ai_settings,screen,ship,bullets):
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
ship.keeping_fire = True
fire_bullet(ai_settings, screen, ship, bullets)
def check_up_events(event, ai_settings, screen, ship, bullets):
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
elif event.key == pygame.K_SPACE:
ship.keeping_fire = False
def update_screen(ai_settings, stats, screen, ship, aliens, bullets, play_button, sb):
"""更新屏幕上的圖像,并切換到新屏幕"""
# 重繪屏幕
screen.fill(ai_settings.bg_color)
# 在飛船和外星人后面重繪所有子彈
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
aliens.draw(screen)
sb.show_score_board()
if not stats.game_active:
play_button.draw_button()
# 讓最近繪制的屏幕可見(jiàn)
pygame.display.flip()
def update_bullets(ai_settings,screen, ship, aliens, bullets,stats, sb):
bullets.update()
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
collissions = pygame.sprite.groupcollide(bullets, aliens ,True, True)
if collissions:
stats.score += 1
sb.prep_score()
if len(aliens) == 0:
stats.play_level += 1
sb.prep_level()
bullets.empty()
ai_settings.increase_speed()
create_fleet(ai_settings,screen,ship,aliens)
def fire_bullet(ai_settings, screen, ship, bullets):
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
def get_number_aliens_x(ai_settings, alien_width):
available_space_x = ai_settings.screen_width - 2 * alien_width
number_aliens_x = int(available_space_x / (2 * alien_width))
return number_aliens_x
def get_number_rows(ai_settings, ship_height, alien_height):
available_space_y = ai_settings.screen_height - 3 * alien_height - ship_height
number_rows = int(available_space_y /(2 * alien_height))
return number_rows
def create_alien(ai_settings, screen, aliens, alien_number, row_number):
alien = Alien(ai_settings, screen)
alien.x = alien.rect.width + 2 * alien.rect.width * alien_number
alien.rect.x = alien.x
alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
aliens.add(alien)
def create_fleet(ai_settings, screen, ship, aliens):
alien = Alien(ai_settings, screen)
number_aliens_x = get_number_aliens_x(ai_settings,alien.rect.width)
number_rows = get_number_rows(ai_settings, ship.rect.height, alien.rect.height)
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
create_alien(ai_settings, screen, aliens, alien_number, row_number)
def update_aliens(ai_settings,stats,screen,ship,aliens, bullets,sb):
check_fleet_edges(ai_settings, aliens)
aliens.update()
if pygame.sprite.spritecollideany(ship, aliens):
ship_hit(ai_settings, stats, screen, ship, aliens, bullets,sb)
check_alien_bottom(ai_settings, stats, screen, ship, aliens, bullets,sb)
def check_fleet_edges(ai_settings, aliens):
for alien in aliens.sprites():
if alien.check_edges():
change_fleet_direction(ai_settings, aliens)
break
def change_fleet_direction(ai_settings, aliens):
for alien in aliens.sprites():
alien.rect.y += ai_settings.fleet_drop_speed
ai_settings.fleet_direction *= -1
def ship_hit(ai_settings, stats, screen, ship, aliens, bullets,sb):
aliens.empty()
bullets.empty()
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
if stats.ship_left > 0:
stats.ship_left -= 1
sb.prep_ship()
sleep(0.5)
else:
stats.game_active = False
pygame.mouse.set_visible(True)
def check_alien_bottom(ai_settings, stats, screen, ship, aliens, bullets,sb):
screen_rect = screen.get_rect()
for alien in aliens.sprites():
if alien.rect.bottom >= screen_rect.bottom:
ship_hit(ai_settings, stats,screen, ship,aliens,bullets,sb)
break
def check_play_button(ai_settings,screen, stats,ship,bullets,aliens, play_button,mouse_x,mouse_y):
button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y)
if button_clicked and not stats.game_active:
pygame.mouse.set_visible(False)
stats.game_active = True
stats.reset_stats()
aliens.empty()
bullets.empty()
create_fleet(ai_settings, screen, ship, aliens)
ship.center_ship()
Button類(lèi)
import pygame.font
class Button():
def __init__(self,ai_settings, screen, msg):
self.screen = screen
self.screen_rect = screen.get_rect()
self.width, self.height = 200,50
self.color = (0,250,0)
self.text_color = (255,255,255)
self.font = pygame.font.SysFont(None,48)
self.rect = pygame.Rect(0,0,self.width,self.height)
self.rect.center = self.screen_rect.center
self.prep_msg(msg)
def prep_msg(self, msg):
self.msg_img = self.font.render(msg, True, self.text_color,self.color)
self.msg_image_rect = self.msg_img.get_rect()
self.msg_image_rect.center = self.rect.center
def draw_button(self):
self.screen.fill(self.color,self.rect)
self.screen.blit(self.msg_img,self.msg_image_rect)
記分類(lèi)
import pygame.font
from ship import Ship
from pygame.sprite import Group
class Scoreboard():
def __init__(self, ai_settings, screen, stats):
self.screen = screen
self.screen_rect = screen.get_rect()
self.ai_settings = ai_settings
self.stats = stats
self.text_color = (30, 30, 30)
self.font = pygame.font.SysFont(None,48)
self.prep_score()
self.prep_level()
self.prep_ship()
def prep_score(self):
score_str = 'Scroe:' + str(self.stats.score)
self.msg_img = self.font.render(score_str, True, self.text_color,self.ai_settings.bg_color)
self.msg_image_rect = self.msg_img.get_rect()
self.msg_image_rect.right = self.screen_rect.right - 20
self.msg_image_rect.top = 20
def prep_level(self):
level_str = 'Level:'+str(self.stats.play_level)
self.level_img = self.font.render(level_str,True, self.text_color,self.ai_settings.bg_color)
self.level_img_rect = self.level_img.get_rect()
self.level_img_rect.right = self.screen_rect.right - 20
self.level_img_rect.top = 50
def prep_ship(self):
self.ships = Group()
for num in range(self.stats.ship_left):
ship = Ship(self.ai_settings, self.screen)
ship.rect.x = 10 + num * ship.rect.width
ship.rect.y = 10
self.ships.add(ship)
def show_score_board(self):
#self.screen.fill(self.text_color,self.rect)
self.screen.blit(self.msg_img,self.msg_image_rect)
self.screen.blit(self.level_img,self.level_img_rect)
self.ships.draw(self.screen)
游戲狀態(tài)類(lèi)
class GameStats():
def __init__(self, ai_settings):
self.ai_settings = ai_settings
self.reset_stats()
self.game_active = False
self.play_level = 1
self.reset_stats()
def reset_stats(self):
self.ship_left = self.ai_settings.ship_limit
self.score = 0
主程序
import sys
import pygame
from pygame.sprite import Group
from settings import Settings
from ship import Ship
from gamestats import GameStats
from button import Button
from scoreboard import Scoreboard
import game_functions as gf
def run_game():
# 初始化背景設(shè)置
pygame.init()
ai_settings=Settings()
stats = GameStats(ai_settings)
# 創(chuàng)建顯示窗口
screen = pygame.display.set_mode(
(ai_settings.screen_width,ai_settings.screen_height))
# 設(shè)置窗口標(biāo)題
pygame.display.set_caption('Alien Invasion')
sb = Scoreboard(ai_settings,screen,stats)
#創(chuàng)建一艘飛船
ship = Ship(ai_settings, screen)
play_button = Button(ai_settings, screen, 'Play')
bullets = Group()
aliens = Group()
while True:
# 處理事件
gf.check_events(ai_settings,stats, screen,ship,bullets,aliens,play_button)
if stats.game_active:
ship.update()
gf.update_aliens(ai_settings, stats, screen,ship,aliens, bullets,sb)
gf.update_bullets(ai_settings,screen, ship, aliens,bullets,stats,sb)
gf.update_screen(ai_settings,stats,screen,ship,aliens,bullets,play_button,sb)
run_game()
總結(jié)
1简识、屏幕創(chuàng)建
pygame.init()#初始化
screen = pygame.display.set_mode(width, height) #設(shè)置尺寸
screen_rect = screen.get_rect() #獲取屏幕矩形位置
pygame.display.set_caption('xx') #設(shè)置標(biāo)題
screen.fill(bg_color) #(230,230,230)
pygame.display.flip()# 讓最近繪制的屏幕可見(jiàn)
2赶掖、響應(yīng)事件(鍵盤(pán)鼠標(biāo))
#捕捉所有事件
for event in pygame.event.get():
#按下
if event.type == pygame.KEYDOWN:
#按下什么鍵
if event.key = pygame.K_RIGHT:
elif event.key == pygame.K_LEFT:
#彈起
elif event.type == pygame.KEYUP:
#鼠標(biāo)按下
elif event.type == pygame.MOUSEDONW:
3感猛、讀取圖片并顯示到屏幕
image = pygame.image.load('image_path') #從文件讀取圖片
img_rect = image.get_rect()
#定位
img_rect.centerx = screen_rect.cetnerx
img_rect.bottom = screen_rect.bottom
#獲取長(zhǎng)高度
img_width = img_rect.width
img_height = img_rect.height
#按指定位置顯示到屏幕
screen.blit(image,img_rect)
4、顯示按鈕奢赂,并響應(yīng)按下操作
#按鈕背景
self.width,self.height = 200,50
self.bg_color = (0,250,0)
self.rect = pygame.Rect(0,0,self.width,self.height)
self.screen.fill(self.bg_color,self.rect)
#按鈕字體字號(hào)
self.text_color = (255, 255, 255)
self.font = pygame.font.SysFont(None,48)
#將文本轉(zhuǎn)換為圖像
btn_img= self.font.render(str,True, self.text_color, self.bg_color )
btn_rect = btn_img.get_rect()
btn_rect .center = self.rect.center
self.screen.blit(btn_img,btn_rect )
#按下
#獲取鼠標(biāo)位置
mouse_x,mouse_y = pygame.mouse.get_pos()
#檢查是否按在按鈕上面
clicked = play_button.rect.collidepoint(mouse_x,mouse_y)
5陪白、顯示文字
self.font = pygame.font.SysFont(None,48)
text_img = self.font.render(text, True,self.text_color, self.bg_color)
text_rect = text_img.get_rect()
screen.blit(text_img,text_rect)
6、pygame方法
#檢查精靈和精精靈編組是否相撞
pygame.sprite.spritecollideany(ship,aliens)
#刪除相撞的物體膳灶,返回鍵值對(duì)
collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)