0

私は小さなRPGゲームに取り組んでおり、現在持っているものは次のとおりです。

*アニメーションと基本的な衝突を伴うキャラクター; *衝突をテストする 32x32 のボックス。

今のところは以上です..xD

私のキャラクターは、幅 32xPixels、高さ 48xPixels、32x38 です。

そして、私は2つの長方形を持っていますplayerRectangle(衝突と移動用); そしてrectangleAnimation、キャラクターアニメーション。

ええと、私の質問は、キャラクターの半分だけをカバーする衝突長方形をどのように作成するのですか? 現在、私の長方形は32x48ですが、画像をトリミングせずに 32x24 にするにはどうすればよいですか?

岩や木など、何かの前にいるような錯覚を与えます。

32x24 の別のスプライトを作成しようとしましたが、それを長方形にして、プレーヤー クラスで 2 つのスプライトを描画しましたが、うまくいきませんでした...

CollisionHandler.cs最後の質問ですが、壁や箱などのすべての固体のように、別のクラスを作成する必要がありますか?

プレーヤーの移動コードは次のとおりです(異なるサイズの長方形を作成しようとはしていません):

if (keyState.IsKeyDown(Keys.Left))
{ 
    playerRectangle.X -= playerSpeed; 
    movingLeft = true;
    movingRight = false; 
}    
else if (keyState.IsKeyDown(Keys.Right))
{ 
    playerRectangle.X += playerSpeed; 
    movingRight = true; 
    movingLeft = false; 
}

if (keyState.IsKeyDown(Keys.Up))
{ 
    playerRectangle.Y -= playerSpeed; 
    movingUp = true;
    movingDown = false;
}
else if (keyState.IsKeyDown(Keys.Down))
{ 
    playerRectangle.Y += playerSpeed; 
    movingDown = true; 
    movingUp = false; 
}

(コードが乱雑に見えて申し訳ありません。私はこのサイトに不慣れで、構造化する方法がわかりません:/)

そして私の衝突チェック(Game1.csにあります):

if(isColliding())
{
    if (player.movingRight)
    {
        player.playerRectangle.X -= player.playerSpeed;
    }
    else if (player.movingLeft)
    {
        player.playerRectangle.X += player.playerSpeed;
    }

    if (player.movingUp)
    {
        player.playerRectangle.Y += player.playerSpeed;
    }
    else if(player.movingDown)
    {
        player.playerRectangle.Y -= player.playerSpeed;
    }
}

「isColliding」と呼ばれるメソッドがありGame1.cs、別のクラスの四角形と私の playerRectangle の衝突をチェックします。

長くなって申し訳ありませんが、よろしくお願いします。他に何か知っていることがあれば教えてください :)

4

3 に答える 3

2

私は頭から書きます...これをスプライトクラスに追加すると、ユニバーサルになります

public Rectangle BoundingBox
{
 get { return new Rectangle((int)Position.X + offsetX, (int)Position.Y + offsetY, Texture.Width - offsetWidth, Texture.Height - offsetWidth); }
}

offsetXoffsetY、を変更するだけでoffsetWidthoffSetHeight衝突ボックスを調整できます。そのため、5x5 ピクセルの左上隅で衝突したい場合。次にoffsetX=0、、、offestY=0_ offsetWidth=5_offsetHeight=5

コードを衝突させる

foreach (Sprite brick in bricklist)
{
   if (player.BoundingBox.Intersects(brick.BoundingBox))
   {
       // do some stuff
   }
}
于 2013-10-11T13:26:07.110 に答える
1

Vector2.Distance(playerPosition, objectToCheck); を使用します。

if(Vector2.Distance(playerPosition,objectToCheck < player.rectangle.width/2){
 //If  the player is too close to the object you wish to check
 //Do something...
}

衝突については、プレーヤーの更新メソッドで、「彼」が何かと衝突したかどうかを確認するだけです - vector.distance を使用して^^

あなたは運動ロジックが悪いです:

速度を使用する必要があります。

var 速度 = 新しい Vector2(0,0); var moveSpeed = 5; //あなたが望むものなら、なんでも

if(player presses right){
   velocity.X += moveSpeed;
}
if(player presses up){
   velocity.y += moveSpeed;
}

this.position += 速度 * Gametime.elapsedGametime; << Gametime は正しいと思います...

Var origin = new vector2(rectangle.width /2,rectangle.height/2); これにより、スプライトの原点が左上ではなく長方形の中心に設定されます。

両方とも 50x50 の 2 つの長方形があるとします... 2 つの間の衝突をチェックするには、次のようにします。

if(Vector2.Distance(rectangle1.position, rectangle2.position < rectangle1.width/2){

    //If the distance between the two rectangles (from the middle of the rectangle(the       origin we just set is less than then half of the width of the rectangle... we have a collision.
}

数か月間 XNA を使用していないため、クラスの update メソッドでオリジンを更新する必要があるかもしれません...

于 2013-10-11T12:15:59.143 に答える