我正在尝试将movieclip球沿着动画片的地面边界移动。您可以使用箭头键移动球体,这会增加和减小其x值,但y值将始终等于Ground动画片段的顶部边缘。AS3 - 获取边缘坐标
要做到这一点,我需要找到电影剪辑地面边缘点的y值。这怎么可能?
这就是Ground MovieClip的样子。这是一个不规则的形状。我想要的是任何x点都指向这个形状的顶部边缘。
我正在尝试将movieclip球沿着动画片的地面边界移动。您可以使用箭头键移动球体,这会增加和减小其x值,但y值将始终等于Ground动画片段的顶部边缘。AS3 - 获取边缘坐标
要做到这一点,我需要找到电影剪辑地面边缘点的y值。这怎么可能?
这就是Ground MovieClip的样子。这是一个不规则的形状。我想要的是任何x点都指向这个形状的顶部边缘。
如果这是你想要做的,它应该通过你的位图数据的列并为每个商店很容易环路Ÿ值以后可以参照得到Ÿ为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];
}
如果不是“缓存值”你想它在运行时滚动的地形,可以通过像素(的BitmapData与宽度列循环1和高度等于你的地形位图)并获得价值。
您的hitTestPoint()建议也不错。请记住,BitmapData类也有hitTest方法。查看Mike Chamber's posts就可以了。
此外,您可能想在Corey's Collision Detection Kit
HTH
可以使用getbounds()得到一个矩形
你可以得到一个矩形的顶部和左侧对象
我找到了解决办法。使用一个for循环来hitTestPoint(x_val,y_val,true),每个点从ground.y直到ground.y + ground.height。当发现一击时,这就是我的观点。
乔治的技术来一看是好的(&可能是最快的)一个静态的地形。
如果地形剪辑移动,计算起来可能会非常昂贵: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。
我做了一个快速的动画例如:
源是在这里:http://www.nicoptere.net/AS3/junkyard/BitmapRectTest.as
我刚刚发现的要点^^
如果您取消注释该//提取轮廓块,你会得到恢复在这种情况下斜坡
的像素一种廉价的方式,你也可以使用collision detection kit
是地面上的矩形? – Mikushi 2011-02-02 22:13:20
请提供一个屏幕截图,以便我们可以看到“地面”的形状(提示,问题编辑器的图像按钮提供了上传。) – ocodo 2011-02-03 00:46:38