exo 刘德华,秋天风景图片,神话介绍
等等,我们好像只是绘制了一动的张图
不知道你有没有发现,我们现在好像只是绘制了一张动的图,只是一张!!!就这么多代码了,如果有100张 10000+张?那我们这么高?
别担心,pygame给我们提供了解决方案------精灵还有精灵组
在游戏开发中 显示图像的对象 就是精灵
pygame.sprite.sprite
—— 存储 图像数据 image 和 位置 rect 的 **对象image
要显示的图像, rect
图像要显示在屏幕的位置update()
方法什么事情也没做,子类可以重写此方法,在每次刷新屏幕时,更新精灵位置pygame.sprite.sprite
并没有提供 image
和 rect
两个属性pygame.sprite.sprite
派生子类image
和 rect
属性update()
方法
update()
方法draw(屏幕对象)
方法
image
绘制在 rect
位置group(*sprites) -> group
实例代码:
# 1. 新建 `plane_sprites.py` 文件 # 2. 定义 `gamesprite` 继承自 `pygame.sprite.sprite` import pygame # 3.写在括号里的意思是继承父类 class gamesprite(pygame.sprite.sprite): """飞机大战中的游戏精灵,根据设计的uml编写代码""" #注意这里要重写init方法,我们在init初始化方法(行函数)传参 def __init__(self, image_name, speed=1): # 调用父类的初始化方法,当我们的父类不是object基类的时候一定要调用super()对象来调用父类的初始化inint方法 super().__init__() # 定义对象的属性,它们分别记录着精灵的图片位置速度还有运动方式 # 加载图像 self.image = pygame.image.load(image_name) # 设置尺寸 self.rect = self.image.get_rect() # 记录速度 self.speed = speed def update(self): # 在屏幕的垂直方向上移动 self.rect.y += self.speed
什么?你不知道我们的主程序是什么?好吧,是我忘记告诉你了,我们的主程序就是我们之前写的 绘制窗口的那个程序,
其实这也非常的简单 ,你只需要在游戏主程序中导入包
如何完成添加“敌机”精灵,并且让它动起来,再把它们放到游戏循环里面就行了
我们先来明确一下精灵还有精灵组的分工 1. 精灵 * 封装 **图像 image**、**位置 rect** 和 **速度 speed** * 提供 `update()` 方法,根据游戏需求,**更新位置 rect** 2. 精灵组 * 包含 **多个** **精灵对象** * `update` 方法,让精灵组中的所有精灵调用 `update` 方法更新位置 * `draw(screen)` 方法,在 `screen` 上绘制精灵组中的所有精灵
import pygame # 你需要导入 form和import 使用inprom导入的时候需要.来使用 使用form的时候 直接使用模块提供的工具就行了。 # 它们都是实现了导入模块的功能 from plane_sprites import * # 游戏的初始化 pygame.init() # 创建游戏的窗口 480 * 700 screen = pygame.display.set_mode((480, 700)) # 绘制背景图像 bg = pygame.image.load("./images/background.png") screen.blit(bg, (0, 0)) # pygame.display.update() # 绘制英雄的飞机 hero = pygame.image.load("./images/me1.png") screen.blit(hero, (150, 300)) # 可以在所有绘制工作完成之后,统一调用update方法 pygame.display.update() # 创建时钟对象 clock = pygame.time.clock() # 1. 定义rect记录飞机的初始位置 hero_rect = pygame.rect(150, 300, 102, 126) # 开始我们的业务逻辑 # 创建敌机的精灵 # 敌人的战斗机对象 enemy = gamesprite("./images/enemy1.png") enemy1 = gamesprite("./images/enemy1.png", 2) # 创建敌机的精灵组,我们可以使用多值的方式传递精灵组合,有了这个精灵组,我们就可以直接使用精灵的方法了,一次性的绘制所有的图像 enemy_group = pygame.sprite.group(enemy, enemy1) # # 让精灵组调用两个方法 # # update - 让组中的所有精灵更新位置,这个是更新位置 # enemy_group.update() # # draw - 在screen上绘制所有的精灵,这个是绘制 # enemy_group.draw(screen) # 我们只是调用一次,现在我们把它丢到我们的游戏循环里面去 # 游戏循环 -> 意味着游戏的正式开始! while true: # 可以指定循环体内部的代码执行的频率 clock.tick(60) # 监听事件 for event in pygame.event.get(): # 判断事件类型是否是退出事件 if event.type == pygame.quit: print("游戏退出...") # quit 卸载所有的模块 pygame.quit() # exit() 直接终止当前正在执行的程序 exit() # 2. 修改飞机的位置 hero_rect.y -= 1 # 判断飞机的位置 if hero_rect.y <= 0: hero_rect.y = 700 # 3. 调用blit方法绘制图像 screen.blit(bg, (0, 0)) screen.blit(hero, hero_rect) # 让精灵组调用两个方法 # update - 让组中的所有精灵更新位置,这个是更新位置 enemy_group.update() # draw - 在screen上绘制所有的精灵,这个是绘制 enemy_group.draw(screen) # 4. 调用update方法更新显示 pygame.display.update() pygame.quit()
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
python求numpy中array按列非零元素的平均值案例
网友评论