Как сделать столкновения более ООП стиле - PullRequest
0 голосов
/ 28 мая 2019

Я делаю игру в пигме. Моя главная проблема заключается в том, как реализовать столкновение пигмеев в одном классе. У меня есть много обнаружений столкновений в моей игре, могу ли я сделать их меньше в одном классе или что-то в этом роде. Есть также некоторые групповые столкновения.

Также оптимизирует многие эффекты столкновений в играх (не та игра, о которой я говорю в играх 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

Должен ли я добавить в классы спрайтов некоторые функции для обнаружения коллизий или я должен открыть другой класс для коллизий. Вот мои уроки злости.


    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

1 Ответ

0 голосов
/ 28 мая 2019

Если вам нужен только один класс, вероятно, вам нужен модуль enum: https://docs.python.org/3/library/enum.html

Если вам не нужен только один класс, почему бы не создать какой-то базовый класс и все такое?варианты детей (может быть, как одиночные - у меня есть код для этого, если вам интересно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...