C# 如何使用W S A D键左右上下转动相机?

C# 如何使用W S A D键左右上下转动相机?,c#,xna,xna-4.0,C#,Xna,Xna 4.0,在我的代码顶部,我添加了: Matrix rotation; private float angleRightLeft = 0f; private float angleUpDown = 0f; 在构造函数中,我做了: rotation = Matrix.Identity; 在更新方法中,我调用键: float timeDifference = (float)gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f; ProcessInput(

在我的代码顶部,我添加了:

Matrix rotation;
private float angleRightLeft = 0f;
private float angleUpDown = 0f;
在构造函数中,我做了:

rotation = Matrix.Identity;
在更新方法中,我调用键:

float timeDifference = (float)gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f;
ProcessInput(timeDifference);
在绘制方法中,im使用可变角度RightLeft旋转世界(地形):

在draw方法中,我做到了:

worldMatrix = Matrix.CreateFromAxisAngle(this.rotation.Left,angleRightLeft);
worldMatrix = Matrix.CreateTranslation(-terrainWidth / 2.0f, 0, terrainHeight / 2.0f) * Matrix.CreateRotationY(angleRightLeft);
因此,如果我按下A(左)键,它会向左移动,但单击D不会向右移动。 这是密钥处理方法:

private void ProcessInput(float amount)
        {
            previousState = currentState;
            currentState = Mouse.GetState();
            Vector3 moveVector = new Vector3(0 , 0 , 0);
            KeyboardState keyState = Keyboard.GetState();
            if (keyState.IsKeyDown(Keys.Up) || keyState.IsKeyDown(Keys.W))
                //cameraPosition += new Vector3(0.0f, 50.0f, +100);


            if (keyState.IsKeyDown(Keys.Down) || keyState.IsKeyDown(Keys.S))
                //cameraPosition -= new Vector3(0.0f, 50.0f, +100);


            if (keyState.IsKeyDown(Keys.Right) || keyState.IsKeyDown(Keys.D))
                //cameraPosition += new Vector3(1, 0, 0);
                angleRightLeft += 0.05f;

            if (keyState.IsKeyDown(Keys.Left) || keyState.IsKeyDown(Keys.A))
                //cameraPosition += new Vector3(-1, 0, 0);
                angleRightLeft -= 0.05f;

            if (keyState.IsKeyDown(Keys.Q))
                cameraPosition += new Vector3(0, 1, 0);
            if (keyState.IsKeyDown(Keys.Z))
                cameraPosition += new Vector3(0, -1, 0);
            if (keyState.IsKeyDown(Keys.Escape))
            {
                this.graphics.PreferredBackBufferWidth = 800;
                this.graphics.PreferredBackBufferHeight = 600;
                this.graphics.IsFullScreen = false;
                this.graphics.ApplyChanges();
            }
            if (this.graphics.PreferredBackBufferWidth < 1920)
            {

                if (WasDoubleClick())
                {
                    changeScreenNode(this.graphics, 1920, 1080, true);
                }
            }

            if (WasMouseLeftClick())
            {
                previousClick = DateTime.Now;
            }
        }
