【发布时间】:2023-07-12 10:03:01
【问题描述】:
我现在正在尝试实现一个非常基本的 2D 游戏,其中一个敌人在屏幕上,它在设定点(50 和 500)之间来回弹跳,有点像太空入侵者之类的东西。我的问题是我只能让它向右走,但不能回到左边重复。
在费心研究它并真正弄清楚之前,我一直在自己编写代码,但我认为我有一些可行的方法,但它没有,我的问题是我不明白为什么。 我的代码应该像开关一样工作,Update 循环中有两个 if 语句,一个打开另一个关闭,一个向右移动,另一个向左移动,我认为这很好,但它没有这样做。它向右移动它就好了,但是左边的部分就不起作用了。
那么,为什么下面的代码不起作用?
namespace _2D_game_num1
{
class Enemy
{
int health;
Vector2 enemy_location = new Vector2(50, 50);
Vector2 enemy_speed = new Vector2(1, 1);
Player player = new Player("dummy");
public Enemy()
{
health = 100;
}
public void UpdateLocation()
{
//Vector2 player_pos = player.GetLocation();
//if (player_pos.X < 200)
// Using the players location to figure out where the enemy should move
bool right = true;
bool left = false;
if (right)
{
enemy_location.X += enemy_speed.X;
if (enemy_location.X == 500)
{
right = false;
left = true;
}
}
if (left)
{
enemy_location.X -= enemy_speed.X;
if (enemy_location.X == 50)
{
right = true;
left = false;
}
}
}
public Vector2 GetLocation()
{
return enemy_location;
}
}
}
然后在主游戏类中,我有它这样的enemy1.UpdateLocation();正确位于“更新”部分(以及我的球员运动,效果很好)。
【问题讨论】:
-
您不需要
right和left变量。只需使用“正确”变量即可简化事情。如果这是真的,那么你正在向右移动。如果它是假的,你会向左移动。另外,要小心,因为向量是基于浮点数的,你应该避免测试相等性(双精度数也是如此)。你最好使用>= 500和<= 50来避免任何“接近但不是500或50”的错误。 -
另一个问题,您需要将我所说的单个
right变量设为类成员,而不是UpdateLocation()的局部变量。由于它是该方法的本地方法,因此它没有保留其价值。每次您现在拨打UpdateLocation(),它会将right重置为true和left重置为false。这可能是您遇到的主要问题。
标签: c# xna game-physics monogame