Я прошел вводный курс по компьютерным наукам, но недавно решил попробовать сделать игру. У меня проблема с обнаружением столкновений. Моя идея заключалась в том, чтобы переместить объект и, если произошло столкновение, переместить его в исходное положение до тех пор, пока столкновение не прекратится. Вот мой код:
class Player(object):
...
def move(self):
#at this point, velocity = some linear combination of (5, 0)and (0, 5)
#gPos and velocity are types Vector2
self.hitBox = Rect(self.gPos.x, self.gPos.y, 40, 40)
self.gPos += self.velocity
while CheckCollisions(self):
self.gPos -= self.velocity/n #see footnote
self.hitBox = Rect(self.gPos.x, self.gPos.y, 40, 40)
...
def CheckCollisions(obj):
#archList holds all 'architecture' objects, solid == True means you can't walk
#through it. colliderect checks to see if the rectangles are overlapping
for i in archList:
if i.solid:
if i.hitBox.colliderect(obj.hitBox):
return True
return False
*Я подставил несколько разных значений для n, как целых, так и с плавающей запятой, чтобы изменить приращение, на которое игрок перемещается назад. Я думал, что, попробовав большой поплавок, он будет перемещаться только на один пиксель за раз.
Когда я запускаю программу, спрайт игрока очень быстро вибрирует в диапазоне около 5 пикселей всякий раз, когда я натыкаюсь на стену. Если я отпущу клавишу со стрелкой, спрайт навсегда застрянет в стене. Мне интересно, почему спрайт в первую очередь находится внутри стены, поскольку к тому времени, когда я вывел спрайт на экран, он должен был быть перемещен сразу за стену.
Что-то не так с моим методом или проблема заключается в моем исполнении?