Я реализую круговое столкновение в своей игре, созданной на 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)
}
Фигура также рисуется на основе ее центра.
Если оба сталкивающихся объекта представляют собой окружности с радиусами 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
размеру стороны)
Работает просто отлично, спасибо за подробности в вашем ответе
скоро попробую