【问题标题】:As3 creating and using external classesAs3 创建和使用外部类
【发布时间】:2012-01-05 21:31:35
【问题描述】:

我是 flash、as3 和这个论坛的新手,所以任何帮助都会很棒!

我已经制作了一个 xml 画廊,所有的影片剪辑和所有内容都是动态创建的,并且图像正在通过 xml 文件加载。除了库中的两个按钮,它们的链接名称为 next_btn 和 prev_btn。

现在我想做的是,我有 3 类画廊,所以我想将我的脚本转换成一个类,我可以将它用于每种类型的画廊。 (我希望我很清楚)

当用户点击图库时,会调用 startGallery() 函数。

我需要知道如何去做我几乎一无所知,我已经阅读了很多关于课程的教程,但我真的不明白如何去做。我真的很感激任何帮助,谢谢! :)

这是我的代码:

    //declaring variables
var _array:Array;
var _lastX:Number;
var _lastWidth:Number;
var _length:Number;
var _firstWidth:Number;
var _widths:Array;
var _names:Array;
var _sizes:Array;
var container_mc:MovieClip;
var my_images:XMLList;
var count:Number = 0;
var full_mc:MovieClip
var currentWidth:Number;
var scrollCounter:Number = 0;
var rect:Shape;
var nameLabel:TextField = new TextField();
var sizeLabel:TextField = new TextField();
var myFont = new Font1;
var format:TextFormat;

var myXmlLoader:URLLoader;
var myRequest:URLRequest;

var next_mc = new next_btn;
var prev_mc = new prev_btn;

    //function called when user clicks on gallery link
function startGallery():void{
myXmlLoader = new URLLoader();
myRequest = new URLRequest("gallery.xml");
myXmlLoader.load(myRequest);
myXmlLoader.addEventListener(Event.COMPLETE, processXml);
}

    //getting all the xml info
function processXml(e:Event):void{
var myXml:XML = new XML(e.target.data);
_length = myXml.IMAGE.length();
_firstWidth = myXml.@FIRSTWIDTH;
currentWidth = _firstWidth;
my_images = myXml.IMAGE;

_array = new Array(_length);
_names = new Array(_length);
_sizes = new Array(_length);
var i:int = 0;
var j:int = 0;
var k:int = 0;
var l:int = 0;

for each(var path:String in myXml.IMAGE.@THUMB){
    _array[i++] = path;
}

_widths = new Array(_length);
for each(var size:Number in myXml.IMAGE.@WIDTH){
    _widths[j++] = size;
}
for each(var names:String in myXml.IMAGE.@NAME){
    _names[k++] = names;
}
for each(var sizes:String in myXml.IMAGE.@SIZE){
    _sizes[l++] = sizes;
}
//both methods produce the same result
/*for(var i:int = 0; i<_length; i++){
    _array[i] = myXml.IMAGE[i].@THUMB;
}*/

createContainer();
callThumbs();
}

    //creates the main movieclip the holds all the stuff - container_mc
function createContainer():void{
container_mc = new MovieClip();
container_mc.name = "container_mc";
addChild(container_mc);
//container_mc.alpha = 0;
//container_mc.mouseEnabled = false;
//container_mc.mouseChildren = false;
container_mc.x = ((stage.stageWidth-_firstWidth)/2);
container_mc.y = 110;
container_mc.buttonMode = true;
container_mc.addEventListener(MouseEvent.CLICK, callFull);
}


    //loades the thumbnails
function callThumbs():void{
if(_array.length>0){
    var loader:Loader = new Loader;
    //addChild(loader);

    //var request:URLRequest = new URLRequest(_array[0]);
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, thumbsLoaded);
    loader.load(new URLRequest(_array[0]));
    trace(_array[0]);
    trace(_names[0]);
    loader.x = _lastX + _lastWidth + 3;
    loader.name = String(count);

    _lastX = loader.x;
    _array.shift();
    trace(loader.name);
    count++;
}
}

function thumbsLoaded(e:Event):void{
_lastWidth = e.target.width;
var myThumb:Loader = Loader(e.target.loader);
container_mc.addChild(myThumb);
myThumb.alpha = 0;
TweenLite.to(myThumb, 1, {alpha:0.5, ease:Strong.easeOut, onComplete:callButtons});
callThumbs();
}

    //once the thumbnails are loaded, the buttons are created
