XNA:像Mario Bros. Wii这样的2.5D游戏

时间:2011-07-19 17:29:38

标签: c# xna camera 2.5d

我确实需要一些帮助!!

我想要的是什么:

我正在尝试实施像Mario Bros Wii这样的2.5D游戏。 即:2D背景从右向左滚动,反之亦然,使用3D播放器和3D对象。

我有什么:

我已经有了一个用瓷砖构建的2D环境(参见xna的平台游戏示例游戏)。在那里我插入了一个3D模型,它移动并与世界互动。碰撞检测和一切..这一切都很好!

我的问题是什么:

我的问题是相机随播放器移动..这实际上是好的,我想要的是什么。我确实以这种方式实现了它:Camera.Position = modelPosition。 但我不想要的是它会导致播放器相机和所有其他物体相机之间的关系。 结果是所有其他对象随播放器移动。但是它们应该留在原地并且只能由玩家传递(或收集)..

你知道我的意思吗?

我的假设是什么:

玩家沿着2D坐标系移动,相机位置将设置为玩家位置..

如果我放入另一个物体(在草图中:o)(如收集的东西),它将位于该坐标系统中的3D坐标系中。 (见草图)因此该物体的相机随实际相机移动。但绝不是位置越低(0,0,0)..

我该怎么办?

示例 播放器&对象:

 o                    <>
/|\
 |
/ \

如果我移动玩家,物体会相对移动。

我的代码是什么:

玩家:

public void DrawPlayer()
    {
        Matrix[] bones = animationPlayer.GetSkinTransforms();

        if (playerDirection == Direction.Left)
            modelRotation = Math.Abs(modelRotation);
        else
            modelRotation = Math.Abs(modelRotation) * -1;

        Matrix view = Matrix.CreateRotationY(MathHelper.ToRadians(modelRotation)) *
                      Matrix.CreateRotationX(MathHelper.ToRadians(0)) *
                      Matrix.CreateTranslation(modelPosition) *
                      Matrix.CreateLookAt(cameraPosition, modelPosition, Vector3.Up);

        Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 10000.0f);
        foreach (ModelMesh mesh in player.Meshes)
        {
            foreach (Effect effect in mesh.Effects)
            {
                effect.Parameters["Bones"].SetValue(bones);
                effect.Parameters["View"].SetValue(view);
                effect.Parameters["Projection"].SetValue(projection);
            }
            mesh.Draw();
        }
    }

相机:

public void Update(GameTime gameTime)
    {
        position.X = -Player.ModelPosition.X;
        position.Y = Player.ModelPosition.Y;
    }

比萨饼(对象):

public void Draw(GameTime gameTime)
    {
        Matrix[] transforms = new Matrix[pizza.Bones.Count];
        pizza.CopyAbsoluteBoneTransformsTo(transforms);

        //float temp = Camera.Position.X / (1280 / 2);
        //CamTranslation = Matrix.CreateTranslation(new Vector3(xpos, 0, 0));

        foreach (ModelMesh mesh in pizza.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.EnableDefaultLighting();

                effect.World = transforms[mesh.ParentBone.Index] *
                    Matrix.CreateRotationY(modelRotation)
                    * Matrix.CreateTranslation(modelPosition);

                effect.View = Matrix.CreateLookAt(cameraPosition,
                    Vector3.Zero, Vector3.Up);

                effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                    MathHelper.ToRadians(45.0f), aspectRatio,
                    1.0f, 10000.0f);
            }
            mesh.Draw();
        }
    }

0 个答案:

没有答案