0

简而言之,我使用以下圆形动画剪辑作为图形类的 drawTriangles 方法的顶点参数(向量。)。并使用第二张图片上的方法。

第一张照片 第二张图片

现在问题是前 6 个点工作正常,但之后所有连续点都没有任何区别。

带编号 带网格

好的,这里是代码。m 跳过圆形电影剪辑拖放移动部分

//cape is instance name of movieclip
//cape width and height
var cWidth:Number = cape.width;
var cHeight:Number = cape.height;

var verteces:Vector.<Number> = new Vector.<Number>();
var indeces:Vector.<int> = new Vector.<int>();
var uvtData:Vector.<Number> = new Vector.<Number>();

//populating parameters of draw triangels
var point:Point = new Point();
for(var i:int = 1; i<=capeSkel.numChildren; i++)
{
    point.x = capeSkel["pt"+i].x;
    point.y = capeSkel["pt"+i].y;
    verteces.push(point.x,point.y);
    uvtData.push(point.x/cWidth,point.y/cHeight,1);
}
indeces.push(0,10,5,  0,1,10,  1,2,10,  2,10,7,  5,6,10,  6,7,10,  2,11,7,  2,3,11,  3,4,11,       
4,11,9,  7,8,11,  8,9,11);

var capeBmd:BitmapData = new BitmapData(cWidth, cHeight, true);
capeBmd.draw(cape);
var sprite:Sprite = new Sprite();
addChild(sprite);
sprite.x = 0;
sprite.y = 260;

//this function is called everytime those movieclips are repositioned
function updateVerteces()
{
    var tempVerteces:Vector.<Number> = new Vector.<Number>();
    var point:Point = new Point();
    //capeSkel is the instance name of circle-shaped moveiclip's parent
    for(var i:int = 1; i<=capeSkel.numChildren; i++)
    {
        point.x = capeSkel["pt"+i].x;
        point.y = capeSkel["pt"+i].y;
        tempVerteces.push(point.x,point.y);
    }

    for(var k:int = 0; k<capeSkel.numChildren; k++)
    {
        verteces[k] = tempVerteces[k];
    }
}
function renderView()
{
    sprite.graphics.clear();
    sprite.graphics.beginBitmapFill(capeBmd);
    sprite.graphics.drawTriangles(verteces,indeces,uvtData);
    sprite.graphics.endFill();
}
4

1 回答 1

3

在 updateVertices() 中创建一个临时向量,然后用新数据填充它只是为了在下一步覆盖原始数据?无论如何,在第一个循环中,您将容器中每个“顶点句柄”的两个值推入 tempVerteces(Vertices 是正确的词),因此,该向量的长度是,numChildren * 2但是当您将顶点从 temp 向量复制到原始向量时,您仍然使用 numChildren。

因此,解决问题所需要做的就是更改这一行:

for(var k:int = 0; k<capeSkel.numChildren; k++)

对此

for(var k:int = 0; k < tempVerteces.length; k++)

你做的事情比你真正需要做的要多得多。我对您的代码感到非常困惑,以至于我不得不重新构建它才能找到问题所在。不知道您要实现什么,但在这个简单的情况下,当您一次只移动一个顶点时,您不需要重写整个顶点向量 - 您可以简单地替换一个项目(或更准确地说是两个案子)。

这是我对执行相同任务以及拖动处理的编辑:

import flash.events.MouseEvent;
import flash.display.Sprite;

var cV:Sprite; //currently draged vertex
var cI:uint; //index of draged vertex
var verteces:Vector.<Number> = new Vector.<Number>();
var indeces:Vector.<int> = new Vector.<int>();
var uvtData:Vector.<Number> = new Vector.<Number>();
var capeBmd:BitmapData = new BitmapData(cape.width, cape.height, true);
var sprite:Sprite = new Sprite();

init();
renderView();

function init(){
    capeBmd.draw(cape);
    sprite.x = cape.x;
    sprite.y = cape.y;
    removeChild(cape);
    addChildAt(sprite,0);

    for(var i:int = 0; i<capeSkel.numChildren; i++){
        cV = capeSkel.getChildAt(i) as Sprite;
        cV.addEventListener(MouseEvent.MOUSE_DOWN, grabVert);
        verteces.push(cV.x, cV.y);
        uvtData.push(cV.x / cape.width, cV.y / cape.height);
    }
    indeces.push(0,10,5,  0,1,10,  1,2,10,  2,10,7,  5,6,10,  6,7,10,  2,11,7,  2,3,11,  3,4,11,       
    4,11,9,  7,8,11,  8,9,11);

    cV = null;
    cape = null;
    stage.addEventListener(MouseEvent.MOUSE_MOVE, moveVert);
    stage.addEventListener(MouseEvent.MOUSE_UP, clearVert);
}

function grabVert(e:MouseEvent){
    cV = Sprite(e.currentTarget);
    cI = cV.parent.getChildIndex(cV)*2;
}

function moveVert(e:MouseEvent){
    if(!cV) return;
    verteces[cI] = cV.x = cV.parent.mouseX;
    verteces[cI+1] = cV.y = cV.parent.mouseY;
    renderView();
}

function clearVert(e:MouseEvent){
    cV = null;
}

function renderView()
{
    var g:Graphics = sprite.graphics;
    g.clear();
    g.lineStyle(2, 0x00FF00);
    g.beginBitmapFill(capeBmd);
    g.drawTriangles(verteces,indeces,uvtData);
    g.endFill();
}
于 2014-10-18T19:24:37.047 回答