飞机飞行时使地图移动可以让游戏看起来更加自然所以加入地图移动的操作:
将原本地图大小格式定义为数组方便后续操作:- bg_size = (480,700)
- def __init__(self):
- # 创建窗口
- self.screen = pygame.display.set_mode(Manager.bg_size, 0, 32)
复制代码 创建地图类,用两个相同的背景图片切换实现地图的移动
- class BackGround :
- # 初始化地图
- def __init__(self,screen):
- self.mImage1 = pygame.image.load("./images/background.png")
- self.mImage2 = pygame.image.load("./images/background.png")
- # 窗口
- self.screen = screen
- # 辅助移动
- self.y1 =0
- # 衔接地图y轴
- self.y2 =-Manager.bg_size[1]
- def draw(self):
- self.screen.blit(self.mImage1,(0,self.y1))
- self.screen.blit(self.mImage2,(0,self.y2))
- def move(self):
- self.y1+=2
- self.y2 += 2
- if self.y1 >= Manager.bg_size[1]:
- self.y1=0
- if self.y2 >= 0:
- self.y2 = -Manager.bg_size[1]
复制代码 在Manager中创建背景图片:- def __init__(self):
- # 创建窗口
- self.screen = pygame.display.set_mode(Manager.bg_size, 0, 32)
- # 创建背景图片
- #self.background = pygame.image.load("./images/background.png")
- self.map = BackGround(self.screen)
复制代码 引入图片:- while True:
- # 把背景图片贴到窗口
- # self.screen.blit(self.background, (0, 0))
- # 移动地图
- self.map.move()
- # 把地图贴到窗口上
- self.map.draw()
复制代码 完整代码:- # 引入randomimport random# 引入pygameimport pygame# 引入time模块import time# 引入pygame中的所有方法from pygame.constants import K_UP, K_RIGHT, K_DOWN, K_LEFT, K_w, K_a, K_s, K_d, K_SPACE# 定义初始为向右direction = "right"# 引入敌方飞机的类class Enemy(pygame.sprite.Sprite): def __init__(self, screen): # 调用继承精灵初始化方法 pygame.sprite.Sprite.__init__(self) # 引入图片创建敌人 self.enemy = pygame.image.load("./images/enemy1.png") self.image = self.enemy # 设置速度变量 self.speed = 10 # 降低速度使游戏可玩 # 根据图片进行获取矩形对象 self.rect = self.image.get_rect() self.rect.topleft = [0, 0] self.x = 0 self.y = 0 # 使screen变为飞机类的一个属性 self.screen = screen # 定义装子弹的精灵组 self.bullets = pygame.sprite.Group() def display(self): self.screen.blit(self.enemy, (self.rect.left, self.rect.top)) # 改为使用精灵组的方法绘制子弹 self.bullets.update() # 更新子弹位置 self.bullets.draw(self.screen) # 绘制子弹 # 定义移动飞机的方法 def auto_move(self): # 将direction改为全局变量 global direction # 判断方向进行移动 if direction == "right": self.rect.right += self.speed if direction == "left": self.rect.right -= self.speed # 定义碰壁时调整移动方向 if self.rect.right >= 480 - 51: direction = "left" if self.rect.right 700: self.kill()# 引入子弹的类class Bullet(pygame.sprite.Sprite): def __init__(self, screen, x, y): # 调用继承精灵初始化方法 pygame.sprite.Sprite.__init__(self) # 引入子弹图片 self.image = pygame.image.load("./images/bullet1.png") # 根据图片进行获取矩形对象 self.rect = self.image.get_rect() self.rect.topleft = [x + 51 - 2, y] self.x = x + 51 - 2 self.y = y # 显示窗口 self.screen = screen # 定义速度 self.speed = 10 def update(self): # 修改子弹坐标 self.rect.top -= self.speed # 如果子弹出界,销毁子弹 if self.rect.top < -22: self.kill()# 定义音乐的类class GameSound(object): def __init__(self): # 初始化主程序 pygame.mixer.init() # 引入背景音乐 pygame.mixer.music.load("./sound/game_music.ogg") # 调整声音大小 pygame.mixer.music.set_volume(0.5) self.__bomb = pygame.mixer.Sound('./sound/get_bomb.wav') def playBombSound(self): pygame.mixer.Sound.play(self.__bomb) def PlayMusic(self): # 开始播放音乐 pygame.mixer.music.play(-1)# 定义碰撞的类class Bomb(object): # 初始化碰撞 def __init__(self, screen, type): self.screen = screen if type == "enemy": # 加载爆炸资源 self.mImage = [pygame.image.load("./images/enemy1_down" + str(v) + ".png") for v in range(1, 5)] else: # 加载爆炸资源 self.mImage = [pygame.image.load("./images/me_destroy_" + str(v) + ".png") for v in range(1, 5)] # 设置当前爆炸播放索引 self.mIndex = 0 # 爆炸位置 self.mPos = [0, 0] # 是否可见 self.mVisible = False def action(self, rect): # 触发爆炸方法draw # 爆炸的坐标 self.mPos[0] = rect.left self.mPos[1] = rect.top # 打开爆炸的开关 self.mVisible = True # 重置索引 self.mIndex = 0 def draw(self): if not self.mVisible: return # 绘制当前爆炸帧 self.screen.blit(self.mImage[self.mIndex], (self.mPos[0], self.mPos[1])) # 更新索引 self.mIndex += 1 if self.mIndex >= len(self.mImage): self.mVisible = False self.mIndex = 0class BackGround :
- # 初始化地图
- def __init__(self,screen):
- self.mImage1 = pygame.image.load("./images/background.png")
- self.mImage2 = pygame.image.load("./images/background.png")
- # 窗口
- self.screen = screen
- # 辅助移动
- self.y1 =0
- # 衔接地图y轴
- self.y2 =-Manager.bg_size[1]
- def draw(self):
- self.screen.blit(self.mImage1,(0,self.y1))
- self.screen.blit(self.mImage2,(0,self.y2))
- def move(self):
- self.y1+=2
- self.y2 += 2
- if self.y1 >= Manager.bg_size[1]:
- self.y1=0
- if self.y2 >= 0:
- self.y2 = -Manager.bg_size[1]class Manager(object): bg_size = (480,700) def __init__(self): # 创建窗口 self.screen = pygame.display.set_mode(Manager.bg_size, 0, 32) # 创建背景图片 #self.background = pygame.image.load("./images/background.png") self.map = BackGround(self.screen) # 初始化一个装玩家精灵的group self.players = pygame.sprite.Group() # 初始化一个装敌机精灵的group self.enemys = pygame.sprite.Group() # 初始化一个玩家爆炸的对象 self.player_bomb = Bomb(self.screen, 'player') # 初始化一个敌机爆炸的对象 self.enemy_bomb = Bomb(self.screen, 'enemy') # 初始化一个声音播放的对象 self.sound = GameSound() def exit(self): print('退出') pygame.quit() exit() def new_player(self): # 创建飞机对象 添加到玩家的组 player = Plane(self.screen) self.players.add(player) def new_enemy(self): # 创建敌机的对象 添加到敌机的组 enemy = Enemy(self.screen) self.enemys.add(enemy) def main(self): # 播放背景音乐 self.sound.PlayMusic() # 创建一个玩家 self.new_player() # 创建一个敌机 self.new_enemy() while True: # 把背景图片贴到窗口 # self.screen.blit(self.background, (0, 0)) # 移动地图 self.map.move() # 把地图贴到窗口上 self.map.draw() # 遍历所有的事件 for event in pygame.event.get(): # 判断事件类型如果是pygame的退出 if event.type == pygame.QUIT: self.exit() # 玩家飞机和子弹的显示 self.players.update() # 敌机和子弹的显示 self.enemys.update() # 绘制爆炸效果 self.player_bomb.draw() self.enemy_bomb.draw() # 刷新窗口内容 pygame.display.update() time.sleep(0.01) # 判断碰撞 iscollide = pygame.sprite.groupcollide(self.players, self.enemys, True, True) if iscollide: items = list(iscollide.items())[0] print(items) x = items[0] y = items[1][0] # 玩家爆炸图片 self.player_bomb.action(x.rect) # 敌机爆炸图片 self.enemy_bomb.action(y.rect) # 重新创建玩家和敌机 self.new_player() self.new_enemy() # 加入声音 self.sound.playBombSound()if __name__ == "__main__": # 初始化pygame pygame.init() manager = Manager() manager.main()
复制代码 演示如下:
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |