Actionscript 3 - альтернативы.hitTestObject или ограничения позиции
Мне нужно определить, когда MC2 находится над MC1, что он находится внутри границ MC1. чтобы сделать это, я обычно использовал бы 4 отдельных ограничения xy +, и, к сожалению,.hitTestObject в моих работах, похоже, также нуждается в 4 отдельных ограничениях x y + -.
Кто-нибудь знает более упрощенный способ добиться этого.
или x y + - ограничения все еще единственный способ сделать это?
Заранее спасибо.
2 ответа
Окончательное решение вашей проблемы для обнаружения попадания двух фигур - использование bitmapData.hitTest(). Вы можете обнаружить попадание между любыми фигурами, а не только прямоугольниками. для этого вы должны нарисовать обе ваши фигуры на bitmapData, как линия ниже:
var shape1Bitmap:BitmapData = new BitmapData(shape1MC.with,shape1MC.height,true,0x000000);
shape1Bitmap.draw(shape1MC);
var shape2Bitmap:BitmapData = new BitmapData(shape1MC.with,shape1MC.height,true,0x000000);
shape1Bitmap.draw(shape1MC);
shape1Bitmap.hitTest(new Point(),shape2Bitmap):Boolean;******
Чтобы продолжить, используйте BitmapData.hitTest(), следуйте порядку здесь: https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html
http://dougmccune.com/blog/2007/02/03/using-hittestpoint-or-hittest-on-transparent-png-images/
Здесь немного сложнее добавить примеры bitmapData.hitTest(). если остались какие-либо вопросы, пожалуйста, дайте мне знать, чтобы объяснить.
Удачи
Я не знаю встроенного способа сделать это, но это достаточно легко, используя hitTestPoint
с каждого угла квадрата:
function isSquareInsideObject(square:DisplayObject, obj:DisplayObject):Boolean {
if(!obj.hitTestPoint(square.x, square.y, true)) return false;
if(!obj.hitTestPoint(square.x + square.width, square.y, true)) return false;
if(!obj.hitTestPoint(square.x + square.width, square.y + square.height, true)) return false;
if(!obj.hitTestPoint(square.x, square.y + square.height, true)) return false;
return true;
}
Для более сложных форм, чем для квадрата, вам нужно будет добавить больше точек, чтобы быть точными, и тогда это становится менее изящным и менее производительным решением.
Вам нужно, чтобы этот аргумент формы (третий параметр для hitTestPoint) был установлен в true
если вы хотите проверить реальную форму круга вместо прямоугольной ограничительной рамки круга. Если ваш круг представляет собой растровое изображение (а не фигуру), то я бы предложил наложить круговую маску на объект для достижения того же результата.
Если ваш квадрат не привязан к 0,0 или вы не возражаете против дополнительного (небольшого) снижения производительности, вы также можете использовать var bounds:Rectangle = square.getBounds(this)
а затем использовать вспомогательные свойства объекта прямоугольника (bounds.bottomLeft
, bottomRight
, topLeft
, topRight
)