XNA 简单状态机什么都不做
XNA simple state machine doesn't do anything
我正在为我的视频游戏设计 class 做一个项目,我基本上必须在某些代码中找到一些错误,修复它,然后使用枚举将其全部转换为状态机。我在下面粘贴了初始化、更新和绘制方法,如您所见,我在将旧代码转换为状态机之前注释掉了它。之前使用所有 if/else 语句一切正常,但现在我已经转换了它,它实际上没有做任何事情。它在起始位置显示站立的精灵,但按下按键完全没有任何反应。
实例化变量
Texture2D heroineTexture, dive, duck, jump, stand;
int yVelocity, jumpVelocity, diveVelocity;
Rectangle player;
enum State
{
Standing,
Jumping,
Ducking,
Diving
};
State state;
KeyboardState kb, oldkb;
初始化
oldkb = Keyboard.GetState();
jumpVelocity = -10;
diveVelocity = 15;
yVelocity = 0;
heroineTexture = stand;
state = State.Standing;
player = new Rectangle(0, 430, 50, 40);
base.Initialize();
更新
kb = Keyboard.GetState();
// Allows the game to exit
if (kb.IsKeyDown(Keys.Escape))
this.Exit();
// TODO: Add your update logic here
player.Y += yVelocity;
switch (state)
{
case State.Standing:
if (kb.IsKeyDown(Keys.J))
{
state = State.Jumping;
yVelocity = jumpVelocity;
heroineTexture = jump;
}
else if (kb.IsKeyDown(Keys.Down))
{
state = State.Ducking;
heroineTexture = duck;
}
break;
case State.Jumping:
if (kb.IsKeyDown(Keys.Down))
{
state = State.Diving;
heroineTexture = dive;
yVelocity = diveVelocity;
}
break;
case State.Ducking:
if (!kb.IsKeyDown(Keys.Down))
{
state = State.Standing;
heroineTexture = stand;
}
break;
}
if (player.Y >= 430)
{
state = State.Standing;
player.Y = 430;
yVelocity = 0;
heroineTexture = stand;
}
//if (kb.IsKeyDown(Keys.J) && oldkb.IsKeyUp(Keys.J))
//{
// if (!isJumping && !isDucking)
// {
// isJumping = true;
// yVelocity = jumpVelocity;
// heroineTexture = jump;
// }
//}
//else if(kb.IsKeyDown(Keys.Down))
//{
// if(!isJumping)
// {
// if(isDiving)
// {
// yVelocity = diveVelocity;
// }
// else if(!isJumping && !isDiving)
// {
// isDucking = true;
// heroineTexture = duck;
// }
// }
// else
// {
// isJumping = false;
// heroineTexture = dive;
// isDiving = true;
// }
//}
//else if(!kb.IsKeyDown(Keys.Down))
//{
// if(isDucking)
// {
// isDucking = false;
// heroineTexture = stand;
// }
//}
oldkb = kb;
base.Update(gameTime);
通常:在设置状态的每一行设置一个断点,开始调试,你会找到罪魁祸首。
无论如何。在您的注释代码中,您在处理状态之前进行了 player.y >= 430 检查,但现在您在之后进行检查。
你基本上是在设置状态而不是改变位置,所以,如果我猜对了,你的玩家是站着的(>=430),你设置了状态,然后立即(在实际改变 player.y) 玩家仍然站立,你将状态设置回站立。
这只是根据您的代码片段进行的猜测,因为 "if player.y >= 430" 的位置现在实际上是在不同的时间调用的
你需要这样做:
player.Y += yVelocity;
在 switch/case 之后但在
之前
if(player.y >= 430)
我正在为我的视频游戏设计 class 做一个项目,我基本上必须在某些代码中找到一些错误,修复它,然后使用枚举将其全部转换为状态机。我在下面粘贴了初始化、更新和绘制方法,如您所见,我在将旧代码转换为状态机之前注释掉了它。之前使用所有 if/else 语句一切正常,但现在我已经转换了它,它实际上没有做任何事情。它在起始位置显示站立的精灵,但按下按键完全没有任何反应。
实例化变量
Texture2D heroineTexture, dive, duck, jump, stand;
int yVelocity, jumpVelocity, diveVelocity;
Rectangle player;
enum State
{
Standing,
Jumping,
Ducking,
Diving
};
State state;
KeyboardState kb, oldkb;
初始化
oldkb = Keyboard.GetState();
jumpVelocity = -10;
diveVelocity = 15;
yVelocity = 0;
heroineTexture = stand;
state = State.Standing;
player = new Rectangle(0, 430, 50, 40);
base.Initialize();
更新
kb = Keyboard.GetState();
// Allows the game to exit
if (kb.IsKeyDown(Keys.Escape))
this.Exit();
// TODO: Add your update logic here
player.Y += yVelocity;
switch (state)
{
case State.Standing:
if (kb.IsKeyDown(Keys.J))
{
state = State.Jumping;
yVelocity = jumpVelocity;
heroineTexture = jump;
}
else if (kb.IsKeyDown(Keys.Down))
{
state = State.Ducking;
heroineTexture = duck;
}
break;
case State.Jumping:
if (kb.IsKeyDown(Keys.Down))
{
state = State.Diving;
heroineTexture = dive;
yVelocity = diveVelocity;
}
break;
case State.Ducking:
if (!kb.IsKeyDown(Keys.Down))
{
state = State.Standing;
heroineTexture = stand;
}
break;
}
if (player.Y >= 430)
{
state = State.Standing;
player.Y = 430;
yVelocity = 0;
heroineTexture = stand;
}
//if (kb.IsKeyDown(Keys.J) && oldkb.IsKeyUp(Keys.J))
//{
// if (!isJumping && !isDucking)
// {
// isJumping = true;
// yVelocity = jumpVelocity;
// heroineTexture = jump;
// }
//}
//else if(kb.IsKeyDown(Keys.Down))
//{
// if(!isJumping)
// {
// if(isDiving)
// {
// yVelocity = diveVelocity;
// }
// else if(!isJumping && !isDiving)
// {
// isDucking = true;
// heroineTexture = duck;
// }
// }
// else
// {
// isJumping = false;
// heroineTexture = dive;
// isDiving = true;
// }
//}
//else if(!kb.IsKeyDown(Keys.Down))
//{
// if(isDucking)
// {
// isDucking = false;
// heroineTexture = stand;
// }
//}
oldkb = kb;
base.Update(gameTime);
通常:在设置状态的每一行设置一个断点,开始调试,你会找到罪魁祸首。
无论如何。在您的注释代码中,您在处理状态之前进行了 player.y >= 430 检查,但现在您在之后进行检查。
你基本上是在设置状态而不是改变位置,所以,如果我猜对了,你的玩家是站着的(>=430),你设置了状态,然后立即(在实际改变 player.y) 玩家仍然站立,你将状态设置回站立。
这只是根据您的代码片段进行的猜测,因为 "if player.y >= 430" 的位置现在实际上是在不同的时间调用的
你需要这样做:
player.Y += yVelocity;
在 switch/case 之后但在
之前if(player.y >= 430)