2012-04-25 3 views
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 

を持っている地形。

+1

これは[良い質問](http://stackoverflow.com/faq#dontask)ではありません。いくつかのコードを投稿し、あなたが直面している正確な問題を教えてください - あなたのコードの仕組みがわからないので、どうすれば答えることができますか?ただし、ここで明白な注意点は、[改ざんしない](https://code.google.com/p/pybox2d/)[reinvent](https://code.google.com/p/pymunk/)[the ](http://pybox2d.blogspot.co.uk/)[wheel](http://pyode.sourceforge.net/)。 –

+0

zyeek、私は今あなたのコードを2回フォーマットしました。あなたの質問にコードを貼り付けるとき、それが正しくフォーマットされていることを確認してください。つまり、すべての行の前に4つの_additional_スペースが必要です。また、ソースコードにタブとスペースを混ぜているようです。これは悪い考えです。参照:http://stackoverflow.com/questions/120926/why-does-python-pep-8-strongly-recommend-spaces-over-tabs-for-indentation – Wilduck

+1

あのOK。タブを4つのスペースに設定しました。私がインデントを必要とするとき、管理しやすく、巨大な塊ではありません。 – zyeek

答えて

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に設定する必要があります。

+0

はい、ありがとうございます。私は実際に同じ考えを持っていたクラスメートと話しました。オブジェクトと衝突したときのチェックを終了しました。つまり、その地形に焦点を当てています。もしそうなら、それがプレイヤーの下にあるかどうかを判断する。落ちるのを止める。 – zyeek

+0

それはそれを考える良い方法のように聞こえる - 衝突した地形を隔離する。とにかく、あなたはあなたのところにいるとうれしいです。 – Devourant