XNA,Do-While 基本问题
XNA, Do-While basic trouble
我正在为我的 XNA 项目创建一个简单的 AI。
我的敌人应该在短时间后从右移到左。
不幸的是,我的代码跳过了我的第一次和第二次 Do-While,所以我的敌人没有移动:< 5 秒长。所以他只是从+-1.X位置跳
while (i <= 1)
{
EnemyVelocity.X += 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
usedTimeRight = timer;
i++;
}
if (usedTimeRight != 0)
{
do
{ EnemyVelocity.X -= 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
} while ((timer - usedTimeRight) >= 5);
usedTimeLeft = timer;
usedTimeRight = 0;
}
if (usedTimeLeft != 0)
{
do
{ EnemyVelocity.X += 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
}
while (timer - usedTimeLeft >= 5);
usedTimeRight = timer;
usedTimeLeft= 0;
}
已更新...~~~~~~~~~~~
所以,现在另一个问题 - 我的敌人一直在向左移动
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
while (i <= 1)
{
EnemyVelocity.X -= 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
usedTimeRight = timer;
i++;
}
if (usedTimeRight != 0 && (timer - usedTimeRight <= 2))
{
int x;
for (x = 0; x <= 3; x++)
{
EnemyVelocity.X = 1;
}
usedTimeLeft = timer;
usedTimeRight = 0;
}
if (usedTimeLeft != 0 && (timer - usedTimeLeft <= 2))
{
int x;
for (x = 0; x <= 3; x++)
{
EnemyVelocity.X = - 1;
}
usedTimeRight = timer;
usedTimeLeft = 0;
}
问题在于初始 while 循环迭代速度如此之快,以至于 while 循环在 usedTimeRight = timer
> 0 之前退出。这意味着您的第一个和第二个 if 语句将为假,因为 useTimeLeft
和 useTimeRight
将始终为 0。尝试更改此设置,以便 Timer
变量在声明时等于 1。
例如:
float timer = 1f;
while (i <= 1 )
{
EnemyVelocity.X += 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
usedTimeRight = timer;
i++;
}
if (usedTimeRight != 0)
{
do
{ EnemyVelocity.X -= 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
} while ((timer - usedTimeRight) >= 5);
usedTimeLeft = timer;
usedTimeRight = 0;
}
if (usedTimeLeft != 0)
{
do
{ EnemyVelocity.X += 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
}
while (timer - usedTimeLeft >= 5);
usedTimeRight = timer;
usedTimeLeft= 0;
}
我强烈建议初学者在视频游戏中使用 while 循环只有在你真正需要它时才更新循环,因为它可能会停止你的游戏或给你带来意想不到的结果(通常是像这个问题中的瞬移一样的东西)因为困难首先要了解游戏内部逻辑是如何工作的。
如果你需要你的敌人做某事五秒钟,只需在它开始你想要的动作时将 gameTime.ElapsedGameTime.totalMilliseconds 保存在一个变量中,如果你的 savedGameTime 小于总游戏时间,则只需检查- 减去你想要的时间。
如果做对了,你想让你的敌人向左移动五秒钟,然后向右移动五秒钟?要做到这一点,你必须做这样的事情
:
float delayBetweenMoves = 5f;
float lastMoveTime = 0f;
bool isMovingLeft;
public void Update(GameTime gameTime)
{
Move(gameTime);
enemy.Position += (enemy.VelocityX * enemy.Speed);
}
private void Move(GameTime gameTime)
{
if(lastMoveTime < gameTime.TotalGameTime.TotalMiliseconds - TimeSpan.FromSeconds(delayBetweenMoves))
{
lastMoveTime = gameTime.TotalGameTime.TotalMiliseconds;
if (isMovingLeft)
{
enemy.VelocityX = -1;
isMovingLeft = false;
}
else
{
enemy.VelocityX = +1;
}
}
}
我正在为我的 XNA 项目创建一个简单的 AI。
我的敌人应该在短时间后从右移到左。
不幸的是,我的代码跳过了我的第一次和第二次 Do-While,所以我的敌人没有移动:< 5 秒长。所以他只是从+-1.X位置跳
while (i <= 1)
{
EnemyVelocity.X += 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
usedTimeRight = timer;
i++;
}
if (usedTimeRight != 0)
{
do
{ EnemyVelocity.X -= 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
} while ((timer - usedTimeRight) >= 5);
usedTimeLeft = timer;
usedTimeRight = 0;
}
if (usedTimeLeft != 0)
{
do
{ EnemyVelocity.X += 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
}
while (timer - usedTimeLeft >= 5);
usedTimeRight = timer;
usedTimeLeft= 0;
}
已更新...~~~~~~~~~~~
所以,现在另一个问题 - 我的敌人一直在向左移动
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
while (i <= 1)
{
EnemyVelocity.X -= 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
usedTimeRight = timer;
i++;
}
if (usedTimeRight != 0 && (timer - usedTimeRight <= 2))
{
int x;
for (x = 0; x <= 3; x++)
{
EnemyVelocity.X = 1;
}
usedTimeLeft = timer;
usedTimeRight = 0;
}
if (usedTimeLeft != 0 && (timer - usedTimeLeft <= 2))
{
int x;
for (x = 0; x <= 3; x++)
{
EnemyVelocity.X = - 1;
}
usedTimeRight = timer;
usedTimeLeft = 0;
}
问题在于初始 while 循环迭代速度如此之快,以至于 while 循环在 usedTimeRight = timer
> 0 之前退出。这意味着您的第一个和第二个 if 语句将为假,因为 useTimeLeft
和 useTimeRight
将始终为 0。尝试更改此设置,以便 Timer
变量在声明时等于 1。
例如:
float timer = 1f;
while (i <= 1 )
{
EnemyVelocity.X += 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
usedTimeRight = timer;
i++;
}
if (usedTimeRight != 0)
{
do
{ EnemyVelocity.X -= 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
} while ((timer - usedTimeRight) >= 5);
usedTimeLeft = timer;
usedTimeRight = 0;
}
if (usedTimeLeft != 0)
{
do
{ EnemyVelocity.X += 1f;
timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
}
while (timer - usedTimeLeft >= 5);
usedTimeRight = timer;
usedTimeLeft= 0;
}
我强烈建议初学者在视频游戏中使用 while 循环只有在你真正需要它时才更新循环,因为它可能会停止你的游戏或给你带来意想不到的结果(通常是像这个问题中的瞬移一样的东西)因为困难首先要了解游戏内部逻辑是如何工作的。
如果你需要你的敌人做某事五秒钟,只需在它开始你想要的动作时将 gameTime.ElapsedGameTime.totalMilliseconds 保存在一个变量中,如果你的 savedGameTime 小于总游戏时间,则只需检查- 减去你想要的时间。
如果做对了,你想让你的敌人向左移动五秒钟,然后向右移动五秒钟?要做到这一点,你必须做这样的事情 :
float delayBetweenMoves = 5f;
float lastMoveTime = 0f;
bool isMovingLeft;
public void Update(GameTime gameTime)
{
Move(gameTime);
enemy.Position += (enemy.VelocityX * enemy.Speed);
}
private void Move(GameTime gameTime)
{
if(lastMoveTime < gameTime.TotalGameTime.TotalMiliseconds - TimeSpan.FromSeconds(delayBetweenMoves))
{
lastMoveTime = gameTime.TotalGameTime.TotalMiliseconds;
if (isMovingLeft)
{
enemy.VelocityX = -1;
isMovingLeft = false;
}
else
{
enemy.VelocityX = +1;
}
}
}