(Python)Platformer - 角色跳过/错误放置

时间:2012-03-30 02:40:45

标签: python algorithm pygame

我有一个角色(其(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

这个算法的问题是,当角色触摸平台时,即使底部不在平台上,代码也会将角色放到平台上。

我已经尝试过制作它以使hitbox非常小(1或3像素高),但角色根本不会碰到平台,因为速度会使角色跳过平台。将其设置得更大,如5或7像素,具有与上述相同的问题。

有一种简单的方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我找到答案(实际上花了大约20分钟)。

prevcoordsbodyc的先前坐标,精灵的坐标,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[:]