Мне определенно нужна помощь !!
Что я хочу:
Я пытаюсь реализовать игру 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();
}
}