0

我正在开发一款小型 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 中的碰撞。

对不起,这太长了,但提前谢谢你,如果你需要知道别的东西,请告诉我:)

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); }
}

只需更改offsetX, offsetY, offsetWidth,offSetHeight即可调整碰撞框。因此,如果您希望在 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

如果您想将播放器矩形的高度更改一半,您只需将 playerRectangle.Y 值除以 2。

于 2013-10-11T12:13:03.197 回答
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; <<认为游戏时间是正确的......

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,所以你可能需要在你的类的 update 方法中更新原点......

于 2013-10-11T12:15:59.143 回答