private void ProcessInput(浮动金额)
{
previousState=当前状态;
currentState=Mouse.GetState();
Vector3 movevevector=新的Vector3(0,0,0);
KeyboardState keyState=Keyboard.GetState();
if(keyState.IsKeyDown(Keys.Up)| | keyState.IsKeyDown(Keys.W))
//摄像机位置+=新矢量3(0.0f,50.0f,+100);
if(keyState.IsKeyDown(Keys.Down)| | keyState.IsKeyDown(Keys.S))
//摄像机位置-=新矢量3(0.0f,50.0f,+100);
if(keyState.IsKeyDown(key.Right)| | keyState.IsKeyDown(key.D))
//cameraPosition+=新矢量3(1,0,0);
角度向右向左+=0.05f;
if(keyState.IsKeyDown(Keys.Left)| | keyState.IsKeyDown(Keys.A))
//cameraPosition+=新矢量3(-1,0,0);
角度右-左-=0.05f;
if(keyState.IsKeyDown(Keys.Q))
cameraPosition+=新矢量3(0,1,0);
if(keyState.IsKeyDown(Keys.Z))
cameraPosition+=新矢量3(0,-1,0);
if(keyState.IsKeyDown(Keys.Escape))
{
this.graphics.PreferredBackBufferWidth=800;
this.graphics.PreferredBackBufferHeight=600;
this.graphics.IsFullScreen=false;
this.graphics.ApplyChanges();
}
if(this.graphics.PreferredBackBufferWidth<1920)
{
如果(双击())
{
changeScreenNode(this.graphics,1920,1080,true);
}
}
如果(WasMouseLeftClick())
{
previousClick=DateTime.Now;
}
}
如果我移动这条线:angleRightLeft+=0.05f; 从D键,然后把它放在W键下,当我按下A键时,它会向左移动,W键会向右移动

但我想这样做,当我点击W和S时,它会上下移动世界,如果我点击A和D,它会左右移动世界。 所以我创建了变量angleUpDown,但Draw方法旋转世界时出现了一些问题


如何根据按下的键进行操作?

因此,我从您的问题中得出的结论是,按
W
,角度向右向左+=0.05f可用于向右移动,但按
D
则不起作用

我猜造成这种情况的一个原因是您使用以下代码的方式:

if (keyState.IsKeyDown(Keys.Up) || keyState.IsKeyDown(Keys.W))
    //cameraPosition += new Vector3(0.0f, 50.0f, +100);

if (keyState.IsKeyDown(Keys.Down) || keyState.IsKeyDown(Keys.S))
    //cameraPosition -= new Vector3(0.0f, 50.0f, +100);

if (keyState.IsKeyDown(Keys.Right) || keyState.IsKeyDown(Keys.D))
    //cameraPosition += new Vector3(1, 0, 0);
    angleRightLeft += 0.05f;
如果没有用括号括住
If语句
{}
,则在
If语句
等于true后,该语句后面的行将被视为要执行的行

因为您已经注释掉了这些行,所以我假设您的编译器将下一个
if语句
视为要执行的语句,然后将下一个if语句视为要执行的语句

如果您调试并逐步完成代码,您很可能会看到这种情况发生

因此,我建议您将语句括在括号中,或者注释掉整个if语句,而不仅仅是其中的代码:

if (keyState.IsKeyDown(Keys.Up) || keyState.IsKeyDown(Keys.W)){
    //cameraPosition += new Vector3(0.0f, 50.0f, +100);
}


if (keyState.IsKeyDown(Keys.Down) || keyState.IsKeyDown(Keys.S)){
    //cameraPosition -= new Vector3(0.0f, 50.0f, +100);
}

if (keyState.IsKeyDown(Keys.Right) || keyState.IsKeyDown(Keys.D)){
    //cameraPosition += new Vector3(1, 0, 0);
    angleRightLeft += 0.05f;
}

if (keyState.IsKeyDown(Keys.Left) || keyState.IsKeyDown(Keys.A)){
    //cameraPosition += new Vector3(-1, 0, 0);
    angleRightLeft -= 0.05f;
}

因此,我从您的问题中得出的结论是,按
W
时,角度向右向左+=0.05f可用于向右移动,但按
D
则不起作用

我猜造成这种情况的一个原因是您使用以下代码的方式:

if (keyState.IsKeyDown(Keys.Up) || keyState.IsKeyDown(Keys.W))
    //cameraPosition += new Vector3(0.0f, 50.0f, +100);

if (keyState.IsKeyDown(Keys.Down) || keyState.IsKeyDown(Keys.S))
    //cameraPosition -= new Vector3(0.0f, 50.0f, +100);

if (keyState.IsKeyDown(Keys.Right) || keyState.IsKeyDown(Keys.D))
    //cameraPosition += new Vector3(1, 0, 0);
    angleRightLeft += 0.05f;
如果没有用括号括住
If语句
{}
,则在
If语句
等于true后,该语句后面的行将被视为要执行的行

