我有一个角色(其(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像素,具有与上述相同的问题。
有一种简单的方法可以解决这个问题吗?
答案 0 :(得分:1)
我找到答案(实际上花了大约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[:]