2014-10-17 106 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