Просмотр полной версии : Прыгающий мяч
StachelDraht
29.05.2008, 11:03
Привет!
Мне нужно сделать что бы шарик при соприкосновении с поверхностью, отскакивал от нее. Т.е. один мувик отлитал от другого при соприкосновении.
Чес скажу, на форме рылся долго. Понял что надо юзать hitTest. Но как его использовать, не понял.
Помогите пожалуйста.
Спасибо!
Для плоской поверхности достаточно определять координаты мяча и корректировать их.
StachelDraht
29.05.2008, 11:56
а если мне надо что бы шарик ударялся только от определенного куска поверхности. Незнаю как объяснить.
Короче на картинке, есть шарик (синий) и ящик (красный). Ящик двигается в лево и в право кнопками LEFT и RIGHT.
Короче игра где юзер пытается отбить мячик этим самым ящиком.
Как быть в таком случае.
StachelDraht
29.05.2008, 12:18
никак не врубаюсь
ball.onEnterFrame = function() {
if (ball._y != box._y){
ball._y += 10;
}else if
(ball._y == box._y) {
ball._y -= 10;
}
};
Alex_beginner
29.05.2008, 14:08
Чтобы определить, пересекаются ли два клипа, метод hitTest() необходимо задействовать в следующей форме:
clip1.hitTest(clip2),
здесь clip1 и clip2 — клипы, проверку коллизии которых нужно провести.
В качестве результата метод hitTest() возвращает булеву величину true, если клипы имеют общие точки, и false, если они не перекрываются.
В идеале факт пересечения двух клипов нужно считать состоявшимся, если у них есть хотя бы по одной заполненной точке, которые имеют одинаковые глобальные координаты. Увы, но проверить коллизию с такой точностью можно далеко не всегда. Для этого пришлось бы последовательно перебрать значительное число точек, что недопустимо с позиции времени выполнения кода. Поэтому метод hitTest() сравнивает не положения заполненных точек двух клипов, а лишь их граничные координаты (получить которые можно, используя метод getBounds()). Это означает, что факт коллизии будет подтвержден не тогда, когда объекты внутренней структуры двух клипов действительно перекрывают друг друга, а тогда, когда пересекаются области, ограниченные описанными вокруг них прямоугольными рамками.
В вашем коде проверяется лишь высота двух клипов (прмым сравнением свойства _y клипов). А как же быть если шарик будет падать не на площадку? Подумайте и используйте метод hitTest.
lexa2000lexa
29.05.2008, 14:57
http://silin.fatal.ru/#AS/balls
StachelDraht
29.05.2008, 15:34
Огромное спасибо за объяснения и ссылку.
Буду думать дальше!:)
StachelDraht
29.05.2008, 16:58
пока что доперло.
Спасибо!
box.onEnterFrame = function() {
if (Key.isDown(Key.LEFT)){
this._x -= 25;
} else
if(Key.isDown(Key.RIGHT)) {
this._x += 25;
}
};
ball.onEnterFrame = function() {
ball._y += 10;
};
function hit() {
if (box.hitTest(ball)) {
ball._y -=100;
}
};
setInterval(this, "hit", 100);
Alex_beginner
29.05.2008, 17:10
Млин! Да че ж Вы все пишете на клипах. Это некрасиво и не читабельно. Делайте динамику на главной временной шкале.
Сделайте движение мяча в одном обработчике _root.onEnterFrame.
События нажатия клавиш onKeyDown сделайте тоже на главной временной шкале но не в onEnterFrame.
Key.addListener(_root);
_root.onKeyDown = function(code):Void
{
trace(Key.getCode());
}
StachelDraht
30.05.2008, 15:01
Не работает.
Key.addListener(box);
_root.onKeyDown = function():Void
{
if (Key.LEFT){
box._x -= 25;
} else
if (Key.RIGHT) {
box._x += 25;
}
};
и второй вопрос. Как заставить мяч отскакивать от поверхности в произвольную сторону по оси х.
И как сделать что бы не просто перепрыгивал на координату 150, а летел до нее.
Сейчас:ball._y -= 150;
Alex_beginner
30.05.2008, 15:43
А Вы сравните строчки :
- у меня:
Key.addListener(_root);
_root.onKeyDown = function():Void
- у Вас:
Key.addListener(box);
_root.onKeyDown = function():Void
Надете разницу - поймете почему неработает.
Потом внутри обработчика, нужно написать следующее:
if (Key.getCode()==Key.LEFT)
{
trace("Сработала кнопище влево")
};
Вот так наверно лучше будет.
и второй вопрос. Как заставить мяч отскакивать от поверхности в произвольную сторону по оси х.
Тут я Вас несовсем понял. На рисунке (см.выше) видно, что он отскакивает в разные стороны под различными углами к "телеге" в пределах 180 градусов (прошу не путать с градусами в спиртном:)), то есть шарик позиционируется координатами x и y, но не одной какой-нибудь. Тут пожалуйста разъясните.
StachelDraht
03.06.2008, 12:26
Насет листенеров понял.
Ну вобщем то да, мячик должен отскакивать в разные стороны. Как это сделать?:)
Psycho Tiger
03.06.2008, 17:54
Если клавиша направо, если клавиша налево - вот как это звучит. Конечно, это не работает. Другое дело если клавиша налево нажата - тогда и будет работать.
if (Key.isDown(Key.LEFT))
и второй вопрос. Как заставить мяч отскакивать от поверхности в произвольную сторону по оси х.
И как сделать что бы не просто перепрыгивал на координату 150, а летел до нее.
Вводим переменные xmov и ymov. Вместо
ball._y+=25;
пишем
ball._y+=ymov;
Где нибудь вначале переменную эту определим:
var ymov:Number=10;
При ударе:
ymov*=-1;
Аналогично для xmov, только
ball._x+=xmov
и (тебе же случайное направление надо?)
xmov=random(20)-10;
StachelDraht
03.06.2008, 19:08
круть! Спасибо большое!
Alex_beginner
03.06.2008, 19:35
Хочу дополнить пост PsychoTiger!
Если хотите, что бы мячик отскакивал "реально", пользуйтесь законами физики. Кинетика отскока и "полета" шара довольно просто описывается физическими уравнениями.
Хотите самый лучший совет?
Если хотите делать игры, найдите и обязательно купите книгу.
Джоб Макар.
Секреты Разработки игр
в Macromedia Flash MX.
Пригодится не только для игр.
StachelDraht
04.06.2008, 15:17
Хотите самый лучший совет?
Если хотите делать игры, найдите и обязательно купите книгу.
Джоб Макар.
Секреты Разработки игр
в Macromedia Flash MX.
Пригодится не только для игр.
Учту, спасибо!
Всем огромное спасибо за помощь и советы!:)
... Поэтому метод hitTest() сравнивает не положения заполненных точек двух клипов, а лишь их граничные координаты (получить которые можно, используя метод getBounds()). Это означает, что факт коллизии будет подтвержден не тогда, когда объекты внутренней структуры двух клипов действительно перекрывают друг друга, а тогда, когда пересекаются области, ограниченные описанными вокруг них прямоугольными рамками.
там ещё есть параметр shapeFlag:Boolean. а ещё у BitmapData тоже есть hitTest...
для того, чтобы в арканоиде шарик отскакивал реалистично, достаточно разделить ситуацию на два случая
1) шарик ударяется о плоскость
а) плоскость неподвижна -> угол падения равен углу отражения
б) плоскость подвижна, угол отражения получает приращение, кратное скорости плоскости (скорость считается положительной при движении вправо, угол - по часовой стрелке);
2) шарик ударяется об угол, всё то же самое, но отскакивает шарик от воображаемой плоскости, перпендикулярной прямой, соединяющей центр шарика и угол, и приращение от движения плоскости получает не угол отражения, а скорость шарика.
ещё можно прописать отскоки от боковин. но там принцип тот же.
Пускай модераторы меня простят, за то, что занимаюсь мультиводством, но не мог удержаться и не прокомментировать подпись Double.
Кто говорит, тот не знает. Кто знает, тот не говорит.
Сам себе противоречишь.
П.С.Спасибо, буду знать.
Пускай модераторы меня простят, за то, что занимаюсь мультиводством
Флеймом это называется, а не мультипостингом и тем более не «мультиводством».
Amir.web
02.03.2011, 22:35
нужно :
var dy = 5 //это будет скорость по оси у
var dх = 5 //это будет скорость по оси х
onEnterFrame = function () {
ball._y+=dy
if (ball.hitTest(palka)){
dy=-dy
}
}
ball -это мячик
palka - это препятствие ( от которево мячик отбевается)
AlexCooper
04.03.2011, 01:14
Вообще хитТест я бы не использовал, так как работает гараздо дольше. Мая - правильная фигура. Если поместить начало координат в центр мяча то его края будут отдаленны на его радиус или куда проще R=ball._width/2=ball._hight/2;
Одним словом Я бы перевёл все плоскостя (а точнее лишь их краи) в векторы и плюс вектор движения самого мяча, столкновение рассчитывал бы по дистанции между векторами и центром ХУ а так же сократил бы итерации за счёт введения зон для поиска. Если нужно дам статью по реализации этого всего в жизнь.
temofony
05.03.2011, 09:13
юзайте физику,проецируйте ее в ас и готово)
Aleksan007
06.03.2011, 10:53
а в чем разница? писать код в клипе или на главной временной шкале?
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.