0

我试图创建一个基本的进化模拟器,为此我需要我随机创建的生物向最近的食物移动。我对获取生物方向的代码很有信心,因为我已经通过按预期数量修改位置来测试它(是的,我知道我不应该直接改变位置)。然后当我使用其中一个时move_and_slidemove_and_collide我发现它们没有按预期移动,而是跳到一条线或沿着窗口中心聚集,并且似乎随机上下移动。我不确定是什么导致了这种运动,因为我过去的所有使用move_and_slidemove_and_collide工作都非常好。

func move(food_positions, delta):
    if playing:
        direction = choose_direction(food_positions)
        if direction != null:
            move_and_slide(direction*SPEED)

当生物在“模拟”场景中被实例化时,此代码被外部调用。这food_positions是用于计算所需方向的 Vector2 数组。因为它是从另一个场景调用的,所以我需要在使用move_and_collide.

的代码choose_direction如下:

    var closest_food_pos = null
    var closest_food_distance = null
    # iterate through each food
    for food_pos in food_positions:
        # get distance betweeen the two positions
        var gap = food_pos - position
        var distance_food_me = sqrt(pow(gap.x,2) + pow(gap.y,2))
# insert test to within view distance here
        # confiming that we are not comparing to null
        if closest_food_distance != null and closest_food_pos != null:
            # comparing distances
            if closest_food_distance > distance_food_me:
                # setting to closest food
                closest_food_distance = distance_food_me
                closest_food_pos = food_pos
        else:
            #if null need to set to first food to compare
            closest_food_distance = distance_food_me
            closest_food_pos = food_pos

    if closest_food_distance != null and closest_food_pos != null:
        var gap = closest_food_pos - position
        var go_direction = gap.normalized()
        return go_direction.normalized()
    else:
        # add ai go towards function call here
        return null

它还没有完全完成,我计划在未来添加一些内容。

请注意,这是生物场景的一部分,在模拟场景中动态实例化,该场景是预实例化/主场景的一部分,用于控制和以后的可用性。

git hub 存储库是:https ://github.com/benpotter480/Evolution_simulation_that_doesnt_work

抱歉,如果我的存储库的某些部分没有正常显示,因为我是新手。

感谢您的任何建议。

4

1 回答 1

0

好的,我有一个解决方案。

前言

我首先在 处添加了一个断点,move_and_slide()然后从主场景运行项目以单步执行代码。什么都没有看。正在设置和初始化这些值。我添加了打印语句以找出随着时间的推移显示的内容food_positionscreature_positionsdirection认为第一帧不应该受到指责。但是,什么都看不出来。

我检查了生物场景。那里一定有什么东西。代码看起来很好,没有什么应该导致move_and_slide()做它正在做的事情。我单独运行生物场景。你猜怎么着,它奏效了。所以,至少我知道它不在生物场景中。

这很麻烦。据我所知,它在模拟中无缘无故地失败了。我尝试生成 100 种食物,100 种生物。

然后是 1 个生物。

那生物一动不动。那是东西。当有更多的生物时,它们就像是被强迫进入彼此一样。在又摆弄了一些之后,我无意识地转动着wall_left静止的身体,注意到那个小突起,然后,等等,那不是RectangleShape2D

我把所有的墙都删了...

有效!模拟成功了!

TL;DR / 解决方案

墙壁的LineShape2D碰撞形状使其法线朝向错误的方向。LineShape2D将'Normal从更改(0, -1)(0, 1)

结论

那真是让人头疼。希望这对编码有所帮助和快乐!

于 2019-11-15T20:47:07.193 回答