AS3 - 获取边缘坐标

时间:2011-02-02 22:08:49

标签: actionscript-3

我正试图沿着movieclip Ground的边界移动movieclip Ball。您可以使用箭头键移动球,这将增加和减少其x值,但y值将始终等于地面动画片段的上边缘。

为此,我需要找到movieclip Ground边缘上的点的y值。这怎么可能? Ground MovieClip

这就是Ground MovieClip的样子。它是不规则的形状。我想要的是在这个形状的顶部边缘的任何x点和y点。

5 个答案:

答案 0 :(得分:5)

如果这就是您要做的全部内容,那么应该很容易遍历位图数据的列,并为每个商店添加 y 值,您可以稍后引用以获得 y 表示 x 。 这是一个基本的例子:

//get values
var bitmapData:BitmapData = new Terrain(480,320);//Terrain is a reference to your image as BitmapData
var yValues:Vector.<Number> = new Vector.<Number>(bitmapData.width,true);

for(var i:int = 0 ; i < bitmapData.width ; i++){
    for(var j:int = 0 ; j < bitmapData.height; j++){
        //this conditions might change based on the content of your image, black if fine for now
        if(bitmapData.getPixel(i,j) == 0) {
            yValues[i] = j;
            j = bitmapData.height;
        }else yValues[i] = bitmapData.height;
    }
}
//test values
var bitmap:Bitmap = new Bitmap(bitmapData);
var ball:Sprite = new Sprite();ball.graphics.lineStyle(5,0x009900);ball.graphics.drawCircle(-5,-5,5);
addChild(bitmap);
addChild(ball);

addEventListener(Event.ENTER_FRAME, update);

function update(event:Event):void {
    ball.x = mouseX;
    if(mouseX > 0 && mouseX <= bitmap.width) ball.y = yValues[mouseX];
}

terrain

如果您想在运行时滚动地形而不是“缓存值”,则可以遍历一列像素(宽度为1且高度等于地形位图的位图数据)并获取值飞。

你的 hitTestPoint()建议也不错。请记住,BitmapData类也有一个hitTest方法。在此查看Mike Chamber's posts

另外,您可能需要查看Corey's Collision Detection Kit

HTH

答案 1 :(得分:4)

对于静态地形,乔治的技术很好(并且可能是最快的)。

如果地形剪辑移动,计算可能会变得非常昂贵:2个嵌套循环来获取查找表=哎哟。

在这种情况下,我们可以使用BitmapData的getcolorBoundsRect()(!= getBounds():))属性。

使用名为scene的bitmapdata,它会给出类似的内容:

scene.fillRect( scene.rect, 0 );//clear bitmapdata
scene.draw( mc );//draw the clip

var rect:Rectangle = new Rectangle( mouseX, 0, 1, scene.height );//create a 1px wide  rect at the desired X position
var slice:BitmapData = new BitmapData( 1, scene.height, true, 0 );// create a slice bitmapdata
slice.copyPixels( scene, rect, new Point );//draw the slice rect into the slice bitmapdata
return new Point( rect.x, slice.getColorBoundsRect( 0xff000000, 0, false ).topLeft.y );//retrieve the top left corner of the getColorBoundsRect

切片的左上角getColorBoundsRect()是最不透明的像素。 这在计算方面是一个非常便宜的测试,所以它可以在循环中使用。

建议不要每次都创建一个'slice'bitmapData。

我做了一个快速动画示例:

如果取消注释//提取轮廓块,您将获得一种便宜的方法来检索斜率的像素

答案 2 :(得分:2)

您可以使用getbounds()获取矩形

你可以得到那个矩形的顶部和左边的物体

答案 3 :(得分:1)

我找到了解决方案。使用for循环来从ground.y到ground.y + ground.height的每个点命中测试点(x_val,y_val,true)。当发现命中时,这就是我的观点。

答案 4 :(得分:1)

在这种情况下,您还可以使用collision detection kit