1

我确实需要一些帮助!!

我想要的是:

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

我有的:

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

我的问题是什么:

我的问题是相机随着播放器移动......这实际上没问题,也是我想要的。我确实是这样实现的:Camera.Position = modelPosition. 但我不想要的是它导致玩家相机和所有其他物体相机之间的关系。结果是所有其他对象都随着玩家移动。但是它们应该留在原地,并且只能由玩家通过(或收集)..

你懂我的意思吗??

我的假设是什么:

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

如果我也放入另一个对象(在草图中:o)(比如要收集的东西),它将位于位于该 2D 坐标系中的 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();
        }
    }
4

0 回答 0