Изменение размера спрайта
| |
Rikstone26 | Дата: Среда, 18 Марта 2015, 22:17 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Чёрт! Кучу времени не открывал gml и теперь ничего вспомнить не могу(да и раньше не особо много знал ) Теперь мне нужно изменять высоту спрайта(лазера) до тех пор, пока объект не столкнётся с чем-либо. Измерять размер по высоте до столкновения с любым объектом.
Сообщение отредактировал Rikstone26 - Среда, 18 Марта 2015, 22:18 |
|
| |
YellowAfterlife | Дата: Четверг, 19 Марта 2015, 01:08 | Сообщение # 2 |
Сейчас нет на сайте
| В зависимости от поворота изображения, менять image_xscale или image_yscale. Чтобы растянуть до столкновения можно использовать цикл, к примеру Код var sd; sd = 0.25 // изменение масштаба за шаг цикла image_yscale = 1 repeat (200) { // максимальная длина лазера. спасает от зависания если препятствий на пути нет. image_yscale += sd if (place_meeting(x, y, obj_solid)) { // если на что-то наткнулись то отменяем последнее расширение image_yscale -= sd break } } Можно и иными способами проверять, это уже зависит от случая использования.
|
|
| |
aFriend | Дата: Четверг, 19 Марта 2015, 08:05 | Сообщение # 3 |
участник
Сейчас нет на сайте
| При помощи collision_point/collision_line, lengthdir_* и цикла можно находить расстояние до чего-либо и рисовать линию (или растягивать спрайт)
|
|
| |
XDominator | Дата: Четверг, 19 Марта 2015, 09:14 | Сообщение # 4 |
постоянный участник
Сейчас нет на сайте
| Думаю все таки collision_line тут неуместно, он грузит намного сильней, а вот поинт вполне себе подходит, да.
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
aFriend | Дата: Четверг, 19 Марта 2015, 18:05 | Сообщение # 5 |
участник
Сейчас нет на сайте
| XDominator, на самом деле, нужно использовать обе функции, додумаешь, почему?
|
|
| |
XDominator | Дата: Пятница, 20 Марта 2015, 08:53 | Сообщение # 6 |
постоянный участник
Сейчас нет на сайте
| Максимально оптимальный лазер, который я знаю, создается с помощью point, sin\cos и цикла. Зачем тебе line, который фактически делает тоже самое?
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
LunarPixel | Дата: Пятница, 20 Марта 2015, 09:08 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| XDominator, подозреваю, что aFriend говорит о том, чтобы постоянно проверять весь путь, пройденный лазером, на случай, если вдруг что-то появится на этом пути уже после начала его работы.
|
|
| |
XDominator | Дата: Пятница, 20 Марта 2015, 09:35 | Сообщение # 8 |
постоянный участник
Сейчас нет на сайте
| Цитата LunarPixel ( ) XDominator, подозреваю, что aFriend говорит о том, чтобы постоянно проверять весь путь, пройденный лазером, на случай, если вдруг что-то появится на этом пути уже после начала его работы.
Я тоже так подумал, но это должен быть какой-то "медленный" лазер, т.к. по идее он полностью рассчитывается внутри одного stepa и во время расчета его длины чисто физически внутри не может ничего появиться
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
aFriend | Дата: Пятница, 20 Марта 2015, 16:04 | Сообщение # 9 |
участник
Сейчас нет на сайте
| LunarPixel, XDominator, вот простой пример: мой лазер в длину 200 пикселей, вот код: Код if(collision_line(lengthdir_x(0,image_angle),lengthdir_y(0,image_angle),lengthdir_x(200,image_angle),lengthdir_y(200,image_angle))){ for(int i = 1; i<=200,i++){ ищем длину до стенки при помощи collision_point; } }else{ ray_length = 200; } таким образом, если на пути нет никаких обьектов, которые преломляют луч, то выполнение кода ускорится в разы.
Сообщение отредактировал aFriend - Пятница, 20 Марта 2015, 16:05 |
|
| |
XDominator | Дата: Понедельник, 23 Марта 2015, 09:00 | Сообщение # 10 |
постоянный участник
Сейчас нет на сайте
| Цитата aFriend ( ) таким образом, если на пути нет никаких обьектов, которые преломляют луч, то выполнение кода ускорится в разы.
Уверен, что collision_line это тот же collision_point, просто уже загнанный в цикл, а значит что фактически при таком подходе код не ускорится, а замедлится до 2х раз при максимально возможном расстоянии, т.к. это самое расстояние будет прокручиваться 2 раза вместо 1-го. Хотя без замеров времени выполнения line и point не буду утверждать это на 100%
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
YellowAfterlife | Дата: Понедельник, 23 Марта 2015, 21:02 | Сообщение # 11 |
Сейчас нет на сайте
| Цитата XDominator ( ) Уверен, что collision_line это тот же collision_point, просто уже загнанный в цикл, а значит что фактически при таком подходе код не ускорится, а замедлится до 2х раз при максимально возможном расстоянии, т.к. это самое расстояние будет прокручиваться 2 раза вместо 1-го. Хотя без замеров времени выполнения line и point не буду утверждать это на 100% collision_line это не collision_point в цикле. Будь это так, разве не должно было бы время выполнения функции расти с увеличением расстояния между точками, в конечном счете вызывая сбои в работе игры из-за превышения допустимых норм? Но этого не происходит. collision_line требует одинакового времени выполнения вне зависимости от того, является ли длина отрезка 100 пикселей, или 100 миллионов пикселей. Стандартные принципы реализации такой функции подразумевают следующее: Цитата Для каждого экземпляра подходящего вида: Если bounding box экземпляра пересекает прямоугольник, в который вписана линия (4 числовых проверки): Если bounding box экземпляра пересекает линию (более затратно): Если флаг precise == false, у экземпляра не "точная" маска столкновений, или линия пересекает пиксельную маску (наиболее затратно): Прервать цикл, вернуть ID экземпляра Последняя строка так же имеет отдельное значение - экземпляры перебираются по мере их создания, что подразумевает значительно сниженное время выполнения проверки если функция наткнулась на пересекающий экземпляр в начале списка.
|
|
| |
|