2014-10-17 112 views
0

总之,我使用以下圆形的影片剪辑作为图形类的drawTriangles方法的顶点参数(矢量。)。并在第二张照片上使用该方法。AS3:graphics.drawTriangle方法奇怪的行为

first picturesecond picture

现在的事情是第一次6点工作正常,但在那之后所有的连续点不作任何区别。

with numberingwith grid

还好这里是代码。米跳圆圈形,影片剪辑,拖拽和移动部分

//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(); 
} 
+0

如果给出的答案为你工作,那么你必须勾选它是正确的,让其他人知道它的工作原理。也不是说通过投票/嘀嗒表示“感谢”可能会导致没有人会为未来的问题提供帮助。他为你做了很好的努力。 – 2014-10-18 21:03:45

回答

2

在updateVertices()创建一个临时的载体,然后用新的数据填充它只是为了在下一步覆盖原始数据? 无论如何,在第一个循环中,您将两个值推送到您的容器中的每个“顶点句柄”的tempVerteces(顶点是适当的单词),因此此向量的长度为numChildren * 2,但是当您将顶点从临时向量复制到原始向量时, 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(); 
} 
+0

这个答案似乎很有用,所以我向上投票。我也编辑过它,因为不需要告诉他他编写了错误的代码......这就是为什么他来到StackOverflow寻求帮助。 – 2014-10-18 21:01:33

+0

对不起,你可能是对的,但我的意思是,除了他犯的这个错误,他应该修改他的整个代码。他可以改变这一行,它可以工作,但它可以绝对更优化。 – 2014-10-18 21:37:20

+0

不用担心。无论如何,我跳过他的代码,然后假设你在你的答案中为他写了所有代码(phew)。有一天,他也会教别人:-) ... – 2014-10-18 21:57:39