2011-02-02 196 views
1

我正在尝试将movieclip球沿着动画片的地面边界移动。您可以使用箭头键移动球体,这会增加和减小其x值,但y值将始终等于Ground动画片段的顶部边缘。AS3 - 获取边缘坐标

要做到这一点,我需要找到电影剪辑地面边缘点的y值。这怎么可能? Ground MovieClip

这就是Ground MovieClip的样子。这是一个不规则的形状。我想要的是任何x点都指向这个形状的顶部边缘。

+0

是地面上的矩形? – Mikushi 2011-02-02 22:13:20

+0

请提供一个屏幕截图,以便我们可以看到“地面”的形状(提示,问题编辑器的图像按钮提供了上传。) – ocodo 2011-02-03 00:46:38

回答

5

如果这是你想要做的,它应该通过你的位图数据的列并为每个商店很容易环路Ÿ值以后可以参照得到Ÿ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

如果不是“缓存值”你想它在运行时滚动的地形,可以通过像素(的BitmapData与宽度列循环1和高度等于你的地形位图)并获得价值。

您的hitTestPoint()建议也不错。请记住,BitmapData类也有hitTest方法。查看Mike Chamber's posts就可以了。

此外,您可能想在Corey's Collision Detection Kit

HTH

2

可以使用getbounds()得到一个矩形

你可以得到一个矩形的顶部和左侧对象

1

我找到了解决办法。使用一个for循环来hitTestPoint(x_val,y_val,true),每个点从ground.y直到ground.y + ground.height。当发现一击时,这就是我的观点。

4

乔治的技术来一看是好的(&可能是最快的)一个静态的地形。

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

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

与一个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。

我做了一个快速的动画例如:

如果您取消注释该//提取轮廓块,你会得到恢复在这种情况下斜坡