我确实需要一些帮助!!
我想要的是:
我正在尝试实现像 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();
}
}