(Python) Platformer - персонаж пропускает / неправильно помещается - PullRequest
0 голосов
/ 30 марта 2012

У меня есть персонаж (чья (x, y) позиция хранится в bodyc) и несколько платформ.Эти платформы представлены в переменной «plist» и хранятся в моде [[x, y], экземпляр pygame.Surface].Персонаж прыгает со скоростью.

Это мой текущий алгоритм:

def onplatform(self):
    for i in plist:
        if intersect(i[0]+list(i[1].get_size()), [bodyc[0], bodyc[1], 50, 50]):
            return True, plist.index(i)
        return False, len(plist)

onplat=self.onplatform()
if yvelocity!=-13:
    bodyc[1]-=yvelocity
if yvelocity>-12: yvelocity-=1
if yvelocity==-13 and not onplat[0]: yvelocity=-1
if onplat[0] and -13<yvelocity<-1:
    yvelocity=-13
    bodyc[1]=plist[onplat[1]][0][1]-50 #(y-value of platform)-50
if pressed[pygame.K_UP] and yvelocity==-13:
    yvelocity=13

Проблема с этим алгоритмом заключается в том, что когда персонаж касается платформы, даже если дно не находится наплатформа, код все равно поместит персонажа на платформу.

Я пытался сделать так, чтобы хитбокс был очень маленьким (1 или 3 пикселя в высоту), но персонаж совсем не касался платформы, потому что скорость заставляет персонажа перепрыгивать через платформу.Установка большего размера, например, 5 или 7 пикселей, имеет ту же проблему, что и описанная выше.

Есть ли простой способ исправить это?

1 Ответ

1 голос
/ 03 апреля 2012

Я узнал ответ (на самом деле это заняло около 20 минут).

prevcoords - предыдущие координаты bodyc, координаты спрайта, yvelocity - скорость y символа.

Для будущих программистов, которые также столкнулись с «проблемой платформера»: вам придется изменить эту программу, если вы хотите сделать многоэкранный платформер, потому что это действительно неэффективно. Кроме того, это может не работать с асимметричными спрайтами.

def intersect(recta, rectb):
    a=(rectb[1]+rectb[3]<recta[1]) or (recta[1]+recta[3]<rectb[1]) #up, down
    b=(rectb[0]+rectb[2]<recta[0]) or (recta[0]+recta[2]<rectb[0]) #left, right
return not(a or b)

def onplatform(self):
    for i in plist:
        if intersect(i[0]+[i[1].get_width(), 1], [bodyc[0], bodyc[1]+47, 50, 3]):
            return True, plist.index(i)

onplat=self.onplatform()
if yvelocity!=-13:
    bodyc[1]-=yvelocity
    for i in plist:
        temp=i[0][0]<bodyc[0]+50<i[0][0]+i[1].get_width()
        temp2=i[0][0]<bodyc[0]<i[0][0]+i[1].get_width()
        if prevcoords[1]+50<=i[0][1]<=bodyc[1]+50 and (temp or temp2):
            bodyc[1]=i[0][1]-50
            yvelocity=-13
            break
if yvelocity>-12: yvelocity-=1
if yvelocity==-13 and not onplat[0]: yvelocity=-1
if pressed[pygame.K_UP] and yvelocity==-13:
    yvelocity=13
prevcoords=bodyc[:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...