2016-12-08 15 views
1

現在、Monogameを使用して2dプラットフォームで作業しています。私はスプライトを描くことができます、私はキャラクターとレベルを描くことができます、私はキャラクターを移動してジャンプすることができますが、私がジャンプすると、私のキャラクターはそれに着陸の代わりにレベルブロックの上に "浮動"。左右の衝突はうまく動作し、停止するときに停止しますが、ジャンプすると正しく着陸しません。私は次のコードを持っています:C#Monogame:ジャンプした後の "浮動"スプライト

プレイヤーがジャンプしたいかどうかをチェックするには、上向き矢印が押されているかどうかをチェックします。

if(state.IsKeyDown(Keys.Up) && hasJumped == false) 
{ 
    jumping = true; 
} 

キー入力のチェックが行われた後、文字が落下した場合jumping変数はあなたがジャンプするかどうか

if (jumping == true) 
{ 
    jump(); 
} else if (falling == true && topOfBlock == false) 
{ 
    fall(); 
} 
else 
{ 
    hasJumped = false; 
    verticalMovement = 14; 
} 

基本的にjumpingをチェックし、fallingチェック真であるかどうかを確認するためのチェックがありますtopOfBlockは、文字がブロックの上にあるかどうかをチェックし、hasJumpedは、ジャンプが現在進行中である(ダブルジャンプが不可能である)かどうかをチェックし、verticalMovementは1文字あたりジャンプするピクセルの量です。

jump()fall()方法を見て、次のように:

private void jump() 
{ 
    if (verticalMovement >= 0) 
    { 
     position.Y -= verticalMovement; 
     verticalMovement--; 
    } else 
    { 
     jumping = false; 
     hasJumped = true; 
     falling = true; 
    } 
} 

public void fall() 
{ 
    position.Y += verticalMovement; 
    verticalMovement++; 
} 

コードが自身のために話すと思います。基本的にキャラクターが上に動かなくなった場合、fallingtrueに設定され、ブロックの上に文字がない限り、fall()メソッドがトリガーされます。

最後に、文字の衝突矩形が文字の新しい位置に更新されます。

colRect = new Rectangle((int)position.X, (int)position.Y, 64, 48); 

position.Xposition.Yは、文字のXとYの位置であり、6448は、スプライトの幅と高さです。コリジョン矩形が、私は次のコード

private void checkCollision() 
{ 
    bool topCol = false; 
    for (int x = 0; x < blockTileArray.GetLength(0); x++) 
    { 
     for (int y = 0; y < blockTileArray.GetLength(1); y++) 
     { 
      if (blockTileArray[x, y] != null) 
      { 
       if (hero.colRect.Intersects(blockTileArray[x, y].topWall)) 
       { 
        topCol = true; 
       } 

      } 
     } 
    } 

    if(topCol == true) 
    { 
     hero.topOfBlock = true; 
    } else 
    { 
     hero.topOfBlock = false; 
    }  
} 

topColを持つブロックの衝突矩形と交差するかどうかを確認するには

はブロックかどうかのトップとの衝突がありますかどうかをチェックするブール値です。ループは、配列内のすべてのブロックが文字と交差するかどうかを確認します(topWall)。その場合は、topColをtrueに設定します。ループの後、topColが真であるかどうかをチェックします。そうであれば、hero.topOfBlocktrueと表示されます。これは、文字が落ちないことを意味します。 falseの場合はをfalseに設定し、jumpingもfalseである限り、ヒーロークラスのfall()メソッドをトリガーします。

最後に、topWall衝突矩形は、次のように作成されます(それはスクエアのように両方とも30である)、

topWall = new Rectangle((int)position.X, (int)position.Y - size, size, 1); 

position.Xposition.Yは、X及びY位置であるsizeは、ブロックの幅と高さ、1はそれをちょうど1ピクセル高くすることです。

私が言ったように、問題はジャンプ後にキャラクターが浮かぶことです。開始yの位置は402ピクセルです(最初のブロックのtopWall.Yは420です。つまり、ゲームがロードされたときにブロックの上に文字が並んでいることを意味します)。ジャンプした後は402に戻ります。一度ジャンプした後、374、373、387、386、...、374、373に戻り、再び387に戻ります。私は何が問題を引き起こしているのか分かりません。私はブロックと文字の両方の衝突の四角形で微妙に変化するような複数のことを試しましたが、何も動作していないようです。 をから削除した場合、私は問題であると思っていましたが、文字がブロックを通過してしまい、修正されません。ここ

ちょうど私が何を意味するか少しより明確にするために、されている2枚の絵:

When the game loads

After jumping once

+0

あなたはジャンプのために 'position.Y - = verticalMovement;'を持っていますか?ジャンプするときに追加してはいけません。また、あなたの 'verticalMovement'はどの値で初期化されますか? – AsheraH

+0

いいえ、Y値が高いほどスプライトが低くなります。ジャンプしたい場合は、Y値を減らす必要があります。つまり、 '+ ='ではなく ' - ='を減らす必要があります。 – lolwut147258369

+0

@AsheraH位置0,0は、プログラミングのほとんどの場合、XNAとwinforms、html ectの場合、左上にあります。 – Steven

答えて

0

は、あなたはそれがtopColが真であるかどうかをチェックするループした後、」

を言いますそうでない場合は、hero.topOfBlockがtrueになります。これは文字が落ちないことを意味します。

これは、if-then条件に該当します。文字のY座標をタイルの上部に設定することについては言及していません。それが問題を引き起こすかどうかは分かりません。checkCollisionを呼び出すタイミングによって異なりますが、それはおそらく問題の一部です。

関連する問題