我想生成一个在我的屏幕之外的点(x,y)。这样做的原因是我想要将一个对象补间到屏幕外部,而补间的原因而不仅仅是给它一个随机的X和Y速度是因为对于这个实例,使用greensock补间比创建一个更新循环更简单。
那么,生成这个数字的优雅方法是什么?我目前的解决方案是粗糙的,并且不允许在角落之间进行补间。
var quad:int = irand(1, 4); //generates a random integer between and including the min and max
var maxX:Number = frame.width;
var minX:Number = -frame.width;
var maxY:Number = frame.height;
var minY:Number = -frame.height;
if (quad == 1) //top
{
maxY = -frame.height;
minY = -frame.height - 50;
}
else if (quad == 2) //left
{
maxX = -frame.width;
minX = -frame.width - 50;
}
else if (quad == 3) //bottom
{
maxY = frame.height + 50;
minY = frame.height;
}
else if (quad == 4) //right
{
maxX =frame.width + 50;
minX = frame.width;
}
//first param is duration in seconds
//rand generates a number between the given values
objectToTween.tweenTo(rand(1,2), {
x: rand(minX, maxX),
y: rand(minY, maxY),
repeat: -1,
yoyo: false,
scaleX: 1,
scaleY: 1,
delay: rand(0,1),
ease: Quad.easeIn});
所以希望很清楚,这个解决方案会选择一个随机方向并将对象转向该方向。我想知道是否有办法在两个给定范围之间生成一个随机数。 (例如,介于-100和100之间,但不包括-50到50)然后将其应用于2维
答案 0 :(得分:0)
所以你有一个矩形框f:
┌───┐
│ │
│ f │
│ │
└───┘
和一个对象o的矩形边界框将被补间到f:
的外部┌─────┐
│ o │
└─────┘
f 的外部是o的位置,其中f和o彼此接触但不重叠。
o的某些有效目标位置如下所示:
┌───┐
│ │
│ f ├─────┐ 1
│ │ o │
└───┴─────┘
┌───┐
│ │
│ f │
│ │ 2
┌───┴─┬─┘
│ o │
└─────┘
┌─────┐
│ o ├───┐
└─────┤ │ 3
│ f │
│ │
└───┘
┌─────┐
│ o │
└┬───┬┘
│ │ 4
│ f │
│ │
└───┘
由于o和f的接触,o的一侧总是与f共享。对于上述情况,即
在边缘情况下(双关语),共享两条边,即共享一个角点(从示例3开始,向上移动一点):
┌─────┐
│ o │
└─────┼───┐
│ │
│ f │
│ │
└───┘
o不能向上或向左走。请记住我在上面说过的 f 之外的定义,它完全足够,比“除了矩形f的空间的无穷大”简单得多。
如果你向右移动o,你会获得x位置的最大值(最右边的位置):
┌─────┐
│ o │
┌───┼─────┘
│ │
│ f │
│ │
└───┘
我希望这说明至少有一个维度总是由哪些方面相互接触而预先确定,另一个方面是从限制范围内随机选择的。在这些限制(最小和最大)时,两个框架只会在角落处相互接触。
有你的问题:
x: rand(minX, maxX),
y: rand(minY, maxY),
相反,首先将o的1维随机地设置为上述4个示例中表示的一个案例。任
从 限制中随机选择另一个。
随之而来的是随机性很大,将这么多努力用于确定目标位置是不合理的。
考虑另一种方法。确定f周围的圆,这将保证在f之外。然后根据该角度随机确定角度(方向)和补间。这将使补间看起来略有不同,因为它们可见的持续时间取决于方向(角度),但这种差异几乎不会引人注意。