Pygame - Ошибка деления на ноль: деление на ноль с плавающей точкой - PullRequest
0 голосов
/ 10 сентября 2018

Я пошел в Stack Overflow и прочитал алгоритм, который заставляет врага следовать за игроком.Раньше это работало, но теперь выдает ошибку с нулевым делением.Я понимаю, что это потому, что Python делит на 0 (что означает, что расстояние между ними равно 0), однако, я не понимаю, почему он выдает эту ошибку, когда раньше, он не выбрасывал ее, даже если расстояние между ними было 0. Можеткто-нибудь уточнить?

import pygame
import math

pygame.init()
width, height = 800, 600
white = (255, 255, 255)

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((40, 50))
        self.image.fill(white)
        self.rect = self.image.get_rect()
        self.rect.x = width / 2
        self.rect.y = height/ 2
        self.speed = 1


    def move_towards_another_object(self):
        self.dx = self.rect.x - player.rect.x
        self.dy = self.rect.y - player.rect.y
        self.dist = math.hypot(self.dx, self.dy)
        self.dx = self.dx/self.dist
        self.dy = self.dy/self.dist
        self.rect.x += self.dx * -self.speed
        self.rect.y += self.dy * -self.speed

enemy = Enemy()

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50, 40))
        self.image.fill(white)
        self.rect = self.image.get_rect()
        self.rect.x = 0 + self.rect.x
        self.rect.y = height - self.rect.height

player = Player()

all_sprites = pygame.sprite.Group()
all_sprites.add(enemy, player)
gameExit = False

while not gameExit:
    enemy.move_towards_another_object()

pygame.quit()
quit()

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Я исправил это с помощью этого кода:

def move_towards_another_object(self):
    self.dx = self.rect.x - player.rect.x
    self.dy = self.rect.y - player.rect.y
    self.dist = math.hypot(self.dx, self.dy)
    if self.dist == 0:
        self.rect.x = self.rect.x
        self.rect.y = self.rect.y
    else:
        self.dx = self.dx/self.dist
        self.dy = self.dy/self.dist
        self.rect.x += self.dx * -self.speed
        self.rect.y += self.dy * -self.speed
0 голосов
/ 11 сентября 2018

Ваш enemy спрайт делает единичный шаг к player на каждой итерации. В конце концов, это совершенно совпадает с игроком, и self.dist - это идеальный 0. Ваши координаты целых , так что нетрудно точно получить математику. В предыдущей версии координаты были плавающими? Это может легко объяснить разницу.

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