function callButtons():void{
//buttons & info
if(count == _length){
    next_mc.x = _firstWidth;
    next_mc.y = 125;
    next_mc.alpha = 0.7;
    container_mc.addChild(next_mc);
    prev_mc.x = MovieClip(root).x;
    prev_mc.y = 125;
    prev_mc.alpha = 0.3;
    container_mc.addChild(prev_mc);


    initTextFields();

}
}

    //initialising the textfields containing information about each thumbnail
function initTextFields():void{
//all the textfields are initialised here
}

    //loads the full images when a thumbnail is clicked
function callFull(e:MouseEvent):void{
if(scrollCounter == e.target.name){
var full_loader:Loader = new Loader();
var full_url = my_images[e.target.name].@FULL;
full_loader.load(new URLRequest(full_url));
full_loader.contentLoaderInfo.addEventListener(Event.INIT, fullLoaded);

container_mc.removeEventListener(MouseEvent.CLICK, callFull);
TweenLite.to(container_mc, 1, {colorTransform:{tint:0xffffff, tintAmount:0.7}, ease:Strong.easeOut});
TweenLite.to(navBar_mc, 1, {colorTransform:{tint:0xffffff, tintAmount:0.7}, ease:Strong.easeOut});
navBar_mc.mouseEnabled = false;
navBar_mc.mouseChildren = false;

container_mc.buttonMode = false;
}
}

function fullLoaded(e:Event):void{
full_mc = new MovieClip();
full_mc.buttonMode = true;
addChild(full_mc);
var my_loader:Loader = Loader(e.target.loader);
full_mc.addChild(my_loader);
my_loader.alpha = 0;
TweenLite.to(my_loader, 1, {alpha:1, ease:Strong.easeOut});
my_loader.x = (stage.stageWidth - my_loader.width)/2;
my_loader.y = (stage.stageHeight - my_loader.height)/2;
my_loader.addEventListener(MouseEvent.CLICK,removeFull);
}

    //removes the full images once the user closes the image
function removeFull(e:MouseEvent):void{
//removed the full image
}



function scrollOver(e:MouseEvent):void{
TweenLite.to(e.currentTarget, 1, {alpha:1, ease:Strong.easeOut});
}

function scrollOut(e:MouseEvent):void{
TweenLite.to(e.currentTarget, 1, {alpha:0.7, ease:Strong.easeOut});
}

function scrollClick(e:MouseEvent):void{
//the container_mc is moved left/right when the next/previous buttons are clicked
}
}

【问题讨论】:

  • 你的问题很广泛。你认为你可以把它分解成一些关于你遇到的问题的更小的具体问题吗?

标签: xml flash actionscript-3 class


【解决方案1】:

要让您的库中的项目由外部 .as 文件支持,首先要创建一个类文件,该文件的布局通常类似于:

package {

  import flash.display.MovieClip;

  public class GalleryClassName extends MovieClip {

    //Put reusable variables here
    private var someThingUsedInMultipleFunctions:String = "hello";

    public function GalleryClassName() {
      //Constructor, in this case it will be called automatically
    }

    //Put additional functions here
    private function additionalFunction() {
      //Do stuff
    }

    //Load a gallery
    public function startGallery(xmlPath:String) {
      //start loading the specified XML file
      ...
      myRequest = new URLRequest(xmlPath);
      ...
    }
  }
}

然后在您的库中右键单击 > 属性 > 并导出/链接并输入您的“GalleryClassName”。这应该将代码文件与库对象链接起来。

如果您想创建一个可重用的类,您将确定 3 个画廊之间的哪些变量会有所不同,并将它们存储在“可重用”部分的类中。懒人的方法是使用变量public 而不是private 并像GalleryClassName.someThingUsedInMultipleFunctions = "dude"; 这样从类外部访问。如果需要,您还可以查看传递参数以及 getter 和 setter。

编辑

要在您的 .fla 代码中使用此类:

//Assuming you do not have an instance already on the stage:
var gal:GalleryClassName = new GalleryClassName();
gal.x = 50; //Place it wherever you want
gal.y = 50;
addChild(gal);

然后加载图库xml

gal.startGallery("somepath/gallery1.xml");

【讨论】:

  • 嗨 ToddBFisher 感谢您的快速回复 :) 虽然您的回答确实帮助了我(是的,我也对此感到困惑),但我认为我的问题并不明确基本上我的脚本创建了一个包含所有的缩略图和一切。现在,我将如何从我的 .fla 中使用这个类?例如,我是否必须创建类的对象,或者我可以像之前那样调用 startGallery() 函数吗?至于传递参数,我想我可以传递一些 xml 细节来告诉类加载哪个画廊?
猜你喜欢
  • 2011-01-26
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
相关资源
最近更新 更多