![]() |
Проблема: Делаю Аэрохоккей
Уже готово поле, шайба отскакивает от стен.
Люди подскажите как сделать отскок от "клюшек", чтобы шайба отлетала под отраженным углом и со скоростью удара? Добавлено через 3 минуты Клюшки круглые - 50х50пикселей, шайба круглая 32х32. |
...короче, люди, сделайте за меня
http://www.google.ee/search?hl=ru&q=...1%81%D0%BA&lr= И ещё советую книгу "Making Things Move!"...только он для АС3...но алгоритмы везде одинаковые независимо от языка |
При отскоке шайбы от клюшки, тебе нужно учитывать направление движения самой шайбы и клюшки? Я бы не учитывал, ИМХО так будет играбельней. Если надо, сам потом расширишь алгоритм.
Так как у нас и шайба и клюшка - это окружности, после удара шайба будет двигаться по вектору, который можно провести от центра клюшки до центра шайбы(изменишь, если не устраивает). Самое сложное - определить координаты шайбы и клюшки в момент столкновения. Простой hitTest тут естественно не подходит, так как шайба и клюшка могут двигаться с большими скоростями и пролететь друг сквозь друга. Я бы решил это через систему уровнений. Сейчас я не могу привести её, так как исходник реализующий это на домашнем компе( в своё время делал арканоид (: ), вечером если надо скину. Смысл в том что можно записать уровнение движения шайбы и клюшки как Код:
Xш = X0ш+Vxш*tТо де самое для клюшки Код:
Xк = X0к+Vxк*tКод:
(Xк-Xш)^2 + (Yк-Yш)^2 = (Rш+Rк)^2Если надо, вечером выложу рабочий код, на Delphi правда. |
Буду благодарен за любую помощь.
У меня столкновение определяется так: Код:
function checkPaddle(ball) {не могу сделать как правильно отскочить шайбе |
SenCheR, для оформления своего кода, надо использовать теги [code][/code].
|
Спасибо. А есть ли какой-то простой вариант без времени?
Может сделать отбивные точки - 4 вверху, внизу, слева и справа и 4 по диагоналям биты? |
Простой вариант - каким-то образом определяем, что столкнулись. То есть имеем центры шайбы(Pш) и клюшки(Pк) в момент столкновения. Тогда шайба отлетит по вектору V:
Код:
v = normalize(Pш-Pк)*Speed |
Спасибо попробую. А исходник когда можно будет глянуть?
|
SenCher, имеешь в виду исходник о котором я говорил? Тогда вот. Еле нашёл) Страшно смотреть как я кодил пару лет назад)
Код:
function CirCollision(x1,y1,r1,a1,s1,x2,y2,r2,a2,s2:single; var t:single):boolean;"var t:single" - это значит примерно то же что передача параметра по ссылке в AS. Оказывается я здесь выводил немного другое уравнение движения, с учётом угла движения, а не вектора. Вообщем, функция проверяет сталкиваются ли две окружности, начальная позиция которых x1,y1 и x2,y2; радиусы r1,r2; углы под которыми они двигаются a1 и a2; скорости s1 и s2. Углы, как видно, в радианах. Уравнение движения таких окружностей должны быть вида Код:
X=X0+cos(Angle)*Speed*t;Даже не знаю, получится ли тебе её адаптировать под свою ситуацию. |
| Часовой пояс GMT +4, время: 15:55. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.