PDA

Просмотр полной версии : Отражение объекта в AS3


SSergeyS
22.11.2007, 14:33
Помогите, пожалуйста, решить такую задачу.
Есть Shape нарисованный в стиле:

TLine=new Shape;
TLine.graphics.beginFill(0x009900);
TLine.graphics.moveTo(StartPoints[0],StartPoints[1]);
TLine.graphics.lineTo(StartPoints[2],StartPoints[3]);
for(var j:int=0;j<NewPoints.length;j+=2)
{
TLine.graphics.lineTo(NewPoints[j],NewPoints[j+1]);
}
TLine.graphics.lineTo(StartPoints[4],StartPoints[5]);
TLine.graphics.lineTo(StartPoints[6],StartPoints[7]);
TClip.addChild(TLine);

Необходимо по Y создать его отражение.
В AS2 можно было просто проскейлить в минус, и поменять глубину.
А в AS3 же если просто его дублировать(присваивать) он отрисовывает новый но оригинал становится невидим. И ещо: скейл по Y в минус приводит к исчезновению объекта, который скейлю…
Очень нужна помощь.

2morrowMan
22.11.2007, 18:21
http://www.adobe.com/devnet/flash/articles/reflect_class_as3.html

SSergeyS
22.11.2007, 18:22
Вот более подробный код:

package main {
import flash.display.MovieClip;
import flash.display.Graphics;
import flash.display.Shape;

dynamic public class TEST extends MovieClip {;

var TLine:Shape = new Shape();
var DLine:Shape = new Shape();
var TClip:MovieClip = new MovieClip();
var DClip:MovieClip = new MovieClip();
var StartPoints:Array;

public function TEST()
{
StartPoints=new Array();
{
StartPoints.push(50);StartPoints.push(25);
StartPoints.push(50);StartPoints.push(50);
StartPoints.push(400);StartPoints.push(50);
StartPoints.push(400);StartPoints.push(25);
}
TLine=new Shape;

TLine.graphics.beginFill(0x009900);
TLine.graphics.moveTo(StartPoints[0],StartPoints[1]);
TLine.graphics.lineTo(StartPoints[2],StartPoints[3]);
TLine.graphics.lineTo(StartPoints[4],StartPoints[5]);
TLine.graphics.lineTo(StartPoints[6],StartPoints[7]);

//TClip.addChild(TLine);

T1Clip.addChild(TLine);
T2Clip.addChild(TLine);
}
}
}

Но это абсолютно неправильно. В T1Clip его невидно. Есть какие–небудь идеи – ОЧЕНЬ надо.

SSergeyS
23.11.2007, 11:20
http://www.adobe.com/devnet/flash/articles/reflect_class_as3.html
Это не совсем то.
Во-первых там отражают битммап, и достаточно сложно. Мне надо сделать копию и отразить шейп или мувиклип. и желательно в несколько строк. Например как в AS2 – это делалось: дублируешь на другую глубину и скейлиш на -1.

2morrowMan
23.11.2007, 11:54
Вот более подробный код:
Но это абсолютно неправильно. В T1Clip его невидно. Есть какие–небудь идеи – ОЧЕНЬ надо.


T1Clip.addChild(TLine);
T2Clip.addChild(TLine);


Эхх, если бы в жизни так само - положил 100 баксов в один карман, а потом теже 100 баксов в другой и в обоих карманах по 100 баксов! Зашибись! :)

SSergeyS
23.11.2007, 11:57
Согласен. Но во флексе это работало )))
Жаль что во флеше это не так. И все же, как это сделать????
Это явно должно быть просто.

2morrowMan
23.11.2007, 12:42
Один из вариантов:
function createShape():Shape
{
var shape:Shape = new Shape();

shape.graphics.beginFill(0x009900);
shape.graphics.moveTo(StartPoints[0],StartPoints[1]);
shape.graphics.lineTo(StartPoints[2],StartPoints[3]);
shape.graphics.lineTo(StartPoints[4],StartPoints[5]);
shape.graphics.lineTo(StartPoints[6],StartPoints[7]);
return shape;
}

T1Clip.addChild(createShape());
T2Clip.addChild(createShape());

SSergeyS
23.11.2007, 15:13
Сделал пока вот-так:

package main {
import flash.display.MovieClip;
import flash.display.Graphics;
import flash.display.Shape;
import flash.events.MouseEvent;

dynamic public class TEST extends MovieClip {;

var TLine:Shape = new Shape();
var DLine:Shape = new Shape();
var TClip:MovieClip = new MovieClip();
var DClip:MovieClip = new MovieClip();
var StartPoints:Array;

private function Click(e:MouseEvent):void
{
TLine=new Shape;
TLine.graphics.beginFill(0x009900);
TLine.graphics.moveTo(StartPoints[0],StartPoints[1]*-1);
TLine.graphics.lineTo(StartPoints[2],StartPoints[3]*-1);
TLine.graphics.lineTo(50,15*-1);
TLine.graphics.lineTo(StartPoints[4],StartPoints[5]*-1);
TLine.graphics.lineTo(StartPoints[6],StartPoints[7]*-1);
T1Clip.addChild(TLine);

}
public function TEST()
{
Button1.addEventListener(MouseEvent.CLICK, Click);
StartPoints=new Array();
{
StartPoints.push(0);StartPoints.push(0);
StartPoints.push(0);StartPoints.push(25);
StartPoints.push(400);StartPoints.push(25);
StartPoints.push(400);StartPoints.push(0);
}
TLine=new Shape;

TLine.graphics.beginFill(0x009900);
TLine.graphics.moveTo(StartPoints[0],StartPoints[1]);
TLine.graphics.lineTo(StartPoints[2],StartPoints[3]);
TLine.graphics.lineTo(50,15);
TLine.graphics.lineTo(StartPoints[4],StartPoints[5]);
TLine.graphics.lineTo(StartPoints[6],StartPoints[7]);

T1Clip.addChild(TLine);
}
}
}

работает, но не очень изящно....

SSergeyS
23.11.2007, 15:19
блин не обновил страницу - а вообще практически аналогично! (только мне надо отражение)

А еще варианты?

2morrowMan
23.11.2007, 18:10
shape.scaleY = -1;

SSergeyS
26.11.2007, 12:44
да работает, но тогда у меня проблема остается с дублированием...
А вобще спасибо за помощь.