シンプルなプラットフォームゲームを作ろうとしています。プレーヤーは正方形で、プラットフォームはすべて正方形です。私は XNA の初心者ですが、C# 4.0 の経験はわずかです。
私のコードの問題は、キャラクターがプラットフォームの下側を通過するとき、通過しないように設定しているにもかかわらず、通過し続けることです。
これを修正できないため、事前に誰かが私を助けてくれるかどうか尋ねたいと思います.
コードのさまざまな部分がどのように連携するかを次に示します。
- platform 構造体では、画像が読み込まれ、次の 3 つの値のいずれかを保持できる列挙型が格納されます。
- 修正が必要な衝突検出方法 (交差点をチェックし、その特定のプラットフォームの列挙型をチェックし、通過できるかどうかを判断し、以下を含む配列を返します: {isabove, isbelow, isleft, isright} のプラットフォーム)
- プレイヤーがプラットフォームの上にいる場合は true を返しますが、プラットフォームの下にぶつかっても何も起こりません。
- 重力と垂直方向の動きを扱う私のプレーヤーの垂直方向の動き、それが原因かもしれませんが、私にはわかりません。更新ループの最初に衝突チェックが実行され、その後垂直方向のモーション メソッドが実行されます。
衝突のコードは次のとおりです。
public bool[] environmentCollisionDetect(Charachter thing, ScreenObjects sreenobjectlist, bool[] platformstatus)
{
//Defaults the collision to false
platformstatus[0] = false; //Above platform
platformstatus[1] = false; //Below Platform
platformstatus[2] = false; //Left
platformstatus[3] = false; //Right
//Store the player in boxA
boxA.Height = thing.image.Height;
boxA.Width = thing.image.Width;
boxA.X = (int)thing.position.X;
boxA.Y = (int)thing.position.Y;
//Find a collision
foreach (Platform platform in screenobjectlist)
{
//Makes sure the platform cannot be passed through
if (platform.platformCollisionProperty != platformCollision.passable)
{
//Store the platform's rectangle
boxB = platform.destinationrectangle;
boxB.Height = platform.image.Height;
boxB.Width = platform.image.Width;
boxB.X = (int)platform.destinationrectangle.X;
boxB.Y = (int)platform.destinationrectangle.Y;
//Collision Check
if (boxA.Intersects(boxB))
{
switch (platform.platformCollisionProperty)
{
//Platform is Solid
case platformCollision.impassible:
//Player is below it
if (boxA.Top > boxB.Bottom)
{
platformstatus[1] = true;
}
//Player is above it
if (boxA.Bottom > boxB.Top)
{
platformstatus[0] = true;
}
break;
//Platform can be passed through bottom
case platformCollision.platform:
if (boxA.Bottom > boxB.Top)
{
platformstatus[0] = true;
}
break;
}
break;
}
}
}
return platformstatus;
}
垂直モーションコードは次のとおりです。
- ジャンプボタンがアクティブになると、 isJumping bool が true に設定されます
- isinair bool は、このループ内でのみ使用され、プレイヤーがまだ空中を滑空しているかどうかを判断します
最後に、タイマーを機能させることができなかったため、カウンターとして使用されます
public void verticalMotionI(GameTime gametime) { //Resets the bools if not standing on platform if ((this.isJumping == true) && (this.platformstatus[0] == false)) { this.i = 0; this.isJumping = false; this.isinair = false; } //Jumps if A button is activated and standing on a platform else if ((this.isJumping == true) && (this.platformstatus[0] == true)) { //Set up bools to jump this.isJumping = false; this.isinair = true; //Overwrites the start time this.starttime = currentime; //Move up this.position.Y -= this.playermovementspeed * 1.5f; //Increase counter this.i++; } //Pulls stops moving player if jumptimer had elapsed else if ((this.isinair == true) && (i == this.jumptime)) { this.isinair = false; //Apply gravity Gravity.forceofGravity(this); } //Stops the jump if bottom of a platform is hit else if ((this.isinair == true) && (this.platformstatus[1] == true)) { //Reset bools this.isinair = false; //reset I this.i = 0; //Apply gravity Gravity.forceofGravity(this); } //Continues the jump if in air else if ((this.isinair == true) && (this.platformstatus[1] == false)) { //Move up this.position.Y -= this.playermovementspeed * 1.5f; //Increase counter this.i++; } //Apply Gravity else if ((this.isinair == false) && (this.platformstatus[0] == false)) { //reset I this.i = 0; Gravity.forceofGravity(this); } }