Если вы не можете вращаться по Z, то вы можете стрелять кубом только на той же высоте Z, на которой находится пистолет.Это делает вещи намного проще, потому что вы можете сортировать свои кубы по Z и выбрасывать те, которые слишком высоки или слишком низки (это займет log(N)
время в количестве кубов, если они могут быть на дробных высотах; если онивсе одинаковой высоты и все на одной высоте, вы просто индексируете эту часть массива).
Теперь вам нужно нарисовать линию из пушки через сетку и выяснить, к какому ее кубу относитсябьет первымСпособ сделать это с помощью вектора вдоль линии пушки:
v = (cos(angle), sin(angle))
и найти каждую границу, где эта линия пересекает целое число в X или Y. Если мы находимся в
(x0,y0)
для начала и движение в направлении v
, тогда мы нажмем (при условии, что cos (угол)> 0)
ceil(x0), ceil(x0+1), ...
иногда
(ceil(x0)-x0)/cos(angle), (ceil(x1)-x1)/cos(angle), ...
и аналогичноy0
и sin(angle)
.Теперь вы просто идете по списку раз - который приведет вас в новый квадрат - и когда вы впервые столкнетесь с кубом, вы нажмете на него.
Если массив кубов не гигантский, весь этотштука должна занимать всего несколько микросекунд на приличном процессоре (может быть, несколько сотен или около того на встроенном процессоре).