当前位置: 首页 > 知识库问答 >
问题:

带碰撞的动画?

贲功
2023-03-14

我有一个玩家类,是一个马里奥角色。当我向左走时,我调用一个方法来启动左动画并设置速度。

现在我的问题是:如何为玩家制作碰撞矩形?这是我的矩形:rectangle=新矩形(currentFrame*frameWidth,0,frameWidth,frameHeight)

它使用我的当前帧变量,以及frameWidthHeight

我还有一个rectanlgeheloper类,如下所示:

public static class RectangleHelper
{

    public static bool TouchTopOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Bottom >= r2.Top - 1 &&
                r1.Bottom <= r2.Top + (r2.Height / 2) &&
                r1.Right >= r2.Left + r2.Width / 5 &&
                r1.Left <= r2.Right - r2.Height / 6);
    }

    public static bool TouchBottomOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Top <= r2.Bottom + (r2.Height / 5) &&
                r1.Top >= r2.Bottom - 1 &&
                r1.Right >= r2.Left + r2.Width / 5 &&
                r1.Left <= r2.Right - r2.Width / 5);
    }

    public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Right <= r2.Right &&
                r1.Right >= r2.Left - 5 &&
                r1.Top <= r2.Bottom - (r2.Width / 4) &&
                r1.Bottom >= r2.Top + (r2.Width / 4));  
    }

    public static bool TouchRightOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Left >= r2.Right &&
                r1.Left <= r2.Right + 5 &&
                r1.Top <= r1.Bottom - (r2.Width / 4) &&
                r1.Bottom >= r2.Top + (r2.Width / 4));
    }
}

在我的平铺类中,它在地图上绘制平铺:

class Tiles
{
    protected Texture2D texture;

    private Rectangle rectangle;

    public Rectangle Rectangle
    {
        get { return rectangle; }
        protected set { rectangle = value; }
    }

    private static ContentManager content;
    public static ContentManager Content
    {
        protected get { return content; }
        set { content = value; }
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(texture, rectangle, Color.White);
    }

}

class CollisionTiles : Tiles
{
    public CollisionTiles(int i, Rectangle newRectangle)
    {
        texture = Content.Load<Texture2D>("Tiles/Tile" + i);
        this.Rectangle = newRectangle;
    }
}

如有必要,我的Map类将生成Map/level:

class Map
{
    private List<CollisionTiles> collisionTiles = new List<CollisionTiles>();

    public List<CollisionTiles> CollisionTiles
    {
        get { return collisionTiles; }
    }

    private int width, height;
    public int Width
    {
        get { return width; }
    }
    public int Height
    {
        get { return height; }
    }

    public Map() { }

    public void Generate(int[,] map, int size)
    {
        for (int x = 0; x < map.GetLength(1); x++)
            for (int y = 0; y < map.GetLength(0); y++)
            {
                int number = map[y, x];

                if (number > 0)
                {
                    CollisionTiles.Add(new CollisionTiles(number, new Rectangle(x * size, y * size, size, size)));

                    width = (x + 1) * size;
                    height = (y + 1) * size;
                }
            }
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        foreach (CollisionTiles tile in collisionTiles)
            tile.Draw(spriteBatch);
    }
}

那么,我如何在我的player类中创建另一个矩形,以便它可以使用碰撞呢?

提前谢谢你,如果你还需要知道什么,告诉我。


共有1个答案

拓拔骁
2023-03-14
匿名用户

rectangle = new Rectangle(playerPosition.X, playerPosition.Y, playerTexture.Width, playerTexture.Height);

如果要检测碰撞,请在“更新无效”中执行以下操作:

player.animationRectangle.X = player.rectangle.X;
player.animationRectangle.Y = player.rectangle.Y;
foreach (CollistionTiles tile in map.CollisionTiles)
{
   if (player.rectangle.TouchLeftOf(tile.Rectangle))
   {
      //touched left of tile
   }
}

编辑:在玩家类中,创建两个成员:

Rectangle rectangle;
Rectangle animationRectangle;

矩形用于碰撞,而不是绘图<代码>动画矩形用于显示动画和绘图。因此,只绘制动画矩形。

 类似资料:
  • 为了计算x和y速度,我求解了一个动量守恒和动能守恒方程组。 顺便说一下,这些方程没有考虑圆的“形状”。 所以我通过求两个圆相交的切线来计算回弹角。 现在我有两个不同的最终速度方向:一个是用动量定律计算的,一个是用回弹计算的。 我不知道怎么把两种速度结合起来才能得到最后一种

  • 我正在尝试做一个平台游戏,其中没有斜坡。我正在尝试将碰撞检测降下来,但是我在pygame中找不到一种方法来获得哪一边与另一个Sprite发生了碰撞。有没有人能给我一个好的方法来做到这一点,那不是太庞大,但也能很好地工作在我的情况? 下面是我的玩家类: 我已经将它添加到我的player类中,每次播放器更新时我都运行它,并且它工作...差一点。 在平台顶部的碰撞起作用,在侧面的碰撞几乎总是起作用,除非

  • 我已经寻找并找到了单个碰撞的答案,但我正在寻找一种检测多种类型的碰撞的方法。我正在制作一个游戏,其中有3个我想要的碰撞。用户飞机与敌方子弹相撞,用户子弹与敌机相撞(我已经工作过),敌方子弹与用户子弹相撞。我已经设置并更正了所有类别BitMask和contactTestBitMask。这是我的委托方法。

  • 你是否看到过车祸?是否跟什么物体相撞过?就像车的相撞一样,刚体对象也可以互相碰撞,当它们互相接触的时候,就认为发生了碰撞。当碰撞发生时,会触发一系列事件,它可以被完全忽略。 碰撞筛选 碰撞筛选允许你启用或者阻止形状之间碰撞的发生,引擎支持使用类型,组位掩码来进行碰撞筛选。 Cocos2d-x 有 32 个支持的碰撞类型,对于每个形状都可以指定其所属的类型。还可以指定有哪些类型可以与这个形状进行碰撞

  • 这是我检测碰撞的代码,但它只适用于矩形: }

  • 我在我的自上而下的游戏中实现了一个简单的基于瓷砖的碰撞系统,但是我在跨角移动方面遇到了问题。目前,我的程序采取了玩家的中心点,并在一个20px的正方形网格(交替的灰色背景)上做出一个瓷砖。它检查上、下、左、右贴图是否有冲突,如果找到冲突,它就进入下一个阶段。 下一个阶段是检查玩家在瓷砖内的位置。为此,我有一个名为的函数(我知道有创意的名字)。这将返回从瓷砖的中心点到玩家的中心点的距离的向量2i(x