【问题标题】:XNA 2D Cam Zoom not correctXNA 2D 凸轮变焦不正确
【发布时间】:2014-08-14 15:51:09
【问题描述】:

我基于 http://www.david-amador.com/2009/10/xna-camera-2d-with-zoom-and-rotation/ 中的类构建了一个相机。我目前正在制作一种太空射击游戏(但有故事和这些东西),并希望首先让相机正常工作。但是 Zoom 不能按我的意愿工作。我真的不知道为什么,但我希望你能帮助我^^ 问题是,精灵在某个方向上移动了大约 30 个像素。可能我没有正确设置主飞船的位置,或者相机只是在窃听。 游戏正在全屏运行。

Game1 方法:

InputHandler.Update(gameTime, graphics.GraphicsDevice);
        World.Camera.Position = new Vector2(Player.Ship.Position.X + Player.Ship.Texture.Width/2, Player.Ship.Position.Y+Player.Ship.Texture.Height/2);
        World.Camera.Zoom = InputHandler.ZoomValue;

我将主飞船纹理的一半大小添加到相机位置,以便纹理的中间应该在中间。没有它也行不通..

我如何设置全屏(我知道......这不是我应该这样做的方式,但它不适用于普通代码。)

graphics.PreferredBackBufferHeight = 10000;
        graphics.PreferredBackBufferWidth = 10000;
        graphics.ToggleFullScreen();
        graphics.PreferMultiSampling = true;
        graphics.IsFullScreen = true;
        graphics.ApplyChanges(); 

InputHandler 类:

 public static void Update(GameTime gameTime, GraphicsDevice graphics)
    {
        _oldKeyboardState = keyboardState;
        _oldMouseState = mouseState;
        keyboardState = Keyboard.GetState();
        mouseState = Mouse.GetState();
        MousePosition = new Vector2(mouseState.X, mouseState.Y);
        MatrixMousePosition = Vector2.Transform(MousePosition, Matrix.Invert(World.Camera.GetTransformation(graphics)));
        OldScrollWheelValue = ScrollWheelValue;
        ScrollWheelValue = mouseState.ScrollWheelValue;

        if (ScrollWheelValue > OldScrollWheelValue) ZoomValue += 0.1f;
        if (ScrollWheelValue < OldScrollWheelValue) ZoomValue -= 0.1f;

        ZoomValue = MathHelper.Clamp(ZoomValue, 0.5f, 1.5f);
    }

最后是相机类:

protected float _zoom; // Camera Zoom
    public Matrix _transform; // Matrix Transform
    public Vector2 _pos; // Camera Position
    protected float _rotation; // Camera Rotation

    public float Zoom
    {
        get { return _zoom; }
        set { _zoom = value; if (_zoom < 0.1f) _zoom = 0.1f; } 
    }

    public float Rotation
    {
        get { return _rotation; }
        set { _rotation = value; }
    }

    public Vector2 Position
    {
        get { return _pos; }
        set { _pos = value; }
    }

    public Camera()
    {
        _zoom = 1.0f;
        _rotation = 0.0f;
        _pos = Vector2.Zero;
    }

    public Matrix GetTransformation(GraphicsDevice graphicsDevice)
    {
        var viewport = graphicsDevice.Viewport;

        _transform =
          Matrix.CreateTranslation(new Vector3(-_pos.X*Zoom, -_pos.Y*Zoom, 0)) *
                                     Matrix.CreateRotationZ(Rotation) *
                                     Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)) *
                                     Matrix.CreateTranslation(new Vector3(viewport.Width * 0.5f, viewport.Height * 0.5f, 0));
        return _transform;
    }

【问题讨论】:

    标签: c# camera xna 2d zooming


    【解决方案1】:

    我明白你做错了什么,这一行:

    transform = Matrix.CreateTranslation(new Vector3(-_pos.X*Zoom, -_pos.Y*Zoom, 0)) * ....
    

    应该是:

    transform = Matrix.CreateTranslation(new Vector3(-_pos.X, -_pos.Y, 0)) * ....
    

    因为现在当您缩放时,您也会平移图像,这会导致精灵移动。

    【讨论】:

    • 哇,我真笨。一周前我就是这样,但我想那时我又犯了一个错误……我什至不记得为什么我在那里写了*Zoom,但我相信我是在对该线程的评论中读到的^^好吧,它现在工作正常...谢谢;D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多