actionscript问题向容器添加形状

时间:2016-10-27 15:22:38

标签: actionscript-3 flash actionscript displayobject displaylist

我不知道如何描述这个问题,但我会尽力明白。我正在做一个动作脚本练习,我将DisplayObjetct容器定义为Sprite,我想要的是添加ramdomizely圈子,随机无线电长度在50到100之间。

名为“gameZoneContainer_sp”的Container已添加到Main类的displaylist中,每次用户更改舞台的大小时,容器都会设置其宽度和高度的新值。

以下是我所说的代码:

私有函数refreshScreen(ev:Event = null):void {

        // Remember: we can know stage dimensions accessing to:
        // stage.stageWidth
        // stage.stageHeight

        //CONSTANTS DEFINITION OF MARGIN
        const margen:Number=25;

        //LOCAL VARIABLES DEFINITION
        var cercleWidth:Number, cercleHeight:Number;
        var invaderWidth:Number, invaderHeight:Number;
        var containerWidth:Number, containerHeight:Number;
        var logoWidth:Number, logoHeight:Number;

        //STORING DIMENSIONS
        cercleWidth=addCercle_bt.width;
        cercleHeight=addCercle_bt.height;
        invaderWidth=addInvader_bt.width;
        invaderHeight=addInvader_bt.height;
        containerWidth=gameZoneContainer_sp.width;
        containerHeight=gameZoneContainer_sp.height;
        logoWidth=logoUOC_sp.width;
        logoHeight=logoUOC_sp.height;

        //SET HORIZONTAL POSITION OF THE ELEMENTS
        addCercle_bt.x=(stage.stageWidth/2)+margen;
        addInvader_bt.x=(stage.stageWidth/2)-(invaderWidth+margen);
        gameZoneContainer_sp.x=margen;
        logoUOC_sp.x=stage.stageWidth-(logoWidth+margen);

        //SET VERTICAL POSITION OF THE ELEMENTS
        addCercle_bt.y=stage.stageHeight - (cercleHeight+margen);
        addInvader_bt.y=stage.stageHeight-(invaderHeight+margen);
        gameZoneContainer_sp.y=logoHeight+margen*2;
        logoUOC_sp.y=margen;

        //SET DIMENSIONS OF CONTAINER gameZoneContainer_sp
        gameZoneContainer_sp.width=stage.stageWidth-(margen*2);
        gameZoneContainer_sp.height=stage.stageHeight-(margen*4)-invaderHeight-logoHeight;

    }

    /* THIS METHOD ADD A CIRCLE TO THE CONTAINER  gameZoneContainer_sp */
    private function addCercle(ev:MouseEvent):void {
        // Create new instance of Cercle
        // and add it to gameZoneContainer_sp

        //CONSTANT DEFINITIONS
        const minRadio:Number=50, maxRadio:Number=100;

        //LOCAL VARIABLES DEFINITIONS OF RADIO, COLOR AND CIRCLE
        //THE RADIO CHOOSE A RANDOM VALUE BETWEEN 50 AND 100
        var radio:Number=minRadio+(maxRadio-minRadio)*Math.random();
        var color:uint=Math.random() * 0xFFFFFF;
        var cercle:Cercle=new Cercle(color,radio);


        //
        var minPosX:Number=radio;
        var maxPosX:Number=gameZoneContainer_sp.width/2;
        var minPosY:Number=radio;
        var maxPosY:Number=gameZoneContainer_sp.height-(minPosY);


        // SET POSITION OF THE CIRCULE INSIDE THE CONTAINER
        cercle.x= minPosX + (maxPosX-(2*minPosX))*Math.random();
        cercle.y= minPosY + (maxPosY-(2*minPosY))*Math.random();
        cercle.drawCercle();
        gameZoneContainer_sp.addChild(cercle);
        refreshScreen(ev);

        //TRACING RESULTS...
        trace ("Added cercle!");    
        trace ("alto del contenedor: "+gameZoneContainer_sp.height);
        trace ("Posicion x: "+cercle.x);
        trace ("radio: "+radio);    
    }

        //DEFINITION OF THE CIRCLE CLASS
