Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 为什么我不能在此代码(AS3)中设置位置?_Actionscript 3_Flash - Fatal编程技术网

Actionscript 3 为什么我不能在此代码(AS3)中设置位置?

Actionscript 3 为什么我不能在此代码(AS3)中设置位置?,actionscript-3,flash,Actionscript 3,Flash,首先,我是AS3的新手。我想做的是让球以圆形旋转。这是我当前的代码: 这是通告 public class Circular extends Sprite { private var ball:Ball; private var centerX:Number = stage.stageWidth / 2; private var centerY:Number = stage.stageHeight / 2; private var radiusX:Number

首先,我是AS3的新手。我想做的是让球以圆形旋转。这是我当前的代码: 这是通告

public class Circular extends Sprite {

    private var ball:Ball;

    private var centerX:Number = stage.stageWidth / 2;
    private var centerY:Number = stage.stageHeight / 2;
    private var radiusX:Number = 500;
    private var radiusY:Number = 500;
    //private var temp:Number = 180;
    private static const speed:Number = 0.1; 

    public function Oval() {
        init();
    }

    private function init():void {
        ball = new Ball(40,0x00ff00,180.0);
        addChild(ball);
        ball.addEventListener(Event.ENTER_FRAME, startMoving(ball,ball.getAngle()));
    }

    private function startMoving(object:Ball, angle:Number) {
        return function(evt:Event){
                onStart(object,angle);
        }
    }

    private function onStart(object:Ball,angle:Number){
        object.x = centerX + Math.sin(angle) * radiusX;
        object.y = centerY + Math.cos(angle) * radiusY;
        ball.setAngle(speed);
        //trace(ball.getAngle());
    }

}
这是Ball.as类文件

public class Ball extends Sprite {

    private var _radius:Number;
    private var _color:uint;
    private var _angle:Number;

    public function Ball(radius:Number,color:uint, angle:Number) {
        _radius = radius;
        _color  = color;
        _angle  = angle;
        init();
    }

    public function init():void {
        graphics.beginFill(_color);
        graphics.drawCircle(0,0,_radius);
        graphics.endFill();
    }

    public function getAngle():Number{
        return _angle;
    }

    public function setAngle(speed:Number){
        _angle += speed;
    }
}

对不起,我忘了提我现在面临的问题。我现在的问题是,球没有移动。有什么想法吗?

你的构造函数应该和你的类同名。在这里,当构造函数应命名为Circular()时,它被命名为Oval()。循环类没有构造函数,因此在调用Oval()方法之前不会发生任何事情

如果需要,可以使用椭圆类扩展圆形类

        public class Oval extends Circular
        { 
             public function Oval()
             {
                super();
             }
        }

如果需要在Oval类中访问某些循环变量,您可能必须将其从private更改为protected。好的,在第一个类中,您不应该有一个循环类和Oval构造函数

问题肯定出在你的输入框上,以及你是如何通过角度/获得新角度的,等等。这里有一个适用于我的更新。动画可以平滑,你可以做很多事情来帮助它,但这是可行的。确保你的舞台尺寸足够大,这取决于你的半径x/radiusY,在我的例子中,必须降低它才能真正看到发生了什么,但现在球在一个圆圈中移动

圆形。如

import flash.display.Sprite;
import flash.events.Event;
import Ball;

public class Circular extends Sprite {

    private var ball:Ball;

    private var centerX:Number = stage.stageWidth / 2;
    private var centerY:Number = stage.stageHeight / 2;
    private var radiusX:Number = 200;
    private var radiusY:Number = 200;
    //private var temp:Number = 180;
    private static const speed:Number = 0.1; 

    public function Circular() {
        init();
    }

    private function init():void {
        ball = new Ball(40,0x00ff00,180.0);
        addChild(ball);
        ball.addEventListener(Event.ENTER_FRAME, moveBall);
    }

    private function moveBall(e:Event){
        ball.x = centerX + Math.sin(ball.getAngle()) * radiusX;
        ball.y = centerY + Math.cos(ball.getAngle()) * radiusY;
        ball.setAngle(speed);
        //trace(ball.getAngle());
    }

}

Ball.as不变。

谢谢。但问题是我自己解决的。这不是类名,我忘了在这里更改它:P我所做的是更改为:object.x=centerX+Math.sin(object.getAngle())*radiusX;无论如何,谢谢你提到类名。没错,你只调用了ball.getAngle()一次,角度总是一样的。必须在每个帧中调用getAngle()
import flash.display.Sprite;
import flash.events.Event;
import Ball;

public class Circular extends Sprite {

    private var ball:Ball;

    private var centerX:Number = stage.stageWidth / 2;
    private var centerY:Number = stage.stageHeight / 2;
    private var radiusX:Number = 200;
    private var radiusY:Number = 200;
    //private var temp:Number = 180;
    private static const speed:Number = 0.1; 

    public function Circular() {
        init();
    }

    private function init():void {
        ball = new Ball(40,0x00ff00,180.0);
        addChild(ball);
        ball.addEventListener(Event.ENTER_FRAME, moveBall);
    }

    private function moveBall(e:Event){
        ball.x = centerX + Math.sin(ball.getAngle()) * radiusX;
        ball.y = centerY + Math.cos(ball.getAngle()) * radiusY;
        ball.setAngle(speed);
        //trace(ball.getAngle());
    }

}