XNA: 2.5D игра, как Mario Bros. Wii - PullRequest
1 голос
/ 19 июля 2011

Мне определенно нужна помощь !!

Что я хочу:

Я пытаюсь реализовать игру 2.5D, например, Mario Bros Wii. То есть: двухмерная фоновая прокрутка справа налево и наоборот с помощью 3D-плеера и 3D-объектов.

Что у меня есть:

У меня уже есть 2D-среда, созданная с помощью плиток (см. Пример игры на платформе xna). В это я вставил 3D-модель, которая движется и взаимодействует с миром. Обнаружение столкновений и все ... все в порядке!

В чем моя проблема:

Моя проблема в том, что камера движется вместе с проигрывателем ... это на самом деле нормально, и я хотел этого. Я сделал это следующим образом: Camera.Position = modelPosition. Но я не хочу, чтобы это приводило к отношениям между камерой игрока и всеми другими объектными камерами. В результате все остальные объекты перемещаются вместе с игроком. НО они должны оставаться на месте и должны быть переданы только игроком (или собраны) ..

Вы знаете, что я имею в виду ??

Что я предполагаю:

Игрок перемещается по этой 2D системе координат, и положение камеры будет установлено в положение игрока.

Если я добавлю еще один объект (на эскизе: o) (например, что-то для сбора), он будет находиться в 3D-системе координат, которая находится в этой 2D-системе координат. (см. эскиз) Таким образом, камера этого объекта движется вместе с реальной камерой. Но, тем не менее, позиция (0, 0, 0) ..

Что я могу сделать ??

* +1033 * Пример Игрок и объект:

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