pygame小项目 ~ 3 :Python完成简易飞机大战
子弹 敌机 我方战斗机全部采用图片
子弹击中和战斗机被击中全部采用碰撞检测
游戏的主函数代码
import spite
from spite import plane_game
if __name__ == '__main__':
game = plane_game()
game.strat_game()
采用pygame的精灵类完成游戏的运行
import pygame as pg
import random
import pygame.font
from plane_wars.Enemy_plane import *
class plane_game(object):
def __init__(self):
# 创建游戏窗口
self.srceen = pg.display.set_mode(SRCEEN_RECT.size, flags = 1)
# 创建时钟
self.clock = pg.time.Clock()
# 调用私有方法
self.__creat_sprites()
pygame.time.set_timer(CREAT_ENEMY_TIME, 1000)
pg.time.set_timer(HERO_FIRE, 500)
print("游戏初始化successily")
def strat_game(self):
print("游戏开始")
while True:
# 设置刷新率
self.clock.tick(FRAME_TICT)
# 事件监听
self.__event_hear()
# 碰撞检测
self.__check_collide()
# 更新敌机和战斗机等精灵组的
self.__update_spites()
print(pygame.font.get_default_font())
# 更新游戏窗口
pg.display.update()
def __event_hear(self):
for it in pg.event.get():
if it.type == pg.QUIT:
print("游戏结束")
pg.quit()
exit()
elif it.type == CREAT_ENEMY_TIME:
speed = random.randint(1, 3)
x = random.randint(0, 423)
enemy = Enemy("./plane_wars/imgs/images/enemy1.png", speed)
enemy.rect.y, enemy.rect.x = -43, x
self.enemy_group.add(enemy)
elif it.type == HERO_FIRE:
self.plane.fire()
keys = pg.key.get_pressed()
if keys[pg.K_RIGHT]:
print("R")
self.plane.rect.x += 2.5
elif keys[pg.K_LEFT]:
print("L")
self.plane.rect.x -= 2.5
def __creat_sprites(self):
bg1 = background("./plane_wars/imgs/images/background.png")
bg2 = background("./plane_wars/imgs/images/background.png")
bg2.rect.y = -bg2.rect.height
self.bg_group = pg.sprite.Group(bg1, bg2)
self.enemy_group = pg.sprite.Group()
self.plane = Plane()
self.plane.rect.x, self.plane.rect.y = 220, 600
self.plane_group = pg.sprite.Group(self.plane)
#碰撞检测
def __check_collide(self):
pg.sprite.groupcollide(self.plane.bullets, self.enemy_group, True, True)
e = pg.sprite.spritecollide(self.plane, self.enemy_group, True)
if len(e) > 0:
self.plane.kill()
plane_game.gameover()
def __update_spites(self):
self.bg_group.draw(self.srceen)
self.bg_group.update()
self.enemy_group.draw(self.srceen)
self.enemy_group.update()
self.plane_group.draw(self.srceen)
self.plane_group.update()
self.plane.bullets.draw(self.srceen)
self.plane.bullets.update()
@staticmethod
def gameover():
print("游戏结束")
pg.quit()
exit(0)
敌机, 子弹对象全部采用sprite类产生,便于统一绘制、碰撞检测、和内存销毁
import pygame
SRCEEN_RECT = pygame.Rect(0, 0, 480, 700)
FRAME_TICT = 90
HERO_FIRE = pygame.USEREVENT + 1
# 创建时间常量
CREAT_ENEMY_TIME = pygame.USEREVENT
class Enemy_plane(pygame.sprite.Sprite):
def __init__(self, picture_name, speed = 1):
# 注意如果继承的弗雷不是基类,一定要调用父类的初始化方法,不然不能享受父类初始化中的东西
super().__init__()
self.image = pygame.image.load(picture_name)
self.rect = self.image.get_rect()
self.speed = speed
def update(self) :
self.rect.y += self.speed
class background(Enemy_plane):
def update(self):
super().update()
if self.rect.y >= SRCEEN_RECT.height:
self.rect.y = -SRCEEN_RECT.height
class Enemy(Enemy_plane):
def update(self):
super().update()
if self.rect.y > SRCEEN_RECT.height:
self.kill()
def __del__(self):
print("敌机已经被销毁")
class Plane(Enemy_plane):
def __init__(self):
super().__init__("E:\pycharm\pythonGames\plane_wars\imgs\images\life.png", 0)
self.bullets = pygame.sprite.Group()
def update(self):
super().update()
if self.rect.x < 0:
self.rect.x = 0
elif self.rect.x > SRCEEN_RECT.width - self.rect.width:
self.rect.x = SRCEEN_RECT.width - self.rect.width
def fire(self):
bulle = Bullet("E:\pycharm\pythonGames\plane_wars\imgs\images\\bullet2.png", -2)
bulle.rect.y = self.rect.y - 10
bulle.rect.x = self.rect.centerx
self.bullets.add(bulle)
class Bullet(Enemy_plane):
def update(self):
super().update()
if self.rect.y < -self.rect.bottom:
self.kill()
def __del__(self):
print("子弹已经销毁")
还有积分等功能暂未实现
游戏界面
更新中~~~~~~~~