Понедельник, 25 Ноября 2024, 12:16

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Прилипание нескольких объектов к курсору
DTYohaneДата: Пятница, 24 Декабря 2021, 22:57 | Сообщение # 1
был не раз
Сейчас нет на сайте
Доброго времени суток уважаемые форумчане! Делаю игру с элементами пазла. Столкнулся с проблемой что при нажатии на кусок пазла , если он закрывает собой другой кусок, то к курсору притягиваются оба объекта. Хотел бы услышать мнение людей кто разбирается в этом больше чем я.
В событии "Создание"
Код
go=false

В событии "Шаг"
Код
if (go=true)
{
    mp_linear_step(mouse_x,mouse_y,120,0)
    }

В событии "Left Pressed"
Код
go=true

В событии "Left Released"
Код
go=false
DmitriyIMДата: Суббота, 25 Декабря 2021, 00:34 | Сообщение # 2
частый гость
Сейчас нет на сайте
DTYohane, нужно использовать индекс объекта по Z - стопка кусков пазла. Когда создается каждый кусок, ему кроме x и y нужно указывать z, причем на единицу больше, чем предыдущему. Тогда в событии "Left Pressed" можно будет назначить go=true для куска с наибольшим индексом:
1. берешь индекс объекта, попавшего в обработчик
2. проверяешь, есть ли уже какой-то активный кусок, который получил go=true. Если да, то смотришь его индекс если он меньше, то присваиваешь ему go=false
3. в событии "Left Released" сбрасываешь индекс активного куска для следующих нажатий...

Таким образом, нажатие будет происходить только на верхнем объекте.
DTYohaneДата: Суббота, 25 Декабря 2021, 02:21 | Сообщение # 3
был не раз
Сейчас нет на сайте
DmitriyIM, Спасибо, в голове прикинул как это должно выглядеть, но у меня туговато с командами. Не могли бы вы по-подробнее описать что значит Z. Насколько я понял это как depth. У меня 20 кусков и всё это разные объекты. В комнате они создаются заранее (без instance_create). Если можете показать на примере буду очень благодарен
MagicHeroДата: Суббота, 25 Декабря 2021, 20:44 | Сообщение # 4
участник
Сейчас нет на сайте
Можешь использовать depth как определение самого верхнего (чем ниже depth тем выше обьект).
У меня подобная ситуация была в игре. При открывания приза в награду выдавались монеты которые появлялись кучей. И мне тоже нужно было чтобы при нажатии активировалась самая верхняя монета среди тех на которые нажали и следом был эффект частиц. Монеты все были с одинаковым depth но с номерами и по мере появления тот у кого ниже номер, будет выше. У меня монет было немного поэтому использовал счетчик. И далее сделал так:
Код

with (obj_reward_push) {    
   if (push == 1) {   // выбор идет из тех на кого нажали
      for (var i = 1; i <= number_all; i++;) {
         if (number == i) {   // если номер равен счетчику то активируем эту монету
             best_num = i;
             break;            // прерываем дальнейший пересчет
         }
      }
   }
}


Сообщение отредактировал MagicHero - Суббота, 25 Декабря 2021, 20:58
DTYohaneДата: Суббота, 25 Декабря 2021, 22:01 | Сообщение # 5
был не раз
Сейчас нет на сайте
MagicHero, Немного подогнал под себя код. Подскажите пожалуйста насчёт for (циклы для меня не тёмный, но всё ещё лес), как его подкорректировать? number_all заменил сразу на 20 так как кусков 20.
Код
with (obj_part_1) {    
   if (go == true) {   // выбор идет из тех на кого нажали
      for (var i = 1; i <= 20; i++;) {
         if (number == i) {   // если номер равен счетчику то активируем эту монету
             mp_linear_step(mouse_x,mouse_y,120,0);
             break;            // прерываем дальнейший пересчет
         }
      }
   }
}
MagicHeroДата: Суббота, 25 Декабря 2021, 23:07 | Сообщение # 6
участник
Сейчас нет на сайте
DTYohane, for это просто сначала указываете точку отчета в моем примере это 1 (var i = 1;) потом идет проверка предела числа, в моем случае это количество монет ( number_all), потом идет счетчик который прибавляет по единице (i++;) можно записать и так i += 1; Счетчик может также отнимать значение и использовать любое другое не обязательно единицу, главное проверять чтобы цикл мог завершится.
DmitriyIMДата: Воскресенье, 26 Декабря 2021, 02:58 | Сообщение # 7
частый гость
Сейчас нет на сайте
Цитата DTYohane ()
DmitriyIM, Спасибо, в голове прикинул как это должно выглядеть, но у меня туговато с командами. Не могли бы вы по-подробнее описать что значит Z. Насколько я понял это как depth. У меня 20 кусков и всё это разные объекты. В комнате они создаются заранее (без instance_create).


Все зависит от того, какие конкретно пазлы ты хочешь создать - форма куска (прямоугольная или классическая), отсюда уже идут вопросы про генерацию сетки и различные эффекты.

Лично я предпочитаю динамическое создание объектов, вот пример создания классических пазлов:


Тут я сделал подъем выбранного куска пазла, чтобы он рисовался поверх других.
DTYohaneДата: Воскресенье, 26 Декабря 2021, 12:03 | Сообщение # 8
был не раз
Сейчас нет на сайте
DmitriyIM, Формы кусков прямоугольные, каждый кусок как отдельный объект заранее созданный в комнате, сетка состоит из 20 невидимых объектов к которым притягиваются куски при collision.

Добавлено (26 Декабря 2021, 12:07)
---------------------------------------------
MagicHero, Прописал каждому куску в создании индивидуальный номер (var number). В Шаг засунул код

Код
var number=9
with (obj_part_9) {    
   if (go == true) {   // выбор идет из тех на кого нажали
      for (var i = 1; i <= 20; i++;) {
         if (number == i) {   // если номер равен счетчику то активируем эту монету
             mp_linear_step(mouse_x,mouse_y,120,0);
             break;            // прерываем дальнейший пересчет
         }
      }
   }
}

Всё равно берёт несколько кусков сразу так как проверка идёт на все объекты под курсором не зависимо от их глубины
DmitriyIMДата: Воскресенье, 26 Декабря 2021, 17:36 | Сообщение # 9
частый гость
Сейчас нет на сайте
Цитата DTYohane ()
Всё равно берёт несколько кусков сразу так как проверка идёт на все объекты под курсором не зависимо от их глубины


Правильно, потому что ты не делаешь замыкание, после того, как был выбран первый кусок пазла.

Цитата
Тогда в событии "Left Pressed" можно будет назначить go=true для куска с наибольшим индексом:
1. берешь индекс объекта, попавшего в обработчик
2. проверяешь, есть ли уже какой-то активный кусок, который получил go=true. Если да, то смотришь его индекс если он меньше, то присваиваешь ему go=false
3. в событии "Left Released" сбрасываешь индекс активного куска для следующих нажатий...


Тебе нужно посмотреть про глобальные переменные

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


Сообщение отредактировал DmitriyIM - Воскресенье, 26 Декабря 2021, 21:24
  • Страница 1 из 1
  • 1
Поиск:

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