最适合新手了解pygame的打飞机游戏,内含详细注释

新手拿来联系熟悉 pygame的用法 函数的调用和继承都蛮好的

 

只要有一点点基础,就能够看懂代码,因为代码每个位置都有注释

 

图片:

 

子弹 子弹 英雄 英雄 敌人 敌人 最适合新手了解pygame的打飞机游戏,内含详细注释_第1张图片 背景

 plan_main.py

# 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()

 plan_sprites.py

#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()

 运行效果

 

最适合新手了解pygame的打飞机游戏,内含详细注释_第2张图片

 

 

你可能感兴趣的:(python)