-1

我不知道如何描述这个问题,但我会尽量清楚。我正在做一个动作脚本练习,其中我有一个定义为 Sprite 的 DisplayObjetct 容器,我想要添加随机无线电长度在 50 到 100 之间的随机圆圈。

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

这是我所说的代码:

私有函数 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);



}
4

1 回答 1

0

这就是我认为正在发生的事情。你基本上有2个问题。

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

所以而不是:

cercle.x = minPosX ...etc

做:

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

对 y 值做同样的事情。

您会看到,对象容器的本地原点将是对象 (0,0) 指向本地。所以这个游戏容器的左上角将是圆的 (0,0) 点,因此不需要将它向右调整你使用 minPosX 所做的量。这是假设您没有以某种方式使您的游戏容器偏离默认值(即,当您创建矩形时,您使用 (0,0,width,height) 而不是 (xOffset,yOffset,width,height) 之类的东西) .

于 2016-10-27T22:25:27.350 回答