目录
1. pygame init()
初始化所有导入的pygame模块
2. 显示可以关闭的空白窗体
import sys
import pygame # 模块导入
pygame.init() # 初始化
screen = pygame.display.set_mode((800, 600)) # 初始化一个800x600的窗体
screen.fill((0, 255, 255)) # 给黑窗口填充颜色
pygame.display.set_caption("pygame小窗口")
while True: # 死循环,使窗口停留
for event in pygame.event.get(): # 获取循环事件,监听事件
if event.type == pygame.QUIT: # 判断是否点击关闭窗口
pygame.quit() # 卸载所有模块
sys.exit() # 退出程序
pygame.display.flip() # 刷新屏幕
3. 给窗体设置标题
pygame.display.set_caption("pygame小窗口")
4.在屏幕上显示文字
my_font = pygame.font.Font("font/simkai.ttf", 30) # 设置字体及大小
text = my_font.render("欢迎来到pygame", True, (0, 0, 255)) # 设置文本,锯齿效果, 颜色
screen.blit(text, (50, 50)) # 放置到窗体50x50的位置
5. 给窗体设置背景
image = pygame.image.load("img/bg.png") # 插入图片
screen.blit(image, (0, 0)) # 设置位置
6. 图片中插入图片
image1 = pygame.image.load("img/player.jpg")
bg_image.blit(image1, (100, 100))
7. 使用精灵展示背景,背景循环
import sys
import pygame
class BaseSprite(pygame.sprite.Sprite):
def __init__(self, name):
super().__init__()
self.image = pygame.image.load(name)
self.rect = self.image.get_rect()
class BgSprite(BaseSprite):
def __init__(self, name, top_left):
super().__init__(name)
self.rect.topleft = top_left
def update(self):
self.rect.top += 5
if self.rect.top >= 700:
self.rect.top = -700
class BgManage:
def __init__(self, gm):
self.gm = gm
self.bg_group = pygame.sprite.Group()
BgSprite("fjdzimg/bg.png", (0, 0)).add(self.bg_group)
BgSprite("fjdzimg/bg.png", (0, -700)).add(self.bg_group)
def update(self):
self.bg_group.update()
self.bg_group.draw(self.gm.screen)
class GameManage:
def __init__(self, name):
pygame.init()
self.clock = pygame.time.Clock()
self.screen = pygame.display.set_mode((400, 600))
pygame.display.set_caption(name)
self.bg_manage = BgManage(self)
def run(self):
while True:
self.clock.tick(24)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
self.bg_manage.update()
pygame.display.flip()
gm = GameManage("飞机大战")
gm.run()
8. 使用精灵显示道具,玩家与道具碰撞检测
import sys
import pygame
import random
class BaseSprite(pygame.sprite.Sprite):
def __init__(self, name):
super().__init__()
self.image = pygame.image.load(name)
self.rect = self.image.get_rect()
class BgSprite(BaseSprite):
def __init__(self, name, top_left):
super().__init__(name)
self.rect.topleft = top_left
def update(self):
self.rect.top += 5
if self.rect.top >= 700:
self.rect.top = -700
class BgManage:
def __init__(self, gm):
self.gm = gm
self.bg_group = pygame.sprite.Group()
BgSprite("fjdzimg/bg.png", (0, 0)).add(self.bg_group)
BgSprite("fjdzimg/bg.png", (0, -700)).add(self.bg_group)
def update(self):
self.bg_group.update()
self.bg_group.draw(self.gm.screen)
class EquipSprite(BaseSprite): # 物资精灵类
def __init__(self, name, speed, type):
super().__init__(name)
self.rect.left = random.randint(0, 400 - self.rect.width)
self.rect.bottom = 0
self.speed = speed
self.equip_bullet_group = pygame.sprite.Group()
self.type = type
def update(self):
self.rect.top += self.speed
class EquipManage: # 物资管理类
def __init__(self, gm):
self.gm = gm
self.equip_group = pygame.sprite.Group()
self.time_count = 5
def generate(self):
odds = random.random()
if odds >= 0.7:
self.equip = EquipSprite("fjdzimg/hp.png", 3, 1000)
self.equip.add(self.equip_group)
if 0.35 <= odds < 0.7:
self.equip = EquipSprite("fjdzimg/bomb_supply.png", 3, 2000)
self.equip.add(self.equip_group)
if odds < 0.35:
self.equip = EquipSprite("fjdzimg/bullet_supply.png", 3, 3000)
self.equip.add(self.equip_group)
def update(self):
self.time_count -= 0.1
if self.time_count <= 0:
self.time_count = 5
self.generate()
self.equip_group.update()
self.equip_group.draw(self.gm.screen)
class PlayerSprite(BaseSprite): # 玩家精灵类
def __init__(self, name, center, gm):
super().__init__(name)
self.gm = gm
self.rect.center = center
self.my_bullet_group = pygame.sprite.Group()
def update(self):
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
self.rect.left -= 5
if key_pressed[pygame.K_RIGHT] and self.rect.right < 500:
self.rect.right += 5
if key_pressed[pygame.K_UP] and self.rect.top > 0:
self.rect.top -= 5
if key_pressed[pygame.K_DOWN] and self.rect.bottom < 700:
self.rect.bottom += 5
self.my_bullet_group.update()
self.my_bullet_group.draw(self.gm.screen)
class PlayerManage: # 玩家管理类
def __init__(self, gm):
self.gm = gm
self.player_group = pygame.sprite.Group()
self.player = PlayerSprite("fjdzimg/my_aircraft1.png", (200, 550), self.gm)
self.player.add(self.player_group)
def update(self):
self.player_group.update()
self.player_group.draw(self.gm.screen)
class GameManage:
def __init__(self, name):
pygame.init()
self.clock = pygame.time.Clock()
self.screen = pygame.display.set_mode((400, 600))
pygame.display.set_caption(name)
self.bg_manage = BgManage(self)
self.equip_manage = EquipManage(self)
self.player_manage = PlayerManage(self)
def run(self):
while True:
self.clock.tick(24)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
self.bg_manage.update()
self.equip_manage.update()
self.player_manage.update()
pygame.sprite.groupcollide(self.player_manage.player_group, self.equip_manage.equip_group, False, True)
pygame.display.flip()
gm = GameManage("飞机大战")
gm.run()
9. ui的使用 (字体,鼠标点击检测)
import sys
import pygame
import random
class Util: # 点击类
@staticmethod
def click_check(sprite):
if pygame.mouse.get_pressed()[0]:
if sprite.rect.collidepoint(pygame.mouse.get_pos()):
return True
return False
class BaseSprite(pygame.sprite.Sprite):
def __init__(self, name):
super().__init__()
self.image = pygame.image.load(name)
self.rect = self.image.get_rect()
class BgSprite(BaseSprite):
def __init__(self, name, top_left):
super().__init__(name)
self.rect.topleft = top_left
def update(self):
self.rect.top += 5
if self.rect.top >= 700:
self.rect.top = -700
class BgManage:
def __init__(self, gm):
self.gm = gm
self.bg_group = pygame.sprite.Group()
BgSprite("fjdzimg/bg.png", (0, 0)).add(self.bg_group)
BgSprite("fjdzimg/bg.png", (0, -700)).add(self.bg_group)
def update(self):
self.bg_group.update()
self.bg_group.draw(self.gm.screen)
class EquipSprite(BaseSprite): # 物资精灵类
def __init__(self, name, speed, type):
super().__init__(name)
self.rect.left = random.randint(0, 400 - self.rect.width)
self.rect.bottom = 0
self.speed = speed
self.equip_bullet_group = pygame.sprite.Group()
self.type = type
def update(self):
self.rect.top += self.speed
class EquipManage: # 物资管理类
def __init__(self, gm):
self.gm = gm
self.equip_group = pygame.sprite.Group()
self.time_count = 5
def generate(self):
odds = random.random()
if odds >= 0.7:
self.equip = EquipSprite("fjdzimg/hp.png", 3, 1000)
self.equip.add(self.equip_group)
if 0.35 <= odds < 0.7:
self.equip = EquipSprite("fjdzimg/bomb_supply.png", 3, 2000)
self.equip.add(self.equip_group)
if odds < 0.35:
self.equip = EquipSprite("fjdzimg/bullet_supply.png", 3, 3000)
self.equip.add(self.equip_group)
def update(self):
self.time_count -= 0.1
if self.time_count <= 0:
self.time_count = 5
self.generate()
self.equip_group.update()
self.equip_group.draw(self.gm.screen)
class PlayerSprite(BaseSprite): # 玩家精灵类
def __init__(self, name, center, gm):
super().__init__(name)
self.gm = gm
self.rect.center = center
self.my_bullet_group = pygame.sprite.Group()
def update(self):
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
self.rect.left -= 5
if key_pressed[pygame.K_RIGHT] and self.rect.right < 500:
self.rect.right += 5
if key_pressed[pygame.K_UP] and self.rect.top > 0:
self.rect.top -= 5
if key_pressed[pygame.K_DOWN] and self.rect.bottom < 700:
self.rect.bottom += 5
self.my_bullet_group.update()
self.my_bullet_group.draw(self.gm.screen)
class PlayerManage: # 玩家管理类
def __init__(self, gm):
self.gm = gm
self.player_group = pygame.sprite.Group()
def born(self):
self.player = PlayerSprite("fjdzimg/my_aircraft1.png", (200, 550), self.gm)
self.player.add(self.player_group)
def update(self):
self.player_group.update()
self.player_group.draw(self.gm.screen)
class UISprite(BaseSprite): # ui精灵类
def __init__(self, name, center):
super().__init__(name)
self.rect.center = center
class UIManage: # ui管理类
def __init__(self, gm):
self.gm = gm
# 开始
self.ready_group = pygame.sprite.Group()
self.begin_btn = UISprite("fjdzimg/ks.png", (200, 300))
self.begin_btn.add(self.ready_group)
# 重开
# 退出
self.end_group = pygame.sprite.Group()
self.replay_btn = UISprite("fjdzimg/again.png", (200, 250))
self.replay_btn.add(self.end_group)
self.exit_btn = UISprite("fjdzimg/exit.png", (200, 350))
self.exit_btn.add(self.end_group)
def update(self):
if self.gm.state == "ready":
self.ready_group.draw(self.gm.screen)
if Util.click_check(self.begin_btn):
self.gm.state = "gaming"
self.gm.player_manage.born()
elif self.gm.state == "gaming":
pass
elif self.gm.state == "end":
self.end_group.draw(self.gm.screen)
if Util.click_check(self.replay_btn):
self.gm.state = "gaming" # 状态设为gaming 重新开始
self.gm.player_manage.born()
if Util.click_check(self.exit_btn):
pygame.quit()
sys.exit()
class GameManage:
def __init__(self, name):
pygame.init()
self.state = "ready"
self.clock = pygame.time.Clock()
self.screen = pygame.display.set_mode((400, 600))
self.screen.fill("#FFFACD")
pygame.display.set_caption(name)
self.bg_manage = BgManage(self)
self.equip_manage = EquipManage(self)
self.player_manage = PlayerManage(self)
self.ui_manage = UIManage(self)
def run(self):
while True:
self.clock.tick(24)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYUP:
if event.key == pygame.K_SPACE:
self.state = "end"
self.equip_manage.equip_group.empty()
self.player_manage.player_group.empty()
self.screen.fill("#B0E0E6")
self.ui_manage.update()
if self.state == "gaming":
self.bg_manage.update()
self.equip_manage.update()
self.player_manage.update()
pygame.sprite.groupcollide(self.player_manage.player_group, self.equip_manage.equip_group, False, True)
pygame.display.flip()
gm = GameManage("飞机大战")
gm.run()