Просмотр полной версии : Отражение объекта в 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
да работает, но тогда у меня проблема остается с дублированием...
А вобще спасибо за помощь.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.