В настоящее время я делаю игру с использованием Pygame, Python 3 и одной из ошибок, которые у меня есть, это то, что они перемещают. Игра представляет собой 2D сверху вниз шутер, а код для игрока съемки механик ниже:Diagonal Sprite Movement in Pygame, Python 3
(player_rect
является Rect для игрока, bullet_speed является предопределенным int
)
if pygame.mouse.get_pressed()[0]:
dx = mouse_pos[0]-player_rect.centerx
dy = mouse_pos[1]-player_rect.centery
x_speed = bullet_speed/(math.sqrt(1+((dy**2)/(dx**2))))
y_speed = bullet_speed/(math.sqrt(1+((dx**2)/(dy**2))))
if dx < 0:
x_speed *= -1
if dy < 0:
y_speed *= -1
#surface, rect, x-speed, y-speed
player_shots.append([player_shot_image, player_shot_image.get_rect(centerx=player_rect.centerx, centery=player_rect.centery), x_speed, y_speed])
Позже в петле, то эта часть кода:
for player_shot_counter in range(len(player_shots)):
player_shots[player_shot_counter][1][0] += player_shots[player_shot_counter][2]
player_shots[player_shot_counter][1][1] += player_shots[player_shot_counter][3]
Эта механика работает в основном хорошо, за исключением одной крупной ошибки: чем медленнее выстрел, тем менее точно оно, как pygame.Rect[0]
и pygame.Rect[1]
может O nly - целочисленные значения. Например, если player_rect.center
является (0, 0)
, положение мыши является (100, 115)
и bullet_speed является 10
, то x_speed
автоматически вокруг к 7
и y_speed
к 8
, в результате чего в конечном счете пули, проходящей через точку (98, 112)
. Однако, если bullet_speed - 5
, то пуля пройдет через точку (99, 132)
.
Есть ли способ обойти это в pygame?
Заранее благодарим за любую помощь!
Насколько я знаю, лучшим решением, которое у вас есть на данный момент, является отслеживание реального положения в координатах с плавающей запятой, а затем, когда дело доходит до того, чтобы отравить ваш спрайт на экране, округлите его соответствующим образом. Этот ресурс был полезен для меня: [переход субпикселя с pygame] (https://www.willmcgugan.com/blog/tech/post/going-sub-pixel-with-pygame/). Что-то, что также будет влиять на вас, заключается в том, что вы не учитываете «время» при настройке скорости пули. Это приведет к большей погрешности при позиционировании пули. –
Еще одно предложение относительно вашего кода позиционирования и строк, таких как: 'math.sqrt (1 + ((dx ** 2)/(dy ** 2)))': вы знаете, что pygame имеет [Vector2] (http: //www.pygame.org/docs/ref/math.html#pygame.math.Vector2), который представляет _x_, _y_ координаты и имеет такие функции, как 'math.length', что избавляет вас от необходимости писать свой код позиционирования? –
@JonathonOgden Спасибо, я на самом деле не знал, что pygame имеет класс Vector2 и просто использовал список с 2 enteries. Но что такое 'math.length'? –