具有相同功能的不同对象IF Error -Actionscipt

时间:2017-09-18 11:19:58

标签: actionscript-3

我正在尝试创建一个拖放游戏。

我使用了一个数组,它可以拖放,但不适用于<Style TargetType="TreeViewItem" BasedOn="{StaticResource {x:Type TreeViewItem}}"> <Setter Property="Margin" Value="3,3,3,3"></Setter> </Style> 函数。

相反,它显示了我的错误:

  

“TypeError:错误#1010:术语未定义且没有属性。     在   Test_game_fla :: MainTimeline /降()[Test_game_fla.MainTimeline ::帧1:38]“

这是我的代码:

IF

3 个答案:

答案 0 :(得分:1)

你可以像这样解决它。

var s = 0;          
score.text = s;

var mixed:Array = new Array;

mixed.push(orange);
mixed.push(cheese);
mixed.push(lobbio);
mixed.push(meat);
mixed.push(fish);

for (var i:uint = 0; i < mixed.length; i++) {
    mixed[i].addEventListener(MouseEvent.MOUSE_DOWN, drag);
    mixed[i].addEventListener(MouseEvent.MOUSE_UP, drop);
}


function drag(e)
{
    e.currentTarget.startDrag();
}

function drop(e)
{
    var mix:Sprite = Sprite(e.currentTarget);
    mix.stopDrag();


    if( (cheese.y > 50 && cheese.y < 150) && (cheese.x > 480 && cheese.x < 570) )
    {
        cheese.x = -50;
        cheese.y = -50;
        s = s + 10;
        score.text = s;
    }
    //Error in mixed[i] ; at last i = mixed.length mixed[i] is null. 
    //Event has a property "currentTarget" this can get u select target
    if( (mix.y > 50 && mix.y < 150) && mix.x > 480 && mix.x < 570) )
    {
        mix.y = -50;
        mix.x = -50;
        s = s + 10;
        score.text = s;
    }

}

答案 1 :(得分:1)

要解决的一些问题:

(1)为变量提供数据类型。说var s = 0;表明s是一个数值变量,对吧?好score.text期望字符串不是数字,因此您必须使用强制转换进行转换。试试:

var s : int  = 0; //define a numerical variable
score.text = String(s); //cast number into String type (for usage as text)

(2)不要把你的功能放在For-loop中!甚至不要将函数放在其他函数中(除非您知道匿名函数是什么,并且您可以证明需要它)。

(3)您可以通过以下方式缩短部分代码:

  • 递增?使用s += 10可以避免更长时间s = s + 10;。也可以是-=/=等。
  • 如果将相同的值设置为多个变量,则链接如下:cheese.x = cheese.y = -50;

(4)请勿尝试mixed[i]访问mixed.length。由于长度 5 ,编译器会在某个时刻看到如下指令:mixed[5].addEventListener...

数组从第一项开始为零 ,因此您应该了解第五项实际上是mixed[4].addEventListener...

其他mixed[5].something(与mixed[mixed.length].something相同)不存在。

PS:我认为设置i < mixed.length可以防止超出数组大小,因为如果i必须小于.length那么i == 5就永远不会发生。


无论如何......下面这段代码是未经测试的(这里没有AS3编译器),但请尝试以下方法:

var s : int = 0;          
score.text = String(s);

var mixed:Array = new Array;

mixed.push(orange); mixed.push(cheese);
mixed.push(lobbio); mixed.push(meat); mixed.push(fish);

for (var i:uint = 0; i <= (mixed.length-1); i++) 
{
    mixed[i].addEventListener(MouseEvent.MOUSE_DOWN, drag);
    mixed[i].addEventListener(MouseEvent.MOUSE_UP, drop);

} //end "For" loop

function drag(e) : void { e.target.startDrag(); }

function drop(e) : void
{
    e.target.stopDrag();

    if( (cheese.y > 50 && cheese.y < 150) && (cheese.x > 480 && cheese.x < 570) )
    {
        cheese.x = cheese.y = -50;
        s += 10; //# achieves same thing as... s = s + 10;
        score.text = String(s);
    }

    if( (Sprite(e.currentTarget).y > 50 && Sprite(e.currentTarget).y < 150) && (Sprite(e.currentTarget).x > 480 && Sprite(e.currentTarget).x < 570) )
    {
        Sprite(e.currentTarget).x = Sprite(e.currentTarget).y = -50;
        s += 10;
        score.text = String(s);
    }
} //end Function "drop"

答案 2 :(得分:1)

要解释您的实际问题是什么,它是使用内联函数。

在你的for循环中,你定义了一些函数(那些被称为内联函数,并且如VC.One's answer中所述,这不是一个好习惯 - 请遵循他们的其他建议)。

由于这些函数是在for循环块中定义的,因此每次迭代实际上都是在创建一个全新的函数/对象。当您创建这些函数时,名为drop的函数将引用您的迭代器(i)。但是,直到你MOUSE_UP才会实际调用这些函数。这个鼠标启动触发器将在for循环结束后很长时间内发生。此时i的值为5。为什么5? (因为它只从0 - 4迭代),因为在每次迭代后i递增,所以它最终比最后一次迭代高1。

由于mixed数组中第5位没有元素,因此会出现错误。

要纠正这种情况,请按照其他答案中的代码示例(将这些函数从for循环中删除)

使用事件的i属性(它是对您附加侦听器的对象的引用),而不是引用currentTarget

Sprite(e.currentTarget).y