| 
	
		
		
			| Изменить фрейм спрайта |  |  |  | 
| Made_In_USSR | Дата: Воскресенье, 23 Мая 2010, 21:29 | Сообщение # 1 |  | заслуженный участник Сейчас нет на сайте | Доброго времени суток и здрасте.  У меня возникла проблема, сейчас изложу. Надеюсь на вашу помощь.   Думаю все играли в ВарКрафт 2. Ну если не играли, никогда не поздно   Конкретный пример реализации стен, как в выше упомянутой игре. Есть стена (один блок). На него назначен спрайт "единичной" стены. Если рядом с блоком поставить еще один, то спрайты обоих изменятся, как бы "сливаясь" в один. Если добавить еще один с другой стороны, то все три "сольются" в один и так далее.
 Для наглядности вот вам скрин:
 
    Суть вопроса, как реализовать это в гамаке. Идей у меня нет даже приблизительно, так что мне не то что готовый солюшен, даже просто толчек в правильном направлении будет уже хорошо. Но желательно конечно чуток разжевать  
 Новичкам изучающим GML кликать сюда.
 Много примеров, исходников, библиотек и вообще всего что вам только может пригодиться. Автор портала, прости меня за ссылку, наболело =)
 |  |  |  |  |  | 
| Qvant | Дата: Воскресенье, 23 Мая 2010, 21:48 | Сообщение # 2 |  |   почти ветеран Сейчас нет на сайте | Вот алгоритм : разбей стены на куски , например 32х32 , левый край , середина , правый край и одиночная стена .
 при добавлении стены на карте помещай их координатах округлить(вид / 32 ) и делай проверку на столкновения со всеми стенами
 если стена без столкновений , то она одиночная
 если одиночная стена с одиночной , то стены меняются - слева будит левый край , справа правый край
 если одиночная стена с левым краем - то одиночная станет левым краем а левый край серединой
  У меня валялся пример похожей реализации , там вместо стен дорога была , но я этот пример сейчас в мусоре не откапаю  |  |  |  |  |  | 
| Made_In_USSR | Дата: Воскресенье, 23 Мая 2010, 22:06 | Сообщение # 3 |  | заслуженный участник Сейчас нет на сайте | Ну это уже кое-что    Пробовал я таким методом. Фокус-то в чем: тайл стены 32*32 на сетке с размером ячейки 32*32. Как разбить такую вакханалию на части?    Quote   // image_index=0   // image_speed=0   //if (collision_point(wall.x+2,wall.y-2,wall,true,true))   //then {   // image_index=4   // image_speed=0   // }   //if (collision_point(wall.x+2,wall.y+35,wall,true,true)) //then {
 // image_index=1
 // image_speed=0
 // }
 
вот что я пытался впарить гамаку, и естественно он меня послал. если тебе этот код говорит больше чем мен поделись соображениями. Где я дал маху?
 
 Новичкам изучающим GML кликать сюда.
 Много примеров, исходников, библиотек и вообще всего что вам только может пригодиться. Автор портала, прости меня за ссылку, наболело =)
 |  |  |  |  |  | 
| Qvant | Дата: Воскресенье, 23 Мая 2010, 22:34 | Сообщение # 4 |  |   почти ветеран Сейчас нет на сайте | temp = collision_point(wall.x+1,wall.y,wall,true,true) if (temp != -1)
 {
 //Код
 }
  в переменной temp будит ID второй стены , в данном случае справа |  |  |  |  |  | 
| Made_In_USSR | Дата: Воскресенье, 23 Мая 2010, 22:48 | Сообщение # 5 |  | заслуженный участник Сейчас нет на сайте | Маленький вопрос: (х+1,у) считает точку столкновения внутри обьекта. Это я к тому, что координаты считаются из верхнего левого угла, а размер обьекта-то 32 пикселя.
 Или это ты абстрактно вписал туда единицу, а смещение в пикселях по месту считать?
  И как ты запихнул айди в переменную? Точнее из чего айди образовался там?   Разжуй пожалуйста  
 Новичкам изучающим GML кликать сюда.
 Много примеров, исходников, библиотек и вообще всего что вам только может пригодиться. Автор портала, прости меня за ссылку, наболело =)
 |  |  |  |  |  | 
| Qvant | Дата: Воскресенье, 23 Мая 2010, 23:07 | Сообщение # 6 |  |   почти ветеран Сейчас нет на сайте | Читаем справку : Проверка cтолкновения
 ...Все эти функции возвращают идентификатор одного из образцов объекта, который сталкивается, или они возвращают отрицательное значение, когда нет столкновения.
 collision_point(x,y,obj,prec,notme) Проверяет, есть ли в точке (x,y) столкновение с объектами obj.
  Алгоритм написаный выше проверяет только горизонтальные блоки стен , поэтому если сместить на 1 пиксель вправо столкновение максимум может с 1 объектом ... блоки одиноковые , поэтому неважно откуда идут координаты , установка стен можно и со смещением округлить(вид / 32 )+16 алгоритм от этого не изменится
 |  |  |  |  |  | 
| Made_In_USSR | Дата: Понедельник, 24 Мая 2010, 08:55 | Сообщение # 7 |  | заслуженный участник Сейчас нет на сайте | Хе-хе, ты не поверишь   Сижу с вечера, и до утра без сна и отдыха. Ну нихрена не хочет алгоритм таким макаром работать.
  Переменная вроде должна возвращать разные значения если есть столкновение и если нет. На практике у меня все инстансы приобретают такой вид, будто есть столкновение со стеной, хотя его нифига нет. Ужжассс!   Ну да ладно, еще повожусь, потом загляну с результатом, а пока еще такой вопрос: if (!collision_point(wall.x+1,wall.y,wall,true,true))
 {
 //Код
 }
 будет ли такой код валидным? читать как "если нет столкновения в точке ... обьекта ..."
  з.ы.: для всех читающих, было бы неплохо, если бы кто нибудь, кто слышал об этом самом туториале о дорогах (сообщение №2) кинул бы на него ссылку (еси есь конечно). 
 Новичкам изучающим GML кликать сюда.
 Много примеров, исходников, библиотек и вообще всего что вам только может пригодиться. Автор портала, прости меня за ссылку, наболело =)
 |  |  |  |  |  |  |  | 
| Made_In_USSR | Дата: Среда, 26 Мая 2010, 19:45 | Сообщение # 9 |  | заслуженный участник Сейчас нет на сайте | Отличный пример! Просто огромное спасибо!    Эм, только один вопрос. alarm0 носит чисто декоративный характер? 
 Новичкам изучающим GML кликать сюда.
 Много примеров, исходников, библиотек и вообще всего что вам только может пригодиться. Автор портала, прости меня за ссылку, наболело =)
 
 
 Сообщение отредактировал Made_In_USSR - Среда, 26 Мая 2010, 19:47 |  |  |  |  |  
 |