GameSprite:
import sys
import pygame
SCREEN_SIZE = pygame.rect.Rect(0, 0, 400, 700)
class GameObject(pygame.sprite.Sprite):
def __init__(self, path, speed_x=0, speed_y=0):
super().__init__()
# 控制游戏对象的图片
self.img = pygame.image.load(path)
self.rect = self.img.get_rect()
self.speed_x = speed_x
self.speed_y = speed_y
# 游戏对象的位移函数
def update(self, window):
# 控制游戏对象的位移
self.rect.x += self.speed_x
self.rect.y += self.speed_y
window.blit(self.img, self.rect)
class Background(GameObject):
def __init__(self, path, is_first):
super().__init__(path)
# 初始位置
# 如果是第一个图片
if is_first:
self.rect.left = SCREEN_SIZE.left
self.rect.top = SCREEN_SIZE.top
# 如果不是第一个图片
else:
self.rect.bottom = SCREEN_SIZE.top
self.rect.left = SCREEN_SIZE.left
# 初始化移动速度
self.speed_y = 1
def update(self, window):
super().update(window)
# 边界检测
if self.rect.top >= SCREEN_SIZE.bottom:
self.rect.bottom = SCREEN_SIZE.top
class Hero(GameObject):
def __init__(self, path):
super().__init__(path)
# 初始化位置
self.me1 = pygame.image.load("images/images/me1.png")
self.me2 = pygame.image.load("images/images/me2.png")
self.rect.bottom = SCREEN_SIZE.bottom
self.rect.centerx = SCREEN_SIZE.centerx
self.count = 0
self.bullets = []
def update(self, window):
super().update(window)
if self.count < 20:
self.img = self.me2
elif 40 > self.count >= 20:
self.img = self.me1
else:
self.count = 0
# 边界检测
# 左右
if self.rect.left <= SCREEN_SIZE.left:
self.rect.left = SCREEN_SIZE.left
elif self.rect.right >= SCREEN_SIZE.right:
self.rect.right = SCREEN_SIZE.right
# 上下
if self.rect.top <= SCREEN_SIZE.top:
self.rect.top = SCREEN_SIZE.top
elif self.rect.bottom >= SCREEN_SIZE.bottom:
self.rect.bottom = SCREEN_SIZE.bottom
self.count += 1
# if self.fire_status:
# if self.count % 10 == 0:
# b = HeroBullet("images/bullet1.png", self)
# self.bullets.append(b)
# 通过键盘来控制飞机移动
def event_handler(self, even_list: list[pygame.event.Event]):
for e in even_list:
# 按下
if e.type == pygame.KEYDOWN:
if e.key == pygame.K_DOWN:
self.speed_y = 2
elif e.key == pygame.K_UP:
self.speed_y = -2
if e.key == pygame.K_LEFT:
self.speed_x = -2
elif e.key == pygame.K_RIGHT:
self.speed_x = 2
# if e.key == pygame.K_SPACE:
# self.fire_status = True
# 抬起
elif e.type == pygame.KEYUP:
if e.key == pygame.K_DOWN or e.key == pygame.K_UP:
self.speed_y = 0
if e.key == pygame.K_LEFT or e.key == pygame.K_RIGHT:
self.speed_x = 0
elif e.type == pygame.QUIT:
sys.exit()
# if e.key == pygame.K_SPACE:
# self.fire_status = False
# 获取按键状态的函数会返回一个元组,元组序号对应的就是按键id
tp = pygame.key.get_pressed()
if tp[32]:
if self.count % 10 == 0:
b = HeroBullet("images/images/bullet1.png", self)
self.bullets.append(b)
class HeroBullet(GameObject):
def __init__(self, path, hero: Hero):
super().__init__(path)
# 初始化子弹的位置
self.rect.bottom = hero.rect.top
self.rect.centerx = hero.rect.centerx
# 初始化子弹速度
self.speed_y = -5
GameMain:
from GameSprite import *
class GameMain:
def __init__(self):
pygame.init()
self.window = pygame.display.set_mode(SCREEN_SIZE.size)
self.clock = pygame.time.Clock()
self.BG1 = Background("images/images/background.png", True)
self.BG2 = Background("images/images/background.png", False)
self.Hero = Hero("images/images/me1.png")
def game_loop(self):
while True:
self.clock.tick(120)
# 绘制游戏对象
self.__draw()
# 事件处理函数
self.__event_handler()
def __draw(self):
# 先计算背景位置
self.BG1.update(self.window)
# 再将背景图片画到该位置上
self.BG2.update(self.window)
self.Hero.update(self.window)
for b in self.Hero.bullets:
b.update(self.window)
pygame.display.update()
def __event_handler(self):
event_list = pygame.event.get()
self.Hero.event_handler(event_list)
gm = GameMain()
gm.game_loop()