PDA

Просмотр полной версии : Воздушный шарик средствами AS


Leeto
10.04.2008, 12:43
Здраствуйте. Столкнулся с проблемой, возможно обсуждавшейся на форуме, но к сожалению не смог найти что-то конкретное.

Задача создать воздушный шарик, который будет себе свободно летать в указаной зоне, и при касании его мышкой он должен как бы отскакивать от курсора (эффект как будто его подбивают рукой).

Само програмирование мне чуток сложно для понимания, но кое-как написал строчки для рандомного движения шарика, а вот чтобы он отбивался от курсора, попытки закончились неудачей.
Вот код (mc - тот самый шарик):
function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
return randomNum;
}


speed = 1;
movx = 'right';
movy = 'up';
mc._x = 0;
mc._y = 0;
onEnterFrame = function () {
var borderX:Number = randRange(0, 1500);
var borderY:Number = randRange(0, 1400);

if (mc._x == 0) {
movx = 'right';
}
if (mc._x == 550 or mc._x>=borderX*2) {
movx = 'left';
}
if (mc._y == 0) {
movy = 'down';
}
if (mc._y == 400 or mc._y>=borderY*3) {
movy = 'up';
}
if (movx == 'right') {
mc._x += speed;
}
if (movx == 'left') {
mc._x -= speed;
}
if (movy == 'down') {
mc._y += speed;
}
if (movy == 'up') {
mc._y -= speed;
}
};

Товарищи флешеры помогите пожалуйста решить проблему. Буду очень признателен за совет или давно написаный код.

Волгоградец
10.04.2008, 13:25
Кода нет, есть совет:
ball.onRollOver = function ():Void{
this._y -= 10;
}
ball - имя шарика.
onRollOver - этот метод срабатывает, когда наводишь мышью на клип.

Leeto
10.04.2008, 14:16
Спасибо за столь быстрый ответ.

Функция onRollOver само собой, но в даном случае шарик прыгнет по _у в верх.
Но нужен учет положения курсора по _х. Если он слева от шарика, значит при наведении должен уходить в право, если курсор справа, тогда влево.

Вот моя очередная попытка, но в даном случае отслеживается положение курсора относительно самого клипа, но никак не при наведении.

function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.floor(Math.random()*(max-min+1))+min;
return randomNum;
}


speed = .2;
movx = 'right';
movy = 'up';
mc._x = 200;
mc._y = 200;
onEnterFrame = function () {
var borderX:Number = randRange(0, 1500);
var borderY:Number = randRange(0, 1400);
if (mc._x == 0) {
movx = 'right';
}
if (mc._x == 550 or mc._x>=borderX*2) {
movx = 'left';
}
if (mc._y == 0) {
movy = 'down';
}
if (mc._y == 400 or mc._y>=borderY*3) {
movy = 'up';
}
if (movx == 'right') {
mc._x += speed;
}
if (movx == 'left') {
mc._x -= speed;
}
if (movy == 'down') {
mc._y += speed;
}
if (movy == 'up') {
mc._y -= speed;
}
};
mc.onRollOver = function() {
onEnterFrame = function() {

if (_xmouse<=mc._x) {
mc._x += 2;
};
if (_xmouse>=mc._x) {
mc._x -= 2;
};
if (_ymouse<=mc._y) {
mc._y += 2;
};
if (_ymouse>=mc._y) {
mc._y -= 2;
};
};
};

Не знаю, может я избрал не совсем верный путь для реализации или не правильно использовал код.

Волгоградец
10.04.2008, 15:41
ball.onRollOver = function ():Void{
var iks:Number = this._x - _root._xmouse;
var igr:Number = this._y - _root._ymouse;
this._x += iks;
this._y += igr;
}

bebop
10.04.2008, 17:26
Я бы считал и сохранял где-то вектор перемещения курсора, т.е. направление и скорость. Ну и в зависимости от длины и направления этого вектора пинал шарик.

Leeto
10.04.2008, 22:41
Хм, знать бы как это реализовать. Я думал о варианте проще, - что при самом наведении курсора, клип отскакивал в противоположную сторону от курсора, значит отсчитывать позицию курсора непосредственно при наведении. Но и тут силенок не хватило.

NoCD
11.04.2008, 00:55
попробуй вычеслить угол, когда курсор оказывается внутри шарика хотя бы hitTest-ом.

$mival
11.04.2008, 06:08
почитай hitTest, там есть пересечение объекта с курсором.

а скорость легко вычисляется путем сохранения предыдущих координат мыши и сравнением их с текущими.

Leeto
11.04.2008, 12:16
Спасибо. Буду пробовать.