Как создать узкое обнаружение столкновений между оружием ближнего боя и противником - PullRequest
2 голосов
/ 19 мая 2019

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

for event in pygame.event.get():
     if event.type == pygame.MOUSEBUTTONDOWN:
         if event.button == 1: #Event called when left click
             for enemy in enemies: #An array that holds instances of enemies 
                 if (math.sqrt( ( (enemy.x - x) **2) + ( (enemy.y - y)**2) ) < (100+reachBonus) ): #Using distance forumla to calculate player x and y values in corresondance to an enemies x and y position 
                     enemy.health -= woodenSword.damageAmount #subtracts the enemies health by the amount of damage that the woodenSword does 

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

Как возможный подход я считаю raytracing. Я привык к Unreal Engine, где вы можете посылать трассировку строки, которая по сути является невидимой строкой, которая будет возвращать True, если она что-то ударила напрямую. Это было бы вариантом, если бы я бросил несколько лучей перед игроком и увидел, сталкивается ли он с врагом, но я не нашел, как это сделать в Pygame, и мне кажется, что это не очень эффективное решение, поскольку мне может понадобиться отправить несколько лучей на начать с. Также это характерно для трехмерного пространства - возможно, 2d игра, которую я имею, может пойти с базовой математикой.

Что я могу сделать, чтобы починить свою механику, чтобы она работала, только если игрок смотрит прямо на врага, а не только на расстоянии?

1 Ответ

4 голосов
/ 21 мая 2019

Похоже, вы пытаетесь заново изобрести колесо для функций, которые уже существуют в Pygame.

Вы пытаетесь определить, вступает ли меч в контакт с мобом.

Это уже включено в функции обнаружения столкновений в Pygame.

Вместо того, чтобы вычислять близость вашего персонажа к каждому мобу, вместо этого генерируйте спрайт по щелчку мыши для области атаки мечом. Затем проверьте наличие столкновения между монстрами и оружейным спрайтом. Если произошло столкновение, сделайте расчет урона.

https://www.pygame.org/docs/ref/sprite.html

Что касается лучевого вещания, это было бы полезно, если вы пытаетесь вычислить конечную точку для какого-либо лазера или веревки или чего-то еще, где вы строите твердую «вещь» между начальной и конечной точкой и вам необходимо знать конечная точка перед генерацией «вещи» на экране. Для обычной атаки в ближнем бою это не нужно.

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