Где мне реализовать метод проверки на столкновение? - PullRequest
2 голосов
/ 26 мая 2020

Я делаю грабеж покемона в pygame, и я сделал метод, чтобы проверить, находится ли игрок в высокой траве. Однако я не знаю, где мне вызвать метод. Я пробовал использовать метод перемещения игрока, метод игры l oop и метод обновления. Когда я делаю это так, он проверяет после того, как вы вышли из травы, а это значит, что в первый раз, когда вы переместитесь в траву, это не сработает, а когда вы впервые выйдете из травы, это сработает (когда не должно) .

in_grass(self) метод:

def in_grass(self):
        for g in self.game.grass:
            if pygame.sprite.collide_rect(self, g):
                print(random.randint(1, 10000))
                if random.randint(1, 180) <= 25:
                    self.battle()

player move(self) метод:

def move(self, x_change, y_change):
        if x_change > 0:
            self.dir = 'RIGHT'
        if x_change < 0:
            self.dir = 'LEFT'
        if y_change > 0:
            self.dir = 'DOWN'
        if y_change < 0:
            self.dir = 'UP'

        if not self.collide(x_change, y_change):
            self.x += x_change
            self.y += y_change

            image_list = None
            if self.dir == 'UP':
                image_list = self.image_up
            elif self.dir == 'LEFT':
                image_list = self.image_left
            elif self.dir == 'RIGHT':
                image_list = self.image_right
            elif self.dir == 'DOWN':
                image_list = self.image_down

            if image_list:
                if self.walkcount >= len(image_list):
                    self.walkcount = 0
                self.image = image_list[self.walkcount]
                self.walkcount += 1
                self.image.set_colorkey(BLACK)

Main l oop:

 def events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_w:
                    self.player.move(0, -1)
                if event.key == pygame.K_a:
                    self.player.move(-1, 0)
                if event.key == pygame.K_s:
                    self.player.move(0, 1)
                if event.key == pygame.K_d:
                    self.player.move(1, 0)

            if event.type == pygame.KEYUP:
                self.player.image = self.player.default_images[self.player.dir]
                self.player.image.set_colorkey(BLACK)

РЕДАКТИРОВАТЬ: наконец-то он заработал! Я не могу назначить себе награду, так что, думаю, она просто так и останется.

Ответы [ 2 ]

1 голос
/ 02 июня 2020

Так что это пища для размышлений.

Небольшой отказ от ответственности, я никоим образом не являюсь разработчиком игр и не очень опытным разработчиком.

В более крупной игре вы, возможно, захотите оставить хороший гр asp на что творится где. Теперь предположим, что у нас есть игра, полная сущностей (думайте о сущностях как о вещах, которые вы видите на экране и которые имеют какое-то влияние на игру). Мы хотели бы обновлять все эти сущности в каждом кадре игры. oop.

Сущности могут быть отрисованы, перемещены, проверены коллизии, затронуты вводом игрока, анимированы или другими функциями, необходимыми вашей игре. Порядок, в котором мы это делаем, важен для нашей игры, предположим, что у нас есть список объектов

entities = []

Затем мы могли бы сделать что-то вроде этого, где мы oop пробиваем каждого врага в нашей игре oop en выполняют свою функцию поведения. мы передаем все сущности в функцию check_collision, чтобы сделать этот код более понятным.

Версия 1

entities = []
def game_loop:
    while(true):
        for entity in entities:
            entity.gather_input()
            entity.move()
            entity.check_collision(entities)
            entity.animate()
            entity.render()

Теперь посмотрим на это:

Версия 2

entities = []
def game_loop:
    while(true):
        for entity in entities:
            entity.gather_input()
        for entity in entities:
            entity.move()
        for entity in entities:
            entity.check_collision(entities)
        for entity in entities:
            entity.animate()
        for entity in entities:
            entity.render()

Порядок, в котором мы выполняем сущности, их поведение изменилось. Теперь у нас есть сгруппированное поведение, можно сказать, что мы определили периоды обновления нашей игры oop. Теперь мы знаем, что все движения объектов обновляются, прежде чем мы проверим все их столкновения.

В то время как в версии 1 мы делаем все логические c сначала для 1 объекта, а затем выполняем следующую. Мы можем потерять соответствующие данные в одном кадре, используя Версию 1, потому что 1 объект может двигаться и проверять столкновение там, где ему действительно следовало подождать, пока все объекты не переместятся.

Надеюсь, это может вызвать дополнительные исследования кроличьей норы, которая это игровой дизайн / архитектура.

0 голосов
/ 02 июня 2020

Создайте логическое значение в методе __init__ игрока, вызываемом self.checked = False. Затем в методе in_grass в конце установите self.checked = True. В методе update if not self.checked: self.in_grass. Наконец, в методе move, в самом начале, установите self.checked = False Я наконец-то заработал, ура!

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