Форум » Вопрос-Ответ » [Game Maker] Драв лайн » Ответить

[Game Maker] Драв лайн

zuko: В общем меня интерисует как с помощью этой штуки сделать лазер с отражением от стен или еще каких нибудь предметов Думать лень мож кто знает

Ответов - 18

2man: Эм...Если я так понял, то тебе нужен закон отражения, типа под каким углом линия идет, под таким углом и оражается..да?:)

zuko: Типа того)

2man: А. Ну..сейчас может быть что-нибудь попробую сделать..если так все понял:) только на ночь глядя может выйти и туфта какая-нибудь


zuko: хм у меня наночь обычно наоборот прет) тока там с пояснениями чтоб я понял)

2man: Не знаю то это аль нет..но вот это я нашел в одном из своих проектов (это я скопировал из какого-то исходника): Создаешь скрипт ХХХ. Пишешь там: var i,j; i=abs(argument0-argument1); j=360-max(argument0,argument1)+min(argument0,argument1); if i=j return(180) else if i<j return(sign(-lengthdir_y(1,argument1-argument0))*i); else return(sign(-lengthdir_y(1,argument1-argument0))*j); Потом создаешь объект, который отражается. В событии столкновения с объектом, ОТ КОТОРОГО отражатеся пишешь: var dir,k; dir=XXX(other.direction,direction); //show_message(string(dir)); k=sign(lengthdir_x(1,dir)*(-lengthdir_y(1,dir)));if k=0 then k=1; direction=direction+k*180-k*min(abs(dir),180-abs(dir))*2; /*if colid!=id then { if other.direction<(direction+90) and other.direction>(direction-90) then { instance_destroy() } else { direction=other.direction; colid=other.id; alarm[0]=10; } } __________________________________________________ Точно не помню с какого примера взял, но пример вроде с миззустика был:) Это поможет создать правдободобный более менее закон отражения. А если ты заменишь объект, который отражается, линией, то и отражатся линия будет..Примерно так:)

zuko: Нет это немного нето.... что же придется самому думать....позже, посплю ато у меня уже пол 9 утра

Кто-то: Учебник по физике и ффперёд, магийо синусофф и косинусофф)))

Spider: А почему бы не сделать объект из центра которого появляются другие объекты-точки (цвета лазера). Эти точки исчезают через полсекунды. Объект куда легче заставить отражаться. Всётаки в стандартных действиях есть. ПРИМЕР (gm6) http://realgames.org.ru/lazer.gm6

zuko: вот такую штуку мне нужно замутить

Ev-genius: так как поверхность может быть наклонной, то просчитать точное отражение не получится, так как перпендикуляр от поверхности сложно будет вычеслить. на помощь думаю может подойти следующая фича: 1---из обьекта пускающего лазерный луч запускаетццо шарик (создали отметку 1 в лазере) в нужную сторону с большой скоростью.. 2---при сталкновении шарика с границей (создали отметку 2) рисуем линию от отметки 1 к 2. 3---отметке 1 присваиваем 2 (1.х=2.х, 1.у=2.у) 4---пока не дошли до конца или не прошли нужное растояние выполняем 2 и 3 так как в ГМ отскок обьектов выполняется довольнотаки провдоподобно (в гм плоскость спрайта и перпендикуляр сам считается как надо) то отражение будет точным если объяснил непонятно могу пример сваять =)

Ev-genius: а.. ещё =) если же это бильярд например и там поверхность стенок реально ровная (не как на рисунке) а именно в игре прям ровно вертикальные или горизонтальные стены без изгибов то можно будет подогнать скриптег отскока работать будет побыстрее да и может поточнее чем первый вариант

zuko: Первый вариант приходил мне в голову но вот придется каждый шаг выстреливать шарик... -поверхность ровная.. Нужно проверять пока хх не равно х желтой точки и уу не равно у желтой точки { номер+=1 пока не стена { хх+=косинус(угол) уу+=синус(угол) } вэйпоинтХ[номер]=хх вэйпоинтУ[номер]=уу вот первый вэйпоинт есть потом надо само отражение просчитать както }

Ev-genius: вобщем посмотрел я с отстрелом шариков, некатит. так как скорость маленькая очень а если скорость движения шариков увеличить то начинаются проблемы со столкновением. а именно последние не регистрируется вечерком гляну с прямыми стенками что можно придумать

Likantrop: Ev-genius пишет: а если скорость движения шариков увеличить то начинаются проблемы со столкновением. может тогда коллижон_лайн юзать?..

Ev-genius: на счёт колижн лайн, всё было бы немного проще если бы функция возвращала х,у координат пересечения =) или хотябы длину получившейся линии. но так как этого нет пришлось проверять каждый пиксель... несмотря на это работает очень шустро и при 20-30 просчётов отражений =) правда мой пример работает только для горизонтальных и вертикальных стен, для наклонных нужно будет чтото другое придумать или доработать пример под конкретную задачу как обычно немного увлекся и помимо решения напихал туда ещё кучу ненужности, зато нагляднее в примере будет Ссылку забыл: Клик

Ev-genius: Spider пишет: Всётаки в стандартных действиях есть. ПРИМЕР (gm6) http://realgames.org.ru/lazer.gm6 кстати про это и говорил, если в примере спайдера увеличить скорость на 9,10....15...итд (у меня например) то отражения получаются совсем непредсказуемыми =) увеличив на 20, отражений совсем нету.. в моем примере точность до 1 пикселя, а именно на углах в последнем пикселе обьекта, проблемки с просчётом иногда бывают, может кто апдейтит, гляньте

zuko: Ev-genius молодец прям то что нужно сделал уважуха.... спасибо большое ....................... Разобрался в скрипте полностью у тебя офигенный мозг сам бы я такое дня три думал) Спасибо еще раз) поправил правда первые две строчки) dir=point_direction(x,y,mouse_x,mouse_y);//угол поворота wx=cos(degtorad(dir));//x на который выполнять проверку wy=sin(degtorad(dir));//y на который выполнять проверку вместо dir=point_direction(mouse_x,mouse_y,x,y)-180; wx=cos(dir*pi/180); wy=sin(dir*pi/180); выложи пример на мизистик

Ev-genius: Да незачто, просто интересно чтото необычное реализовать на счёт исправлений, в хелпе ГМ вроде описано всё, просто не всегда замечаешь нужные функции да и сам бывает тормозишь, вон вижу у себя -180, а достаточно было операнды местами поменять))))) Коменты правда забыл, да и лишнего туда налепил, половина вообще не нужна =) ток выкладывать куда либо лень, пока это дело лежит у меня на нм, еще старые примерчики найду снова выложу, пригодятся может кому



полная версия страницы