因为您已经注释掉了这些行,所以我假设您的编译器将下一个
if语句
视为要执行的语句,然后将下一个if语句视为要执行的语句

如果您调试并逐步完成代码,您很可能会看到这种情况发生

因此,我建议您将语句括在括号中,或者注释掉整个if语句,而不仅仅是其中的代码:

if (keyState.IsKeyDown(Keys.Up) || keyState.IsKeyDown(Keys.W)){
    //cameraPosition += new Vector3(0.0f, 50.0f, +100);
}


if (keyState.IsKeyDown(Keys.Down) || keyState.IsKeyDown(Keys.S)){
    //cameraPosition -= new Vector3(0.0f, 50.0f, +100);
}

if (keyState.IsKeyDown(Keys.Right) || keyState.IsKeyDown(Keys.D)){
    //cameraPosition += new Vector3(1, 0, 0);
    angleRightLeft += 0.05f;
}

if (keyState.IsKeyDown(Keys.Left) || keyState.IsKeyDown(Keys.A)){
    //cameraPosition += new Vector3(-1, 0, 0);
    angleRightLeft -= 0.05f;
}

因此,我从您的问题中得出的结论是,按
W
时,角度向右向左+=0.05f可用于向右移动,但按
D
则不起作用

我猜造成这种情况的一个原因是您使用以下代码的方式:

if (keyState.IsKeyDown(Keys.Up) || keyState.IsKeyDown(Keys.W))
    //cameraPosition += new Vector3(0.0f, 50.0f, +100);

if (keyState.IsKeyDown(Keys.Down) || keyState.IsKeyDown(Keys.S))
    //cameraPosition -= new Vector3(0.0f, 50.0f, +100);

if (keyState.IsKeyDown(Keys.Right) || keyState.IsKeyDown(Keys.D))
    //cameraPosition += new Vector3(1, 0, 0);
    angleRightLeft += 0.05f;
如果没有用括号括住
If语句
{}
,则在
If语句
等于true后,该语句后面的行将被视为要执行的行

因为您已经注释掉了这些行,所以我假设您的编译器将下一个
if语句
视为要执行的语句,然后将下一个if语句视为要执行的语句

如果您调试并逐步完成代码,您很可能会看到这种情况发生

因此,我建议您将语句括在括号中,或者注释掉整个if语句,而不仅仅是其中的代码:

if (keyState.IsKeyDown(Keys.Up) || keyState.IsKeyDown(Keys.W)){
    //cameraPosition += new Vector3(0.0f, 50.0f, +100);
}


if (keyState.IsKeyDown(Keys.Down) || keyState.IsKeyDown(Keys.S)){
    //cameraPosition -= new Vector3(0.0f, 50.0f, +100);
}

if (keyState.IsKeyDown(Keys.Right) || keyState.IsKeyDown(Keys.D)){
    //cameraPosition += new Vector3(1, 0, 0);
    angleRightLeft += 0.05f;
}

if (keyState.IsKeyDown(Keys.Left) || keyState.IsKeyDown(Keys.A)){
    //cameraPosition += new Vector3(-1, 0, 0);
    angleRightLeft -= 0.05f;
}

因此,我从您的问题中得出的结论是,按
W
时,角度向右向左+=0.05f可用于向右移动,但按
D
则不起作用

我猜造成这种情况的一个原因是您使用以下代码的方式:

if (keyState.IsKeyDown(Keys.Up) || keyState.IsKeyDown(Keys.W))
    //cameraPosition += new Vector3(0.0f, 50.0f, +100);

if (keyState.IsKeyDown(Keys.Down) || keyState.IsKeyDown(Keys.S))
    //cameraPosition -= new Vector3(0.0f, 50.0f, +100);

if (keyState.IsKeyDown(Keys.Right) || keyState.IsKeyDown(Keys.D))
    //cameraPosition += new Vector3(1, 0, 0);
    angleRightLeft += 0.05f;
如果你没有附上你的
If stat