我正在尝试创建一个拖放游戏。
我使用了一个数组,它可以拖放,但不适用于<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
答案 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