【问题标题】:How to make collisions more OOP style如何使碰撞更具 OOP 风格
【发布时间】:2019-05-31 19:33:52
【问题描述】:

我正在用 pygame 制作游戏。我的主要问题是如何在一类中实现 pygame 碰撞。我的游戏中有很多碰撞检测,我可以在一类或类似的东西中少做些。还有一些群体冲突。

还做了很多游戏的碰撞效果优化(不是我说的3A游戏)。

    def update(self):
        self.all_sprites.update()
        self.score += self.start_time
        collision = pygame.sprite.spritecollide(self.player, self.platforms, False)
        collideGroup = pygame.sprite.groupcollide(self.bullet_list, self.enemyRocket, True, True)
        collideGroupPlat = pygame.sprite.groupcollide(self.bullet_list, self.platforms, True, False)
        collide = pygame.sprite.spritecollide(self.player, self.enemyRocket, False)
        collideWithEND = pygame.sprite.spritecollide(self.player, self.endLevel, False)
        collideWithFuel = pygame.sprite.groupcollide(self.bullet_list, self.fuel, True, True)

        if collision:
            self.player_health -= 1
            self.new()
        if collide:
            self.player_health -= 1
            self.new()
        if collideGroup:
            self.score += 10
        if collideWithEND:
            self.level += 1
        if collideWithFuel:
            self.fuelBar += 10

我应该在 sprite 类中添加一些函数来检测碰撞,还是应该打开另一个类来检测碰撞。 这是我的怨恨课。


    class Player(pygame.sprite.Sprite):
    def __init__(self, img, pos_x, pos_y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(os.path.join('images', img)).convert()
        self.image.convert_alpha()
        self.image.set_colorkey(ALPHA)
        self.rect = self.image.get_rect()
        self.rect.center = (pos_x, pos_y)
        self.vx = 0
        self.vy = 0

    def update(self):
        self.vx = 0
        self.vy = 0
        keys = pygame.key.get_pressed()
        if keys[pygame.K_UP]:
            self.vy = -5
            if self.rect.y < 0:
                self.rect.y += 5
        if keys[pygame.K_DOWN]:
            self.vy = 3
        if keys[pygame.K_RIGHT]:
            self.vx = 3
            if self.rect.x > (WIDTH-58):
                self.rect.x -= 5
        if keys[pygame.K_LEFT]:
            self.vx = -5
            if self.rect.x < 0:
                self.rect.x += 5

        self.rect.x += self.vx
        self.rect.y += self.vy


class Bullet(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((5, 3))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.vx = 0

    def update(self):
        keys = pygame.key.get_pressed()

        self.rect.x += self.vx
        if self.rect.x > WIDTH:
            self.kill()
        if keys[pygame.K_SPACE]:
            self.vx = 2
        self.rect.x += self.vx

【问题讨论】:

  • 是的。这样做是有可能的。
  • 可以用元组和dicts 清理它,但这并不能使它更好地面向对象。如果你展示你的类(我们的玩家类和敌人火箭类将是最有用的)它会更容易帮助你。你的类对象应该有碰撞方法来处理它们的逻辑。
  • 在这里我添加了我的精灵类

标签: python python-3.x pygame


【解决方案1】:

如果您只想要一个课程,enum 模块可能就是您所追求的:https://docs.python.org/3/library/enum.html

如果您不想要一个类,为什么不创建某种基类和所有变体的子类(可能作为单例 - 如果您有兴趣,我有代码)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多