RPG风格碰撞边界

时间:2013-10-11 12:07:41

标签: c# xna collision

我正在制作一款小型RPG游戏,而我目前拥有的是:

*具有动画和基本碰撞的角色; *我测试碰撞的32x32盒子;

这就是现在...... xD

我的角色是32xPixels宽,48xPixels高,32x38。

我有两个矩形,playerRectangle(用于碰撞和移动); 和rectangleAnimation,用于角色动画。

嗯,我的问题是,我如何制作一个仅覆盖角色一半的碰撞矩形?现在我的矩形是32x48,所以我怎么做32x24,没有裁剪图像?

它给出了某种东西的幻觉,例如岩石或树木。

我尝试制作一个单独的精灵,它是32x24并制作了一个矩形,并在我的播放器类中画了两个精灵,但那不起作用......

我的最后一个问题,我应该为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;
    }
}

我在Game1.cs中有一个名为“isColliding”的方法,它检查另一个类矩形和我的playerRectangle中的碰撞..

对不起,这太久了,但是提前谢谢你,告诉我你是否需要了解其他事情:)

3 个答案:

答案 0 :(得分:2)

我会从脑子里写下来...将它添加到你的精灵类中,它将是通用的

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

只需更改offsetXoffsetYoffsetWidthoffSetHeight即可调整碰撞框。所以如果你希望在左上角碰撞5x5像素。然后offsetX=0offestY=0offsetWidth=5offsetHeight=5

并碰撞代码

foreach (Sprite brick in bricklist)
{
   if (player.BoundingBox.Intersects(brick.BoundingBox))
   {
       // do some stuff
   }
}

答案 1 :(得分:1)

如果你想将玩家矩形的高度改为一半,你所要做的就是将playerRectangle.Y值除以2。

答案 2 :(得分: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 velocity = new Vector2(0,0); var moveSpeed = 5; //无论你想要什么

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

this.position + = velocity * Gametime.elapsedGametime; &LT;&LT;认为Gametime是正确的......

Var origin = new vector2(rectangle.width / 2,rectangle.height / 2);这会将精灵的原点设置为矩形的中心,而不是左上角。

假设我们有两个50x50的矩形...来检查你要做的两个之间的碰撞:

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,因此您可能需要更新类的更新方法中的原点...