文章图片
一、构建父类 无论什么样的敌人,无论其行动、AI如何,能力强弱、大小各异,它们总会有一些共同的属性,例如无论什么样的敌人都具有生命值、攻击力等基本的属性。
从这里出发,我们可以使用类的继承来简化代码量,避免重复造轮子。
首先,我们先构建一个敌人基类:
import pygame
class Monster(pygame.sprite.Sprite):
maxHp: int
Hp: int
Ad: int
index = 0
status = "standing"
direction = -1
images: map
def update(self):
"""敌人动作"""
def die(self):
"""敌人死亡后事件"""
复制代码
首先,可以看到,我们先继承了pygame提供了精灵类,使该类获得了一些常用的工具函数。
然后,我们为其定义了几个属性最大生命、生命、攻击,并标注了其数据类型。
另外,对于一些通用的变量,我们直接在父类进行赋值。
最后,我们定义了一些通用的函数作为接口,提供给子类进行覆写。
二、继承父类 接下来,我们来创建第一种类型的敌人-史莱姆:
class Shrem(Monster):
speed: intdef update(self):
self.rect.left += self.speed * self.direction
self.index = (self.index + 1) % len(self.images[self.status])
self.image = self.images[self.status][self.index]
if self.direction == -1:
self.image = pygame.transform.flip(self.image, True, False)
复制代码
首先, 在类名称后面括号中写上刚刚的Monster,表示对总的敌人类进行一个继承。
然后,添加属于史莱姆这类怪物特有的属性(如:速度)。
【程序员|[Python-Pygame]无中生有开发自己的2D动作游戏生成敌人】接着统一定义史莱姆这类怪物的动作Ai(写在update中),上面给出了案例表示史莱姆仅单向按速度进行位移,仅作为演示。实际怪物的Ai一定比这复杂的多(可能还会加入嗅探玩家、状态动作等)。
折腾了这么多,终于可以开始构建一个可用的类了:
class GreenShrem(Shrem):
def __init__(self, location=[300, 270]):
pygame.sprite.Sprite.__init__(self)
self.speed = 1
self.maxHp = 100
self.Hp = 100
self.Ad = 1self.image = pygame.image.load("./resourse/monsters/shrems/green_shrem/stand/1.png")
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = location
self.status = "moving"
self.images = {
"standing": [pygame.image.load(f"./resourse/monsters/shrems/green_shrem/stand/{i+1}.png") for i in range(1)],
"moving": [pygame.image.load(f"./resourse/monsters/shrems/green_shrem/move/{i+1}.png") for i in range(18)],
"dying": [pygame.image.load(f"./resourse/monsters/shrems/green_shrem/die/{i+1}.png") for i in range(3)]
}
复制代码
继承上面的史莱姆类,添加一个绿史莱姆类GreenShrem。
由于上面已经定义了史莱姆的Ai,在此处就无需添加了。我们只需要确定怪物的属性并加载其特定的资源即可。
同理,可以快速构建一个蓝史莱姆类BlueShrem(为做出区别,速度speed设为2)。
三、加入敌人
class Game:
def __init__(self, width, height):
self.monsters = [GreenShrem([400, 270]), BlueShrem([500, 270])]
复制代码
在Game类下创建一个list用于存储所有敌人对象(目前先在初始化的时候加入敌人,加入方式后面会换)。
def update(self):
for monster in self.monsters:
self.screen.blit(monster.image, monster.rect)for monster in self.monsters:
monster.update()
复制代码
在Game.update()中加入敌人的显示和更新,原来和人物一模一样,只是加了一个遍历而已。
实现效果:
文章图片
推荐阅读
- 软件测试|软件测试3个月学习,终于找到工作了,面试总结分享给大家
- 软件测试|Postman 是个好用的工具,不试一下()
- COMP3811
- CMP5327 游戏编程
- python|零基础学 Python 有什么建议()
- python|python(55)-编码-解码-unicode到底是什么(+repr+)
- Dream的茶话会|赢在CSDN----紧跟平台脚步,一起发光发亮
- 从零开始学WEB前端|从零开始学WEB前端——网页的行为——JavaScript基础(1)
- 蓝桥历届真题|第十一届蓝桥杯python大学组国赛真题