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