public class Cercle extends Sprite {
        private var _color:uint;
        private var _radio:Number;

        public function Cercle(color:uint,radio:Number){
            super();
            /* THE CLASS ACCEPT HEX VALUES.*/
            _color= color;
            _radio=radio;
            init();
        }

        public function init():void{
            drawCercle ();
        }
        //METHOD TO DRAW A CIRCLE
        public function drawCercle():void{
            var circle:Shape=new Shape();
            circle.graphics.beginFill(_color,1);
            circle.graphics.drawCircle(0,0,_radio);
            addChild(circle);

        }

    }

这是我的问题: 当我添加一个圆圈时,它似乎没问题,直到我改变窗户的尺寸(场景)。每次我更新尺寸时,事件都会从主类执行方法refreshScreen,更新场景中所有元素的尺寸和位置,但之后如果我添加一个新的圆圈,它会更改容器,这是错误的,因为我是想要在容器中添加圆圈。

希望不会太久。请任何帮助都会很棒! 提前谢谢!!

************这里是解决方案********************

//METHOD TO ADD A CIRCLE TO THE CONTAINER
private function addCercle(ev:MouseEvent):void {
    // Create new instance of Cercle
    // and add it to gameZoneContainer_sp
    const minRadio:Number=50, maxRadio:Number=100;
    var radio:Number=minRadio+(maxRadio-minRadio)*Math.random();
    var color:uint=Math.random() * 0xFFFFFF;

    // CHANGES///////

    // gameZoneContainer_sp IS 400X400 ORIGINALLY AND WE WANT TO PUT AN INSTANCE OF CIRCLE OBJETCT
    // cercle.x WILL PLACE IN minPosX = radio y maxPosy = 400 - radio
    // TAKING INTO ACCOUNT THAT ITS RADIO IS cercle.width/2
    // cercle.x WILL PLACE IN minPosX = cercle.width/2 y maxPosy = 400 - cercle.width/2
    // (SAME FOR  y)

    var cercle:Cercle=new Cercle(color,radio);

    // Cercle scale correction
    //cercle.width= radio/(gameZoneContainer_sp.width/400);
    //cercle.height= radio/(gameZoneContainer_sp.height/400);

    // Cercle positionning
    cercle.x = cercle.width/2 + ((400-cercle.width)*Math.random());
    cercle.y = cercle.height/2 + ((400-cercle.height)*Math.random());

    // PROPORTION CORRECTIONS
    //cercle.width = (2*radio)*gameZoneContainer_sp.width/400;


    //I ADD IT TO THE CONTAINER
    gameZoneContainer_sp.addChild(cercle);



    trace ("Added cercle!");    
    trace ("alto del contenedor: "+gameZoneContainer_sp.height);
    trace ("Posicion x: "+cercle.x);
    trace ("radio: "+radio);



}

1 个答案:

答案 0 :(得分:0)

这就是我的想法。你基本上有2个问题。

  1. 您正在使用数学添加圈子以调整游戏窗口的位置,但如果您将其添加到游戏窗口容器中则不需要。这导致圆圈被添加到右侧太远。
  2. 关于Air设置的一些事情是让屏幕内容缩放以显示所有内容,从而导致所有内容缩小。 (如果我们解决了第一个问题,那么这个问题就变得无关紧要了。)
  3. 所以而不是:

    cercle.x = minPosX ...etc
    

    做的:

    cercle.x = Math.Random()*gameZoneContainer_sp.width;
    

    同样对y值。

    您可以看到,对象容器的本地原点是对象(0,0)指向本地。因此,此游戏容器的左上角将是cercle的(0,0)点,因此无需使用minPosX将其调整到右侧。这假设您没有以某种方式使游戏容器偏离默认值(即,当您创建矩形时,您使用(0,0,宽度,高度)而不是(xOffset,yOffset,width,height))