Круговое столкновение в моей игре чуть больше изображения

Я реализую круговое столкновение в своей игре, созданной на Go, используя простую структуру рендеринга под названием Pixel.

Столкновение отлично работает с формы, как нарисованный круг

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

Вот где он сталкивается с изображениями:

Меньшее изображение: Круговое столкновение в моей игре чуть больше изображения

Увеличенное изображение: Круговое столкновение в моей игре чуть больше изображения

Столкновение делается так:

[s — солнечная панель, показанная на «меньшем изображении», а p — игрок.]

math.Pow(math.Pow(s.center.X-p.center.X, 2)+math.Pow(s.center.Y-p.center.Y, 2), 0.5) <= s.size.X

Size.X и size.Y каждого изображения одинаковы, так как это круг

Центры рассчитаны правильно, и эта точная линия работает с формами [вы можете видеть желтый контур на первом изображении, это форма, с которой она работает].

Я делаю что-то неправильно? Почему из-за этого может возникнуть ошибка, если расчет не имеет ничего общего с самим изображением?

Вот как отображаются изображения, я предполагаю, что проблема как-то связана с этим:

[g является генератором, показанным на «Увеличенном изображении»

func (g Generator) render(win *pixelgl.Window, imd *imdraw.IMDraw) {
    mat := pixel.IM.
        Moved(g.center)
    g.sprite.Draw(win, mat)
}

Фигура также рисуется на основе ее центра.

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
0
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если оба сталкивающихся объекта представляют собой окружности с радиусами R1 и R2, то столкновение происходит, когда

math.Pow(math.Pow(s.center.X-p.center.X, 2)+math.Pow(s.center.Y-p.center.Y, 2), 0.5) <= 
 s.radius + p.radius

Что такое s.size - сторона квадрата изображения? В этом случае вы должны использовать size/2, чтобы получить радиус.
Почему вы игнорируете размер/радиус p?

Эти две причины вместе могут вызвать описанное поведение (условие столкновения срабатывает, когда расстояние между центрами становится равным s размеру стороны)

скоро попробую

HKVariant 16.05.2019 17:37

Работает просто отлично, спасибо за подробности в вашем ответе

HKVariant 16.05.2019 18:14

Другие вопросы по теме