#actionscript-3
#actionscript-3
Вопрос:
Я создаю игру в одевалку и столкнулся со следующей проблемой.
Я знаю, как заставить вещи перетаскиваться, однако всякий раз, когда видеоролик находится на слое ниже другого, он не позволяет мне его отбросить / не регистрирует отпускание мыши.
В этом случае, например, самый верхний слой — это волосы куклы. Под этим слоем находятся предметы одежды, а под ним — основа для куклы. Вот так:https://gyazo.com/a0ea8eae2ee5505874f4207a888249bf
Я могу взять топ из инвентаря, но не могу надеть его на куклу, потому что мой курсор находится над волосами с самого верхнего слоя. В некотором смысле кажется, что слой волос действует как барьер между щелчком курсора и предметом одежды. Есть ли какой-либо способ обойти это?
Вот ссылка на игру в ее нынешнем виде — я уверен, вы быстро заметите проблему, если попытаетесь что-то изменить.ССЫЛКА НА ИГРУ
Вот код для одного из слоев одежды, если это необходимо.
tshirt.addEventListener(MouseEvent.MOUSE_DOWN, drag17);
tshirt.addEventListener(MouseEvent.MOUSE_UP, drop17);
function drag17(event:MouseEvent):void
{
event.target.startDrag();
}
function drop17(event:MouseEvent):void
{
event.target.stopDrag();
}
Извините за довольно грубое объяснение и заранее благодарю вас!
Комментарии:
1. Когда вы удаляете элемент, сделайте этот элемент mouseEnabled= false; Из вашего примера, если волосы имеют значение mouseEnabled = false, релиз будет работать нормально. Конечно, если вы хотите по-прежнему иметь возможность удалять эти волосы, вам нужно будет найти способ вернуть mouseEnabled обратно в true. Один из способов сделать это — перебрать все элементы, когда вы выбираете один, и измените их все на false, а затем, когда вы удалите элемент, измените их все обратно на true.
Ответ №1:
проблема
Вы совершенно правы насчет мешающих волос.
способ 1
Один из способов исправить это (при условии, что вы уронили волосы там):
function drop17(event:MouseEvent):void
{
event.target.stopDrag();
event.target.mouseEnabled = false;
}
В вашем примере с волосами для волос mouseEnabled должно быть установлено значение false, чтобы они не могли быть вашими target
по ошибке при событии мыши. Если волосы не были «сброшены» туда, установите mouseEnabled в значение false для волос везде, где это имеет смысл сделать … возможно, при их первом создании или создании экземпляра.
способ 2
Альтернативный метод заключается в том, чтобы заставить выбранный вами предмет встать в начало z-порядка. Вот так:
function drag17(event:MouseEvent):void
{
addChild(event.target); // this doesn't add another Sprite or movie clip, it just moves it to the top of the z order. Trust me.
event.target.startDrag();
}
Теперь, когда ваш элемент перетаскивания находится вверху, ничто не будет находиться «между» ним и мышью. Этот метод, вероятно, выглядит более чистым, поскольку перетаскиваемая вещь не теряется за другими вещами. Это заставит вас иметь дело с возможной необходимостью размещать предметы в правильном z-порядке при их перемещении, но это можно легко сделать, выполнив addChild в clothesContainer или что-то в этом роде. Это был бы другой вопрос.
Комментарии:
1. Привет, спасибо за ваш ответ! У меня действительно слабое понимание того, как работает as3, что касается вашего первого метода — как бы я вставил mouseEnabled = False в слой волос? для них нет кода перетаскивания. (извините, если это не имеет смысла!)
2. Вам придется делать это для каждой вещи, которая не должна мешать работе мыши. Это можно было бы сделать одним махом, если поместить их все в контейнер, а затем установить для этого контейнера значение mouseEnabled равным false. Но если не в одном контейнере, то сделайте это с каждым элементом. Так что, как
hair.mouseEnabled = false;
и затемeyelashes.mouseEnabled = false;
3. @Alexia возможно, вам потребуется точно объяснить, что вы подразумеваете под «слоем». Это может означать очень много разных вещей
4. Извините за это! под слоем я подразумеваю разделы здесь: ( gyazo.com/40029ff9b481e7ab28355ac8cf9fdded ). Я понимаю, как будет работать mouseEnabled — False, дело в том, что я недостаточно хорошо знаю as3, чтобы заставить его работать без ошибок. Я знаю, что просто скопировать вставку «hair.mouseEnabled = false;» самостоятельно не работает, но я не знаю, как заставить это работать.
5. Просто для пояснения; весь код для прически находится здесь, на кнопке слои