【问题标题】:"game" loop in flash virtual pondFlash 虚拟池塘中的“游戏”循环
【发布时间】:2011-09-28 14:46:24
【问题描述】:

我在我的 flash as3 虚拟池塘中设计“游戏”循环时遇到问题,目前我有以下 enter_frame 循环。在我的“池塘”父容器中,会有任意数量的“鱼”对象和“食物颗粒”对象。目前在我的循环功能中,当两个或更多食物放在鱼附近时,鱼不会移动有谁知道为什么会发生这种情况?

下面的代码在我的“鱼”类中,updatePosition() 只是告诉鱼像鱼一样游来游去。

public function loop(e:Event):void
        {
            //getDistance(this.x - i.x, this.y - i.y)
            if(foodDroppedArray.length > 0)
            {

                for each (var i:Food in foodDroppedArray)
                {

                    if (getDistance(this.x - i.x, this.y - i.y) < 100)
                    {

                        this.moveToFood(i);

                    }else {
                        updatePosition();
                    }
                }

            }else 
            {
            updatePosition();
            }

        }

【问题讨论】:

  • 这还不足以说明问题所在。您是否尝试过调试代码,例如跟踪条件中的某些内容(因此必须调用的函数是否正确调用)?
  • 嗨,我没有发布整个课程,因为我担心它会太长。
  • 另一方面,考虑重命名该函数,循环是一个糟糕的函数名称。尝试更新、handleUpdate(因为它是一个事件处理程序)甚至是 handleEnterFrame

标签: flash actionscript-3


【解决方案1】:

您在此处的内容循环遍历食物数组,并且对于该数组中的每个项目,它将根据距离条件调用“moveToFood”或“updatePosition”。大概这两个函数都控制运动,因此它们可能会相互对抗,在这种情况下,您只会看到循环的最后一个结果。

您可能希望在找到合适的食物时中断循环,并且仅在没有符合您条件的食物时调用 updatePosition。

if(foodDroppedArray.length > 0)
{
    for each (var i:Food in foodDroppedArray)
    {
         if (getDistance(this.x - i.x, this.y - i.y) < 100)
        {
            this.moveToFood(i);
            return;
        }
    }
    //this only calls when no food matches the condition 
    updatePosition();  
} else {
    updatePosition();
}

【讨论】:

  • 经过测试,鱼会按顺序移动到每种食物上,是的,这两个函数都通过使用返回来控制“鱼”对象的运动;它实际上会回到哪里?为什么 break 不是在这里使用的选择?请原谅我的问题,因为我对这些问题很陌生
  • return 强制函数退出,而 break 只会跳出 for 循环。您想退出该功能,因为已经做出了向某些食物移动的决定。如果 for 循环完成,则调用 updatePosition 作为回退操作。
猜你喜欢
  • 1970-01-01
  • 2012-07-17
  • 2013-10-07
  • 2014-01-21
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
相关资源
最近更新 更多