0

これまでのところ、私は平らなプラットフォームと私のキャラクターを上に置いて始めました.

重力とジャンプ機能を実装しました。

したがって、重力の概念は次のように機能し、プレイヤーが下のオブジェクトと衝突するまで下に落下し続けます。

したがって、これは、ヒーローの下に平らなプラットフォームがある場合に機能しますが、屋根を実装したい場合に機能します。だから私のプレーヤーの上と下に平らなプラットフォーム。

私の重力関数はただ落ち続けています。私の地形はすべてpygame.Rectのリストにあります。

私の重力関数はすべての地形を反復し、プレイヤーが床オブジェクトの上にあるかどうかを確認し、そうであれば落下し続けます。

私が気付いた問題は、キャラクターの上にオブジェクトがあるため、落下し続けることです。キャラクターの上にあるタイルを無視して、プレイヤーの下にあるタイルだけに注目し、共謀をチェックする方法がわかりません。

この共謀の問題を理解したら、ジャンプして屋根との衝突を確認し、左右に移動するときにそれを理解できると確信しています。

助けていただければ幸いです。

編集: 地形は私のオブジェクト タイルのリストです。現在、地形には 2 つのオブジェクトしかありません

#this is not correct way initialize just displaying my 2 object's rect
terrain = [<rect(400, 355, 50, 49)>,<rect(500, 198, 50, 49)>]

def GRAVITY(self, terrain):
    '''----------break is cutting of parsing the rest of the terrain.
    ----------Need to search through each terrain. Keep falling until collide with an object under the hero ONLY.
    '''
    for i in range(len(terrain)):
        print i
        #stop falling when colliding with object
        if terrain[i].top > self.rect.bottom:
            print 'above tile while falling'
            self.y += JUMPRATE
            break
        #continue falling if not standing on the object. Also catch when walking of an object then fall.
        elif terrain[i].top <= self.rect.bottom and not self.rect.colliderect(terrain[i]):
            print 'whoops missed tile'
            self.y +=JUMPRATE
            break
        else:
            print 'on tile'
            self.y = self.y
            break

プレイヤーがジャンプしたときに呼び出される関数です。

4

1 に答える 1

2

あなたのコードでは、各節に break ステートメントがあるためRect、リスト内の数に関係なく、ループは常に 1 回実行されます。

あなたができることは、collidedフラグを使用して、衝突が発生したときにのみ中断することです。

def fall(self, terrain):
   collided = False
   for rect in terrain:
       if self.rect.colliderect(rect):
           collided = True
           break
   if not collided:
       self.y += JUMPRATE

衝突がなければ、キャラクターは落下します。そうでないと動かない。ただし、横から衝突する場合を処理するために何かを追加する必要があります。また、キャラクターの足が床を少し突き抜けてしまうので、ぶつかったらキャラクターの足をrect.bottom地形に合わせる必要があります。top

于 2012-04-26T12:07:33.140 に答える