Суббота, 09 Ноября 2024, 04:21

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Изменение размера спрайта
Rikstone26Дата: Среда, 18 Марта 2015, 22:17 | Сообщение # 1
частый гость
Сейчас нет на сайте
Чёрт! Кучу времени не открывал gml и теперь ничего вспомнить не могу(да и раньше не особо много знал biggrin )
Теперь мне нужно изменять высоту спрайта(лазера) до тех пор, пока объект не столкнётся с чем-либо.
Измерять размер по высоте до столкновения с любым объектом.


Сообщение отредактировал 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, на самом деле, нужно использовать обе функции, додумаешь, почему? cool
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 экземпляра

Последняя строка так же имеет отдельное значение - экземпляры перебираются по мере их создания, что подразумевает значительно сниженное время выполнения проверки если функция наткнулась на пересекающий экземпляр в начале списка.


  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг