2013-03-31 2 views
0

Итак, у меня есть игра в флеш-платформе. В этой игре вам нужно перепрыгнуть через шипы. Поэтому я создаю шип и преобразую его в символ, клип. Когда он регистрируется как видеоклип, это не треугольник (например, шипы), а вместо этого прямоугольник. Это означает, что когда игрок идет, чтобы избежать всплесков и прыжков, если он слишком близко, он умирает, но он не попадает в шип, он попадает в невидимый прямоугольник вокруг шипа. Там все равно можно изменить форму клипа, чтобы он соответствовал шипу и шипу.Изменение размеров клипов AS3

ответ

0

Из моего опыта по тому же типу вопроса, вы не можете использовать AS3 hitTestObject (который я хотел бы представить вам» re, если у вас есть эта проблема) с определенной формой MC. Это всегда будет по умолчанию поле, которое занимает пространство самого мувиклипа.

Итак, чтобы ответить на ваш вопрос, нет, вы не можете изменить форму MC, чтобы сделать его всплеск, по умолчанию hitTestObject использует ограничительную рамку вокруг MC.

Существует несколько способов обойти это (многие люди предлагали НЕ использовать hitTestOjbect в целом, так как он не очень эффективен и вместо этого написал свой собственный тестовый код. Я бы предложил искать примеры этого онлайн, есть много их).

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

Но если вы хотите использовать hitTestObject, к сожалению, вам нужно использовать весь ограничивающий объект объект. Поскольку я не совсем уверен в деталях того, как вы собираетесь это делать, моим лучшим предложением было бы просто выйти в интернет и ознакомиться с основами обнаружения попадания в AS3.

Ваша проблема связана с обнаружением попаданий, а не с видеоклипами.

0

Внутренний тест ударов между объектами проверяет ограничивающие рамки объектов, чтобы он не работал на вас.

Если вы можете как-то использовать плеер агент в качестве точки (самая низкая точка, как посреди его ноги или что-то в этом роде), вы можете использовать spike.hitTestPoint(globalFootX, globalFootY, true);

Если это не работает, вам либо придется вручную создать hittest-представление для предметов и ваша собственная логика hittest.

Другое решение состоит в том, чтобы нарисовать элементы в отдельный спрайт, а затем посмотреть, перекрываются ли пиксели. Я знаю, что сделал это в старом проекте AS2 с AI-роботами неправильной формы, перемещающимися в мире неправильной формы.

Я предоставил этот код для справки, он может быть трансформируемым в AS3 или, по крайней мере, вы можете использовать это как вдохновение для того, что для Google, чтобы найти это решение в AS3.

class messer_studios.utils.CollisionDetection { 
    static public function checkForCollision(p_clip1:MovieClip, p_clip2:MovieClip, p_alphaTolerance:Number):Rectangle {  
     // set up default params: 
     if (p_alphaTolerance == undefined) { 
      p_alphaTolerance = 255; 
     } 

     // get bounds: 
     var bounds1:Object = p_clip1.getBounds(_root); 
     var bounds2:Object = p_clip2.getBounds(_root); 

     // rule out anything that we know can't collide: 
     if (((bounds1.xMax < bounds2.xMin) || (bounds2.xMax < bounds1.xMin)) || ((bounds1.yMax < bounds2.yMin) || (bounds2.yMax < bounds1.yMin))) { 
      return null; 
     } 
     //Debug.log("might collide"); 

     // determine test area boundaries: 
     var bounds:Object = {}; 
     bounds.xMin = Math.max(bounds1.xMin, bounds2.xMin); 
     bounds.xMax = Math.min(bounds1.xMax, bounds2.xMax); 
     bounds.yMin = Math.max(bounds1.yMin, bounds2.yMin); 
     bounds.yMax = Math.min(bounds1.yMax, bounds2.yMax); 

     // set up the image to use: 
     var img:BitmapData = new BitmapData(bounds.xMax-bounds.xMin, bounds.yMax-bounds.yMin, false); 

     // draw in the first image: 
     var mat:Matrix = p_clip1.transform.concatenatedMatrix; 
     mat.tx -= bounds.xMin; 
     mat.ty -= bounds.yMin; 
     img.draw(p_clip1, mat, new ColorTransform(1, 1, 1, 1, 255, -255, -255, p_alphaTolerance)); 

     // overlay the second image: 
     mat = p_clip2.transform.concatenatedMatrix; 
     mat.tx -= bounds.xMin; 
     mat.ty -= bounds.yMin; 
     img.draw(p_clip2, mat, new ColorTransform(1, 1, 1, 1, 255, 255, 255, p_alphaTolerance), "difference"); 

     // find the intersection: 
     var intersection:Rectangle = img.getColorBoundsRect(0xFFFFFFFF, 0xFF00FFFF); 
     // if there is no intersection, return null: 
     if (intersection.width == 0) { 
      return null; 
     } 

     // adjust the intersection to account for the bounds: 
     intersection.x += bounds.xMin; 
     intersection.y += bounds.yMin; 
     return intersection; 
    }; 

    public static function hitTestShape(mc1:MovieClip, mc2:MovieClip, alphaTolerence:Number):Boolean { 
     return checkForCollision(mc1, mc2, alphaTolerence) != null ? true : false; 
    } 
} 
0

Вы можете использовать BitmapData вместе с hitTest проверить столкновения на уровне пикселей, как это.

(Для проверки кода поместите два символа на этапе Flash, «rectClip» и «spike».Также проверяйте его сначала, удерживая их, а затем во второй раз держите их тронутыми и проверяйте.)

(В любом случае вы можете установить MouseMove или startDrag() и проверить его в прямом эфире.)

var rect:Rectangle = rectClip.getBounds(this); 
var rectClipBmpData = new BitmapData(rect.width, rect.height, true, 0); 
rectClipBmpData.draw(rectClip); 

var spikeRect:Rectangle = spike.getBounds(this); 
var spikeBmpData = new BitmapData(spikeRect.width, spikeRect.height, true, 0); 
spikeBmpData.draw(spike); 

if(rectClipBmpData.hitTest(new Point(rectClip.x, rectClip.y), 
           255, 
           spikeBmpData, 
           new Point(spike.x,spike.y), 
           255)) 
{ 
    trace("hit"); 
}else 
{ 
    trace("No hit"); 
} 

Успехов.

Смежные вопросы