2012-03-30 6 views
0

Ich habe ein Zeichen (dessen (x, y) Position in bodyc gespeichert ist), und eine Reihe von Plattformen. Diese Plattformen werden in einer Variablen "plist" dargestellt und in der Mode [[x, y], pygame.Surface-Instanz] gespeichert. Der Charakter springt mit der Geschwindigkeit.(Python) Platformer - Charakter überspringt/falsch platziert

Dies ist mein aktueller Algorithmus:

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 

Das Problem mit diesem Algorithmus ist, dass, wenn der Charakter die Plattform zu berühren, auch wenn der Boden nicht auf der Plattform ist, wird der Code das Zeichen auf denen setzt Plattform sowieso.

Ich habe versucht, es so zu machen, dass die Hitbox sehr klein ist (1 oder 3 Pixel hoch), aber der Charakter berührt die Plattform überhaupt nicht, weil die Geschwindigkeit den Charakter über die Plattform springen lässt. Wenn Sie den Wert auf 5 oder 7 Pixel erhöhen, tritt dasselbe Problem auf, wie oben beschrieben.

Gibt es eine einfache Möglichkeit, dies zu beheben?

Antwort

1

Ich fand die Antwort (es dauerte etwa 20 Minuten, um es zu tun).

prevcoords sind die vorherigen Koordinaten von bodyc, die Koordinaten des Sprites, yvelocity ist die y-Geschwindigkeit des Zeichens.

Für zukünftige Programmierer, die auch mit dem "Platforming-Problem" festgefahren sind: Sie müssen dieses Programm ändern, wenn Sie einen Multi-Screen-Platformer machen wollen, weil das wirklich ineffizient ist. Dies funktioniert möglicherweise auch nicht mit asymmetrischen Sprites.

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[:]