Проблема с 2D обнаружением столкновений от новичка - PullRequest
1 голос
/ 30 июля 2010

Я прошел начальный курс по информатике, но некоторое время назад решил попробовать создать игру.У меня проблема с обнаружением столкновений.Моя идея состояла в том, чтобы переместить объект, и, если есть столкновение, переместите его назад, как он пришел, пока не прекратится столкновение.Вот мой код:

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 пикселей, когда я сталкиваюсь со стеной,Если я отпущу клавишу со стрелкой, спрайт навсегда застрянет в стене.Мне интересно, почему спрайт в первую очередь находится внутри стены, так как к тому времени, когда я перевожу спрайт на экран, он должен был быть перемещен прямо за стену.

Что-то не так с моим методом, или проблема заключается в моем исполнении?

1 Ответ

1 голос
/ 30 июля 2010

Похоже, вы устанавливаете хитбокс ДО обновления позиции.Исправление кажется простым.

Найти:

    self.hitBox = Rect(self.gPos.x, self.gPos.y, 40, 40)
    self.gPos += self.velocity  

Заменить:

    self.gPos += self.velocity  
    self.hitBox = Rect(self.gPos.x, self.gPos.y, 40, 40)

Другие предложения: Что вы должны сделать, это проверить позициюДО того, как вы переедете туда, и если он занят, не двигайтесь.Это не проверено, поэтому, пожалуйста, просто используйте это как psuedocode, предназначенный для иллюстрации:

class Player(object):  
    ...  
    def move(self):
        #at this point, velocity = some linear combination of (5, 0)and (5, 5)
        #gPos and velocity are types Vector2    
        selfCopy = self
        selfCopy.gPos += self.velocity
        selfCopy.hitBox = Rect(selfCopy.gPos.x, selfCopy.gPos.y, 40, 40)
        if not CheckCollisions(selfCopy)    
            self.gPos += self.velocity
    ...
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...