发布于2019-08-22 16:51 阅读(1363) 评论(0) 点赞(1) 收藏(4)
#! /usr/bin/python3
import pygame
from plane_sprites import *
CREATE_ENEMY_EVENT = pygame.USEREVENT
HERO_FIRE_EVENT = pygame.USEREVENT + 1
class PlaneGame:
“”“飞机大战游戏类”""
def __init__(self):
print("游戏初始化...")
pygame.init()
self.screen = pygame.display.set_mode(SCREEN_RECT.size)
self.clock = pygame.time.Clock()
self.__create_sprites()
PlaneGame.__create_user_events()
def __create_sprites(self):
"""创建精灵组"""
self.back_group = pygame.sprite.Group(Background(), Background(True))
self.hero = Hero()
self.hero_group = pygame.sprite.Group(self.hero)
self.enemy_group = pygame.sprite.Group()
self.destroy_group = pygame.sprite.Group()
@staticmethod
def __create_user_events():
"""创建用户事件"""
# 每秒添加一架敌机
pygame.time.set_timer(CREATE_ENEMY_EVENT, 1 * 1000)
# 每秒发射两次子弹
pygame.time.set_timer(HERO_FIRE_EVENT, 500)
def start_game(self):
"""开启游戏循环"""
while True:
self.clock.tick(60)
self.__event_handler()
self.__update_sprites()
self.__check_collide()
pygame.display.update()
def __check_collide(self):
"""碰撞检测"""
# 子弹摧毁敌机
enemies = pygame.sprite.groupcollide(self.enemy_group,
self.hero.bullets,
False,
True).keys()
for enemy in enemies:
enemy.life -= 1
if enemy.life <= 0:
enemy.add(self.destroy_group)
enemy.remove(self.enemy_group)
enemy.destroied()
# 敌机撞毁英雄
for hero in pygame.sprite.spritecollide(self.hero,
self.enemy_group,
True):
print("英雄牺牲了...")
self.hero.destroied()
def __event_handler(self):
"""事件处理"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
PlaneGame.__finished_game()
elif event.type == HERO_FIRE_EVENT:
self.hero.fire()
elif event.type == CREATE_ENEMY_EVENT:
self.enemy_group.add(Enemy())
# 按下 b 英雄自爆
elif event.type == pygame.KEYDOWN and event.key == pygame.K_b:
# self.hero.destroied()
# 集体自爆
for enemy in self.enemy_group.sprites():
enemy.destroied()
# 判断英雄是否已经被销毁,如果是,游戏结束!
if self.hero.can_destroied:
PlaneGame.__finished_game()
# 通过 pygame.key 获取用户按键
keys_pressed = pygame.key.get_pressed()
dir = keys_pressed[pygame.K_RIGHT] - keys_pressed[pygame.K_LEFT]
# 根据移动方向设置英雄的速度
self.hero.speed = dir * 2
def __update_sprites(self):
"""更新/绘制精灵组"""
for group in [self.back_group, self.hero_group,
self.hero.bullets, self.enemy_group,
self.destroy_group]:
group.update()
group.draw(self.screen)
@staticmethod
def __finished_game():
"""退出游戏"""
print("退出游戏")
pygame.quit()
exit()
if name == ‘main’:
PlaneGame().start_game()
import random
import pygame
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
class GameSprite(pygame.sprite.Sprite):
“”“游戏精灵”""
def __init__(self, image_name, speed=1):
super().__init__()
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect()
self.speed = speed
def update(self, *args):
self.rect.top += self.speed
@staticmethod
def image_names(prefix, count):
names = []
for i in range(1, count + 1):
names.append("./images/" + prefix + str(i) + ".png")
return names
class Background(GameSprite):
“”“背景精灵”""
def __init__(self, is_alt=False):
super().__init__("./images/background.png")
if is_alt:
self.rect.bottom = 0
def update(self, *args):
super().update(args)
if self.rect.top >= SCREEN_RECT.height:
self.rect.bottom = 0
class PlaneSprite(GameSprite):
“”“飞机精灵,包括敌机和英雄”""
def __init__(self, image_names, destroy_names, life, speed):
image_name = image_names[0]
super().__init__(image_name, speed)
# 生命值
self.life = life
# 正常图像列表
self.__life_images = []
for file_name in image_names:
image = pygame.image.load(file_name)
self.__life_images.append(image)
# 被摧毁图像列表
self.__destroy_images = []
for file_name in destroy_names:
image = pygame.image.load(file_name)
self.__destroy_images.append(image)
# 默认播放生存图片
self.images = self.__life_images
# 显示图像索引
self.show_image_index = 0
# 是否循环播放
self.is_loop_show = True
# 是否可以被删除
self.can_destroied = False
def update(self, *args):
self.update_images()
super().update(args)
def update_images(self):
"""更新图像"""
pre_index = int(self.show_image_index)
self.show_image_index += 0.05
count = len(self.images)
# 判断是否循环播放
if self.is_loop_show:
self.show_image_index %= len(self.images)
elif self.show_image_index > count - 1:
self.show_image_index = count - 1
self.can_destroied = True
current_index = int(self.show_image_index)
if pre_index != current_index:
self.image = self.images[current_index]
def destroied(self):
"""飞机被摧毁"""
# 默认播放生存图片
self.images = self.__destroy_images
# 显示图像索引
self.show_image_index = 0
# 是否循环播放
self.is_loop_show = False
class Hero(PlaneSprite):
“”“英雄精灵”""
def __init__(self):
image_names = GameSprite.image_names("me", 2)
destroy_names = GameSprite.image_names("me_destroy_", 4)
super().__init__(image_names, destroy_names, 0, 0)
# 设置初始位置
self.rect.centerx = SCREEN_RECT.centerx
self.rect.bottom = SCREEN_RECT.bottom - 120
# 创建子弹组
self.bullets = pygame.sprite.Group()
def update(self, *args):
self.update_images()
# 飞机水平移动
self.rect.left += self.speed
# 超出屏幕检测
if self.rect.left < 0:
self.rect.left = 0
if self.rect.right > SCREEN_RECT.right:
self.rect.right = SCREEN_RECT.right
def fire(self):
"""发射子弹"""
# bullet_count = len(self.bullets.sprites())
# print("子弹数量 %d" % bullet_count)
for i in range(0, 3):
# 创建子弹精灵
bullet = Bullet()
# 设置子弹位置
bullet.rect.bottom = self.rect.top - i * 20
bullet.rect.centerx = self.rect.centerx
# 将子弹添加到精灵组
self.bullets.add(bullet)
class Bullet(GameSprite):
“”“子弹精灵”""
def __init__(self):
image_name = "./images/bullet1.png"
super().__init__(image_name, -2)
def update(self, *args):
super().update(args)
# 判断是否超出屏幕
if self.rect.bottom < 0:
self.kill()
class Enemy(PlaneSprite):
“”“敌机精灵”""
def __init__(self):
image_names = ["./images/enemy1.png"]
destroy_names = GameSprite.image_names("enemy1_down", 4)
super().__init__(image_names, destroy_names, 2, 1)
# 随机敌机出现位置
width = SCREEN_RECT.width - self.rect.width
self.rect.left = random.randint(0, width)
self.rect.bottom = 0
# 随机速度
self.speed = random.randint(1, 3)
def update(self, *args):
super().update(args)
# 判断敌机是否移出屏幕
if self.rect.top >= SCREEN_RECT.height:
# 将精灵从所有组中删除
self.kill()
# 判断敌机是否已经被销毁
if self.can_destroied:
self.kill()
作者:fggfg
链接:https://www.pythonheidong.com/blog/article/53053/c974f1a1edfe3bbf97b7/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!