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

    xiaoxiao2025-02-25  57

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

     

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

     

    图片:

     

    子弹 英雄 敌人 背景

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

     运行效果

     

     

     

    最新回复(0)