Я делаю клон Астероидов, и у меня есть корабль, который плавно движется с помощью клавиш со стрелками. Корабль имеет скорость xv
и yv
, и для его перемещения я просто изменяю rect.x
и rect.y
спрайта на xv
и yv
соответственно. Как только я позволю go клавиш со стрелками, я бы хотел, чтобы они плавно замедлялись. Чтобы сделать это, я в настоящее время умножаю xv
и yv
на 0,96 каждый кадр, что одновременно замедляет корабль и обеспечивает максимальную скорость.
На первый взгляд кажется, что это работает нормально, но если присмотреться, у корабля будут странные схемы движения; например, иногда он будет немного замедляться, прежде чем перестанет двигаться вниз, но будет продолжаться с постоянной скоростью в направлении оси x. Иногда спрайт будет останавливаться или значительно замедляться по краям экрана, пока он находится в таком режиме, что не должно происходить, потому что у меня есть код на месте, так что он должен переместиться на другую сторону.
Я подозреваю, что это странное поведение связано с округлением в rect
или sprite
частях Pygame, но я не уверен, как это исправить. Я попытался автоматически установить скорость на ноль, как только она станет достаточно низкой, но проблема сохраняется и иногда ухудшается.
Вот мой код для класса Player
:
import pygame as pg
import Settings as s
import math
class Player(pg.sprite.Sprite):
global rect, r, xv, yv, v, track, images, pthrust
def __init__(self, x = (s.w-30)/2, y = (s.h-45)/2, r = math.pi, xv = 0, yv = 0, v = .5):
pg.sprite.DirtySprite.__init__(self)
self.r = r
self.v = v
self.xv = xv
self.yv = yv
self.rect = pg.Rect(x, y, 30, 45)
self.radius = 1
self.images = [pg.image.load('Player.png').convert_alpha(), pg.image.load('PThrust.png').convert_alpha()]
self.imagec = self.images[0]
self.image = self.imagec
self.pthrust = False
def thrust(self): # Called every frame while up arrow is down
self.xv += self.v*math.sin(self.r) # Accelerate the player
self.yv += self.v*math.cos(self.r)
self.imagec = self.images[1]
self.pthrust = True
def unthrust(self): # Called when up arrow is released
self.imagec = self.images[0]
self.pthrust = False
def turnLeft(self): # Called every frame while left arrow is down
self.r += math.pi/48
def turnRight(self): # Called every frame while right arrow is down
self.r -= math.pi/48
def move(self): # Called every frame
self.xv *= .96 # Decelerates the Player
self.yv *= .96
self.rect.left += self.xv # Changes the rect position
self.rect.top += self.yv
if self.rect.centerx < 0: self.rect.centerx = s.w+self.rect.centerx # Loop around edges of screen
if self.rect.centery < 0: self.rect.centery = s.h+self.rect.centery
if self.rect.centerx > s.w: self.rect.centerx = self.rect.centerx-s.w
if self.rect.centery > s.h: self.rect.centery = self.rect.centery-s.h
self.image = pg.transform.rotate(self.imagec, math.degrees(self.r)-180) # Rotate image
self.rect = self.image.get_rect(center=self.rect.center)
def reset(self): # Return to center if player dies
self.rect.x = (s.w-30)/2
self.rect.y = (s.h-45)/2
self.r = math.pi
self.xv = 0
self.yv = 0
Если у кого-нибудь есть идеи, они будут очень благодарны. Заранее спасибо!
Редактировать: Если код для основного класса был бы полезен, я могу предоставить его, но я не думаю, что он имеет отношение к проблеме и займет много места.