2012-03-30 15 views
0

キャラクタ(その(x、y)の位置がbodycに格納されています)と複数のプラットフォームがあります。これらのプラットフォームは変数 "plist"で表され、ファッション[[x、y]、pygame.Surfaceインスタンス]に格納されます。キャラクターは速度でジャンプする。(Python)Platformer - 文字がスキップされる/間違って配置される

これは私の現在のアルゴリズムである:

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

答えを見つけました(実際には約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[:] 
関連する問題