我正试图沿着movieclip Ground的边界移动movieclip Ball。您可以使用箭头键移动球,这将增加和减少其x值,但y值将始终等于地面动画片段的上边缘。
为此,我需要找到movieclip Ground边缘上的点的y值。这怎么可能?
这就是Ground MovieClip的样子。它是不规则的形状。我想要的是在这个形状的顶部边缘的任何x点和y点。
答案 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];
}
如果您想在运行时滚动地形而不是“缓存值”,则可以遍历一列像素(宽度为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。
我做了一个快速动画示例:
来源位于:http://www.nicoptere.net/AS3/junkyard/BitmapRectTest.as
我刚刚发现了要点^^
如果取消注释//提取轮廓块,您将获得一种便宜的方法来检索斜率的像素
答案 2 :(得分:2)
您可以使用getbounds()获取矩形
你可以得到那个矩形的顶部和左边的物体
答案 3 :(得分:1)
我找到了解决方案。使用for循环来从ground.y到ground.y + ground.height的每个点命中测试点(x_val,y_val,true)。当发现命中时,这就是我的观点。
答案 4 :(得分:1)
在这种情况下,您还可以使用collision detection kit