新手拿来联系熟悉 pygame的用法 函数的调用和继承都蛮好的
只要有一点点基础,就能够看懂代码,因为代码每个位置都有注释
图片:
子弹 英雄 敌人 背景
# coding=gbk
import pygame
from plan_sprites import *
import random
class PlanGame(object):
"""飞机大战主区域"""
def __init__(self):
print("初始化中....")
# 设置定时
pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
pygame.time.set_timer(BULLTEN_ENEMY_EVENT, 200)
# 初始化pygame
pygame.init()
# 创建一个 480 700 的窗口
self.screen = pygame.display.set_mode((480, 700))
# 进行background的载入
self.image_bg = pygame.image.load("../feiji/background.png")
# 将载入的background粘到窗口内
self.screen.blit(self.image_bg, (0, 0))
# 获取窗口的矩形位置和大小等信息
self.screen_rect = self.screen.get_rect()
# 获取英雄的位置大小等 并进行对比窗口位置赋值
self.centerx = self.screen_rect.centerx-50
self.bottom = self.screen_rect.bottom-150
print(self.centerx,self.bottom)
# 创建精灵
self.__create_plan_sprites()
# 更新窗口
pygame.display.update()
# 初始化时钟
self.clock = pygame.time.Clock()
def start_game(self):
print("游戏开始")
while True:
# 设置时钟
self.clock.tick(60)
# 按键检测
self.__event()
# 精灵的刷新载入等操作
self.__update_sprites()
self.__check()
# 更新窗口
pygame.display.update()
def __create_plan_sprites(self):
print("精灵创建")
# 定义空的list,后期储存精灵
# 创建敌人精灵
enemy0 = GameSprites()
# 将创建的精灵添加到精灵组(方便后期快捷统一操作)
self.enemy_ground = pygame.sprite.Group(enemy0)
# 背景滚动设置 True代表-第二张图片
image_bg1 = BackGround(True)
image_bg2 = BackGround()
self.enemy_ground1 = pygame.sprite.Group(image_bg1, image_bg2)
#创建英雄精灵
self.hero = Hero(self.centerx, self.bottom)
self.hero_ground=pygame.sprite.Group(self.hero)
#创建子弹精灵
bullten = Bullten(self.hero.rect.centerx-10, self.hero.rect.top)
self.buttlen_ground=pygame.sprite.Group(bullten)
def __event(self):
# 监听键盘事件
for event in pygame.event.get():
# 判断是否关闭程序中
if event.type == pygame.QUIT:
print("out")
exit()
#进行敌机添加
if event.type == CREATE_ENEMY_EVENT:
enemy=Enemy()
self.enemy_ground.add(enemy)
# 进行子弹添加
elif event.type == BULLTEN_ENEMY_EVENT:
bullten = Bullten(self.hero.rect.centerx - 10, self.hero.rect.top)
self.buttlen_ground.add(bullten)
# 判断飞机的走向
if event.type==pygame.KEYDOWN:
if event.key==pygame.K_w:
self.hero.moving_w=True
elif event.key==pygame.K_s:
self.hero.moving_s = True
elif event.key == pygame.K_a:
self.hero.moving_a = True
elif event.key == pygame.K_d:
self.hero.moving_d = True
if event.type == pygame.KEYUP:
if event.key == pygame.K_w:
self.hero.moving_w = False
elif event.key == pygame.K_s:
self.hero.moving_s = False
elif event.key == pygame.K_a:
self.hero.moving_a = False
elif event.key == pygame.K_d:
self.hero.moving_d = False
def __check(self):
pygame.sprite.groupcollide(self.buttlen_ground,self.enemy_ground,True,True)
now_hero=pygame.sprite.spritecollide(self.hero,self.enemy_ground,True)
if len(now_hero)>0:#判断是否返回值,如果有那么就代表和hero撞击了,进行kill结束游戏
print("死亡")
self.hero.kill()
self.__gameover()
def __update_sprites(self):
# 刷新精灵组里面所有精灵的位置大小等信息
self.enemy_ground1.update()
self.hero_ground.update()
self.enemy_ground.update()
self.buttlen_ground.update()
# 将刷新完毕的精灵全部遍历在窗口内
self.enemy_ground1.draw(self.screen)
self.enemy_ground.draw(self.screen)
self.hero_ground.draw(self.screen)
self.buttlen_ground.draw(self.screen)
def __gameover(self):
print("GAME OVER!")
pygame.quit()
exit()
if __name__ == "__main__":
# 创建游戏对象
game = PlanGame()
# 启动游戏
game.start_game()
#coding=gbk
import pygame
import sys
import random
pygame.init()
CREATE_ENEMY_EVENT = pygame.USEREVENT
BULLTEN_ENEMY_EVENT = pygame.USEREVENT+1
class GameSprites(pygame.sprite.Sprite):
"""飞机大作战精灵类"""
def __init__(self,image_name="../feiji/enemy0.png",speed=1,x=0,y=0):
#调用父类的初始化方法
super().__init__()
#将传入的参数image进行载入
self.image=pygame.image.load(image_name)
#获取载入的精灵图片的矩形位置大小等信息
self.rect=self.image.get_rect()
self.rect.x=x
self.rect.y=y
#参数进行私有化
self.speed=speed
def update(self):
#运动轨迹
self.rect.y+=self.speed
class BackGround(GameSprites):
def __init__(self,is_alt=False):
#调用超级类的init
super().__init__("../feiji/background.png",2)
if is_alt:
#进行参数判断图片的摆放位置
self.rect.y=-self.rect.height
def update(self):
#调用超级类的update 进行每次向下的移动
super().update()
#判断精灵的位置,超过屏幕进行退换位置
if self.rect.y>=700:
self.rect.y = -self.rect.height
class Enemy(GameSprites):
"""创建敌人精灵类"""
def __init__(self):
super().__init__("../feiji/enemy0.png", random.randint(1, 5), random.randint(1, 450))
def update(self):
super().update()
#对超出屏幕的精灵删除
if(self.rect.y>=700):
self.kill()
class Hero(GameSprites):
"""创建英雄类"""
def __init__(self,x,y):
self.moving_a=False
self.moving_d = False
self.moving_w = False
self.moving_s = False
self.sudu=4
super().__init__("../feiji/hero1.png",0,x,y)
def update(self):
#将飞机的位置进行刷新
super().update()
if self.moving_a:
self.rect.x-=self.sudu
elif self.moving_d:
self.rect.x+=self.sudu
elif self.moving_w:
self.rect.y-=self.sudu
elif self.moving_s:
self.rect.y+=self.sudu
class Bullten(GameSprites):
"""设置子弹"""
def __init__(self,x,y):
super().__init__("../feiji/bullet.png",-5,x,y)
def update(self):
super().update()
if self.rect.y <=0 :#子弹飞出屏幕进行杀死,如果不杀死子弹过多会影响内存
self.kill()