2016-07-22 9 views
0

В настоящее время я делаю игру с использованием 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?

Заранее благодарим за любую помощь!

+1

Насколько я знаю, лучшим решением, которое у вас есть на данный момент, является отслеживание реального положения в координатах с плавающей запятой, а затем, когда дело доходит до того, чтобы отравить ваш спрайт на экране, округлите его соответствующим образом. Этот ресурс был полезен для меня: [переход субпикселя с pygame] (https://www.willmcgugan.com/blog/tech/post/going-sub-pixel-with-pygame/). Что-то, что также будет влиять на вас, заключается в том, что вы не учитываете «время» при настройке скорости пули. Это приведет к большей погрешности при позиционировании пули. –

+1

Еще одно предложение относительно вашего кода позиционирования и строк, таких как: 'math.sqrt (1 + ((dx ** 2)/(dy ** 2)))': вы знаете, что pygame имеет [Vector2] (http: //www.pygame.org/docs/ref/math.html#pygame.math.Vector2), который представляет _x_, _y_ координаты и имеет такие функции, как 'math.length', что избавляет вас от необходимости писать свой код позиционирования? –

+0

@JonathonOgden Спасибо, я на самом деле не знал, что pygame имеет класс Vector2 и просто использовал список с 2 enteries. Но что такое 'math.length'? –

ответ

1

Я не очень много знаю о Pygame, но подумал ли вы о сохранении своих позиций как нецелых значений, только преобразовании в целые числа на дисплее? Внутреннее представление может быть более точным, чем то, что отображается пользователю.

+0

Не знаете, как я пропустил это, код исправлен прямо сейчас! Благодаря! –