假设我在一个数组中有5个对象,我将它们沿着x轴移动,如下所示:
vx = 5;
for (i:int = 0; i < objects.length; i++)
{
objects[i].x += vx;
}
我想这样做。 如果数组'objects'中的任何对象命中PointA,则将该数组中的所有对象移动到左侧,例如set vx * = -1;
我只能这样做:
for (i:int = 0; i < objects.length; i++)
{
// move right
objects[i].x += vx;
if (objects[i].hitTest(PointA))
{
// move left
vx *= -1;
}
}
这将改变对象的方向,但我需要等待所有对象点击PointA。
如何改变数组中所有对象的方向,如果有任何对象命中了PointA?
答案 0 :(得分:0)
我不知道动作脚本但是你应该在for循环之外设置一个布尔值,比如bGoingRight
检查这是否为真,并将对象向右移动,如果错误则移动对象。当您传递hitTest时,您应该将布尔值更改为false。
粗略的例子
var bGoRight:Boolean = true;
for (i:int = 0; i < objects.length; i++)
{
if(bGoRight)
{
// move right
objects[i].x += vx;
}
else
{
// move left
vx *= -1;
}
if (objects[i].hitTest(PointA))
{
// if any object hit the point, set the flag to move left
bGoRight = false;
}
}
答案 1 :(得分:0)
因此,您需要检查已经命中PointA的对象,存储它们,然后检查更新的存储计数是否等于您的对象数组。然后,当满足该情况时,您可以更改vx
变量。这看起来像这样:
//set a variable for storing collided object references
//note: if you are doing this in the IDE remove the 'private' attribute
private var _contactList:Array = [];
for (i:int = 0; i < objects.length; i++)
{
// move right
objects[i].x += vx;
if (objects[i].hitTest(PointA))
{
if( contactList.length == objects.length ) {
// move left
vx *= -1;
//clear our contact list
contactList.length = 0;
}
else if ( noContact( objects[i] ) ) {
contactList.push( objects[i] );
}
}
}
然后是else if语句noContact()
中的函数,如果您在IDE中执行此操作,则需要删除private
属性。
private function noContact( obj:* ):Boolean {
if ( contactList.indexOf( obj ) != -1 ) {
return false;
}
return true;
}
你可以这样做的另一种方法就是这样(一种布尔方式,如另一个答案所述),但依赖于你的存储设置正确:
//set this variable for directionRight (boolean)
private var directionRight:Boolean = true;
for (i:int = 0; i < objects.length; i++)
{
// move right
objects[i].x += vx;
if (objects[i].hitTest(PointA))
{
//we are moving to the right, object[i] is the last object
if( i == objects.length-1 && directionRight ) {
// move left
directionRight = !directionRight;
vx *= -1;
}
else if ( i == 0 && !directionRight ) ) {
// move right
directionRight = !directionRight;
vx *= -1;
}
}
}