[Python-Pygame]无中生有开发自己的2D动作游戏生成敌人

[Python-Pygame]无中生有开发自己的2D动作游戏生成敌人,第1张

[Python-Pygame]无中生有开发自己的2D动作游戏生成敌人

一、构建父类

无论什么样的敌人,无论其行动、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: int

    def 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,表示对总的敌人类进行一个继承。

然后,添加属于史莱姆这类怪物特有的属性(如:速度)。

接着统一定义史莱姆这类怪物的动作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 = 1

        self.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()中加入敌人的显示和更新,原来和人物一模一样,只是加了一个遍历而已。

实现效果:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5659857.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存