1.一个可以关闭的空白窗体
import sys
import pygame
# 初始化模块
pygame.init()
# 使用set_mode 初始化窗体大小 并且返回Surface(表面) 面(可以绘制的范围)
# 创建一个面
screen = pygame.display.set_mode((600, 600))
while True:
# 返回的为列表 列表中为实例(事件) 所以可以遍历
# print(pygame.event.get())
for event in pygame.event.get():
# QUIT == 256 关闭事件
if event.type == pygame.QUIT:
# 关闭窗口
pygame.quit()
# 退出系统
sys.exit()
2. 使用精灵显示背景, 背景的循环展示
# 2. 使用精灵显示背景, 背景的循环展示
import pygame
import sys
class BaseSprite(pygame.sprite.Sprite):
def __init__(self, name):
super().__init__()
self.image = pygame.image.load(name)
self.rect = self.image.get_rect()
def update(self):
pass
# 背景精灵
class BGSprite(BaseSprite):
def __init__(self, name, top_left):
# 初始化父类, 并传入实例
super().__init__(name)
self.rect.topleft = top_left
def update(self):
# 背景向下移动, 实现背景的循环
self.rect.top += 3
if self.rect.top >= 700:
self.rect.top = -700
# 背景管理
class BGManage:
def __init__(self, gm):
# 引用下方的GameManage,从而进一步引用GameManage中的数据
self.gm = gm
# 背景组
self.bg_group = pygame.sprite.Group()
# 加入背景图, 并添加到背景组中
BGSprite("images/background.png", (0, 0)).add(self.bg_group)
BGSprite("images/background.png", (0, -700)).add(self.bg_group)
# 更新, 每当下方的update运行一次, 这个update就会执行一次
def update(self):
self.bg_group.update()
self.bg_group.draw(self.gm.screen)
class GameManage:
def __init__(self):
pygame.init()
# 添加窗体
self.screen = pygame.display.set_mode((480, 700))
# 添加背景管理实例
self.gm_manage = BGManage(self)
# 设置帧率
self.clock = pygame.time.Clock()
def run(self):
while True:
# 一秒执行20次
self.clock.tick(20)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 此处的update执行一次, 上方背景管理中的update就执行一次
self.gm_manage.update()
pygame.display.flip()
gm = GameManage()
gm.run()
3. 使用精灵玩家,玩家可以移动
# 2. 使用精灵显示背景, 背景的循环展示
import pygame
import sys
class BaseSprite(pygame.sprite.Sprite):
def __init__(self, name):
super().__init__()
self.image = pygame.image.load(name)
self.rect = self.image.get_rect()
def update(self):
pass
class BGSprite(BaseSprite):
def __init__(self, name, top_left):
# 初始化父类, 并传入实例
super().__init__(name)
self.rect.topleft = top_left
def update(self):
# 背景向下移动, 实现背景的循环
self.rect.top += 3
if self.rect.top >= 700:
self.rect.top = -700
class PlayerSprite(BaseSprite):
def __init__(self, name, center, speed, gm):
super().__init__(name)
self.gm = gm
self.rect.center = center
# 移动速度
self.speed = speed
def update(self):
# 上下左右移动
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
self.rect.left -= self.speed
if key_pressed[pygame.K_RIGHT] and self.rect.right < 480:
self.rect.left += self.speed
if key_pressed[pygame.K_UP] and self.rect.top > 0:
self.rect.top -= self.speed
if key_pressed[pygame.K_DOWN] and self.rect.bottom < 700:
self.rect.top += self.speed
class PlayerManage:
def __init__(self, gm):
# 引用下方的GameManage,从而进一步引用GameManage中的数据
self.gm = gm
# 添加玩家管理
self.player_group = pygame.sprite.Group()
# 加入玩家精灵,并将其添加到玩家组中
self.player_sprite = PlayerSprite("images/me1.png", (180, 600), 5, self.gm)
self.player_sprite.add(self.player_group)
def update(self):
self.player_group.draw(self.gm.screen)
self.player_group.update()
class BGManage:
def __init__(self, gm):
# 引用下方的GameManage,从而进一步引用GameManage中的数据
self.gm = gm
# 背景组
self.bg_group = pygame.sprite.Group()
# 加入背景图, 并添加到背景组中
BGSprite("images/background.png", (0, 0)).add(self.bg_group)
BGSprite("images/background.png", (0, -700)).add(self.bg_group)
# 更新, 每当下方的update运行一次, 这个update就会执行一次
def update(self):
self.bg_group.update()
self.bg_group.draw(self.gm.screen)
class GameManage:
def __init__(self):
pygame.init()
# 添加窗体
self.screen = pygame.display.set_mode((480, 700))
# 添加背景管理实例
self.gm_manage = BGManage(self)
# 添加玩家管理实例
self.player_manage = PlayerManage(self)
# 设置帧率
self.clock = pygame.time.Clock()
def run(self):
while True:
# 一秒执行20次
self.clock.tick(20)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 此处的update执行一次, 上方背景管理中的update就执行一次
self.gm_manage.update()
self.player_manage.update()
pygame.display.flip()
gm = GameManage()
gm.run()
4. 使用精灵显示道具,玩家与道具碰撞检测
import pygame
import sys
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()
def update(self):
pass
class PropSprite(BaseSprite):
def __init__(self, name, speed, type):
super().__init__(name)
self.speed = speed
# 道具的类型
self.type = type
self.rect.left = random.randint(0, 480 - self.rect.width)
self.rect.bottom = 0
def update(self):
# 道具掉落速度
self.rect.top += self.speed
# 出框后的清除
if self.rect.top >= 700:
self.kill()
class PropManage:
def __init__(self, gm):
self.gm = gm
# 道具管理
self.prop_group = pygame.sprite.Group()
self.time = 5
# 道具的生成以及生成概率
# 之后添加进入道具管理中
def generate(self):
value = random.random()
if value > 0.7:
PropSprite("images/life.png", 7, 1).add(self.prop_group)
elif value > 0.4:
PropSprite("images/bomb_supply.png", 7, 2).add(self.prop_group)
else:
PropSprite("images/bullet_supply.png", 7, 3).add(self.prop_group)
# 道具掉落时间
def update(self):
self.time -= 0.1
if self.time <= 0:
self.time = 5
self.generate()
self.prop_group.draw(self.gm.screen)
self.prop_group.update()
class GameManage:
def __init__(self):
pygame.init()
# 添加窗体
self.screen = pygame.display.set_mode((480, 700))
self.prop_manage = PropManage(self)
# 设置帧率
self.clock = pygame.time.Clock()
# 碰撞检测 以及提供道具相应功能
def check_collider(self):
prop_player_collider = pygame.sprite.groupcollide(self.player_manage.pm_group, self.prop_mamage.prop_group,
False, True)
if prop_player_collider:
for props in prop_player_collider.values():
for prop in props:
if prop.type == 3:
self.player_manage.player_sprite.super_bullet = 10
if prop.type == 2:
for enemy in self.enemy_manage.em_group.sprites():
enemy.kill()
self.score += len(self.enemy_manage.em_group.sprites())
if prop.type == 1:
self.player_manage.player_sprite.hp += 1
if self.player_manage.player_sprite.hp >= self.player_manage.player_sprite.max_hp:
self.player_manage.player_sprite.hp = self.player_manage.player_sprite.max_hp
def run(self):
while True:
# 一秒执行20次
self.clock.tick(20)
self.check_collider()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
self.prop_manage.update()
pygame.display.flip()
gm = GameManage()
gm.run()
5.鼠标点击检测
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