跳至内容

使用 XNA 创建简单 3D 游戏/添加控制

来自维基教科书,开放世界开放书籍

接收键盘输入

[编辑 | 编辑源代码]

为了处理游戏的输入,我们将从键盘接收输入,然后用于移动鱼在景观中移动,并退出游戏。

首先在您的 Game1 文件中创建一个名为“HandleInput”的新方法,并创建一个新的键状态变量。当调用此方法时,键盘的当前状态将存储为键状态变量的一部分,然后可以由游戏逻辑访问。

//Handles input
private void HandleInput(GameTime gameTime)
{
    KeyboardState currentKeyboardState = Keyboard.GetState();
}

接下来添加以下条件语句。

// Check for exit.
if (currentKeyboardState.IsKeyDown(Keys.Escape))
{
    Exit();
}

这提供了最简单的解释这种过程工作原理的方法,您可以将它作为任何条件语句的一部分构建,以监控任何键的位置。在您的更新代码中放置对该方法的调用,使用“gameTime”变量作为参数(我们将在后面使用)。有了这段代码,您应该能够通过按 Escape 键随时退出代码。

接下来,我们将放置一个类似的条件语句来使用箭头键。在您的“HandleInput”方法中添加以下几行。

//Move the fish with the arrow keys
float speed = 0.02f; //Dictates the speed
if (currentKeyboardState.IsKeyDown(Keys.Left))
{
    FishMen.Translation.Y -= speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
if (currentKeyboardState.IsKeyDown(Keys.Right))
{
    FishMen.Translation.Y += speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
if (currentKeyboardState.IsKeyDown(Keys.Up))
{
    FishMen.Translation.X += speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
if (currentKeyboardState.IsKeyDown(Keys.Down))
{
    FishMen.Translation.X -= speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}

为了使效果更明显,请更改 Update 方法中的以下几行。

cameraPosition = cameraTarget = FishMen.Translation;
cameraPosition.Z += 20.0f;

cameraPosition = cameraTarget = FishMen.Translation / 2;
cameraPosition.Z -= 20.0f;

并运行代码。这应该会生成您鱼的肩上视角,因为它在周围移动。使用“ElapsedGameTime”变量的逻辑,它监控更新方法调用之间的时间差,补偿帧之间处理时间的任何变化。如果不是这样,您的计算机越快,控制就越不稳定,越快。实际上,它应该在计算机之间保持一致。运行代码,您应该看到它随着箭头键的按下而移动。

最后,为了确定鱼的边界,创建一个名为“boundarys”的新“Vector2”变量,它将决定鱼在二维空间中的最大位置。更改您的箭头键处理代码如下所示。

//Move the fish with the arrow keys
float speed = 0.02f; //Dictates the speed
Vector2 boundarys = new Vector2(14f);

if (currentKeyboardState.IsKeyDown(Keys.Left) && FishMen.Translation.Y > -boundarys.Y)
{
    FishMen.Translation.Y -= speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
if (currentKeyboardState.IsKeyDown(Keys.Right) && FishMen.Translation.Y < boundarys.Y)
{
    FishMen.Translation.Y += speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
if (currentKeyboardState.IsKeyDown(Keys.Up) && FishMen.Translation.X < boundarys.X)
{
    FishMen.Translation.X += speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
if (currentKeyboardState.IsKeyDown(Keys.Down) && FishMen.Translation.X > -boundarys.X)
{
    FishMen.Translation.X -= speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}

这应该会生成一个游戏,其中鱼只移动到特定位置并停止。您可以随意调整移动,通过监控“boundary”和“speed”变量来调整您的喜好。

华夏公益教科书