import pygame #引入图形模板模块
import random #引入随机数模块
SCREEN_RECT = pygame.rect.Rect(0,0,500,800) #建立一个500*800像素的窗口作为游戏界面窗口
class GameSprite(pygame.sprite.Sprite): #定义一个图形属性类,继承pygame里面原有的Sprite模块
def __init__(self, image, speed=1): #定义一个图片信息属性,一个速度属性
super().__init__() # 2.调用父类的初始化方法
self.image = pygame.image.load(image) # 3.获取图片对象信息
self.rect = self.image.get_rect() # 4.获取图片的矩形对象常量(坐标,宽高等信息)
self.speed = speed
def update(self, *args): # 复写父类的update 方法
self.rect.y += self.speed # 更改精灵y轴的值
if self.rect.y>=(SCREEN_RECT.height+10): #设置超出边界10像素点的图形销毁,释放内存
self.kill() #销毁
class Background(GameSprite): #继承建一个游戏背景
def update(self, *args):
super().update() #继承父类update方法
if self.rect.y>=SCREEN_RECT.height: #更改方法里当前对象需要修改的信息(设置一个背景循环)
self.rect.y =-self.rect.height
class Enemy(GameSprite): #建一个敌机类
def __init__(self):
super().__init__('img/222.jpg') #继承父类,传入一张图片建立敌机信息
self.speed=random.randint(2,4) #让后面调用时每一个新键的对象 随机获得速度
self.rect.bottom=0 #模型底部坐标赋值为 0
max_x=SCREEN_RECT.width - self.rect.width
self.rect.x=random.randint(0,max_x) #使敌机对象能从游戏框的不同位置随机建立
# def update(self, *args): #上面销毁出框敌机 也可单独复写此内容单独销毁
# #调用父类的update方法让敌机保持移动
# super().update()
class Hero(GameSprite): #建立英雄机类框架
def __init__(self):
super().__init__('img/enemy2_fly_1.png',speed=0) #传入英雄机图片信息
self.rect.bottom=SCREEN_RECT.height-50 #让英雄机建立在想要的坐标
self.rect.centerx=SCREEN_RECT.centerx #让英雄机建立在中心
self.bullet_group=pygame.sprite.Group() #建立英雄机子弹组
def update(self, *args): #复写英雄机update函数
self.rect.x += self.speed
if self.rect.x<=0: #限制英雄机不超出游戏框
self.rect.x=0
elif self.rect.right>=SCREEN_RECT.width:
self.rect.right=SCREEN_RECT.width
def fire(self): #建立子弹发射函数
print('发射子弹')
bullet=Bullet() #建立子弹对象
bullet.rect.centerx=self.rect.centerx #定义子弹的中心线,让子弹跟飞机走
bullet.rect.bottom=self.rect.y+50 #让子弹建立的位置吃入英雄机50像素
self.bullet_group.add(bullet) #将每个建立的子弹对象加入 子弹组
class Bullet(GameSprite): #建立子弹类
def __init__(self):
super().__init__('img/own4.png',speed=-3)
import pygame
from jingling_diji import * #加载上面我们做好的模块
SCREEN_RECT = pygame.rect.Rect(0,0,500,800) #录下屏幕信息
class PlaneGame(object): #建一个类,方便后面 对象函数间 的属性调用
def __init__(self):
self.screen=pygame.display.set_mode(SCREEN_RECT.size) #显示游戏界面屏幕
self.clock = pygame.time.Clock() #创建一个时钟对象
self.create_sprites() #放在init里是为了运行时初始化运行一下
pygame.time.set_timer(pygame.USEREVENT,1000)#1000毫秒触发一次定时器,执行一次自定义事件
pygame.time.set_timer(pygame.USEREVENT+1,500) #500毫秒触发
def create_sprites(self):
bg = Background('img/123.jpg') #1.创建背景精灵
bg1=Background('img/123.jpg') #1.创建两个同样背景可循环播放
bg1.rect.y=-bg1.rect.height #定义下背景二的生成位置
self.bg_group= pygame.sprite.Group(bg,bg1) #2.加入背景组 后面一些变化 就可以同时作用了
self.emeny_grounp=pygame.sprite.Group() #创建敌机组
self.hero=Hero()
self.hero_group=pygame.sprite.Group(self.hero) #创建添加英雄机对象
@staticmethod #设静态方法方便结束程序
def game_over():
pygame.quit() #类里的退出函数
exit()
def check_collide(self): #碰撞销毁
pygame.sprite.groupcollide(self.hero.bullet_group,self.emeny_grounp,True,True) #两组里的对象接触互相都销毁
ret=pygame.sprite.spritecollide(self.hero,self.emeny_grounp,True) #英雄机 碰撞敌机组里的任何一个对象,对象销毁。英雄机不能销毁 返回的结果是True 赋值给ret
if ret:
print('game over') #游戏结束
self.game_over()
def catch_event(self): #游戏框里的捕捉函数 '''捕获监听事件'''
event_list=pygame.event.get() #捕获鼠标位置 到信息,生成列表
for event in event_list:
if event.type == pygame.QUIT: #判断捕获的信息情况 如果是退出按钮
PlaneGame.game_over() #游戏结束
elif event.type==pygame.USEREVENT: #init 里的时间触发
print('敌机出场了')
#创建敌机
enemy=Enemy()
self.emeny_grounp.add(enemy) #将敌机添加到敌机组
elif event.type==pygame.USEREVENT+1: #init里的第二个触发
self.hero.fire() #发射函数
pressed_tup=pygame.key.get_pressed() #捕捉到的键盘输入
# print(pressed_tup)
if pressed_tup[pygame.K_LEFT]: #捕捉到的如果是左键
print('向左')
self.hero.speed=-2 #改变变化量的值
elif pressed_tup[pygame.K_RIGHT]:
print('向右')
self.hero.speed = 2
else:
self.hero.speed=0 #设置不按键时,停止移动
def update_sprites(self):
'''运行创建更新图像精灵组'''
self.bg_group.update()
self.bg_group.draw(self.screen)
self.emeny_grounp.update()
self.emeny_grounp.draw(self.screen)
self.hero_group.update()
self.hero_group.draw(self.screen)
self.hero.bullet_group.update()
self.hero.bullet_group.draw(self.screen)
def start(self): #开始函数
while True: #游戏运行画面变化的过程就是 循环创建不同坐标图形的循环刷新
self.clock.tick(60)
self.check_collide()
self.catch_event()
self.update_sprites()
pygame.display.update()
if __name__ == '__main__':
game = PlaneGame()
game.start()
ok,结束