現在、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++;
}
コードが自身のために話すと思います。基本的にキャラクターが上に動かなくなった場合、falling
はtrue
に設定され、ブロックの上に文字がない限り、fall()
メソッドがトリガーされます。
最後に、文字の衝突矩形が文字の新しい位置に更新されます。
colRect = new Rectangle((int)position.X, (int)position.Y, 64, 48);
position.X
とposition.Y
は、文字のXとYの位置であり、64
と48
は、スプライトの幅と高さです。コリジョン矩形が、私は次のコード
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.topOfBlock
〜true
と表示されます。これは、文字が落ちないことを意味します。 false
の場合はをfalse
に設定し、jumping
もfalseである限り、ヒーロークラスのfall()
メソッドをトリガーします。
最後に、topWall
衝突矩形は、次のように作成されます(それはスクエアのように両方とも30である)、
topWall = new Rectangle((int)position.X, (int)position.Y - size, size, 1);
position.X
とposition.Y
は、X及びY位置であるsize
は、ブロックの幅と高さ、1はそれをちょうど1ピクセル高くすることです。
私が言ったように、問題はジャンプ後にキャラクターが浮かぶことです。開始yの位置は402ピクセルです(最初のブロックのtopWall.Y
は420です。つまり、ゲームがロードされたときにブロックの上に文字が並んでいることを意味します)。ジャンプした後は402に戻ります。一度ジャンプした後、374、373、387、386、...、374、373に戻り、再び387に戻ります。私は何が問題を引き起こしているのか分かりません。私はブロックと文字の両方の衝突の四角形で微妙に変化するような複数のことを試しましたが、何も動作していないようです。 をから削除した場合、私は問題であると思っていましたが、文字がブロックを通過してしまい、修正されません。ここ
ちょうど私が何を意味するか少しより明確にするために、されている2枚の絵:
あなたはジャンプのために 'position.Y - = verticalMovement;'を持っていますか?ジャンプするときに追加してはいけません。また、あなたの 'verticalMovement'はどの値で初期化されますか? – AsheraH
いいえ、Y値が高いほどスプライトが低くなります。ジャンプしたい場合は、Y値を減らす必要があります。つまり、 '+ ='ではなく ' - ='を減らす必要があります。 – lolwut147258369
@AsheraH位置0,0は、プログラミングのほとんどの場合、XNAとwinforms、html ectの場合、左上にあります。 – Steven