初学者。我在时间轴上有一个实例名称为' island'的符号,所以基本上我想要移除击中该岛的单元格
if (cell.hitTestObject (island)) {
if(stage.contains(cell))
removeChild (cell);
}
我在moveCell函数下尝试了这个,但它只删除了一个单元格,而不是每个单元格都可以移动到岛上。谢谢大家!
到目前为止,这是我的代码:
package {
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class Main extends MovieClip {
public var cell:Cell;
public var group:Array;
public var gameTimer:Timer;
public function Main() {
cell = new Cell (400, -15);
addChild (cell);
group = new Array();
var newCell = new Cell (100, -15);
group.push ( newCell);
addChild(newCell);
gameTimer = new Timer (25);
gameTimer.addEventListener(TimerEvent.TIMER,moveCell);
gameTimer.start();
}
public function moveCell (timerEvent:TimerEvent):void {
if (Math.random() < 0.01) {
var randomX:Number = Math.random() * 700;
var newCell:Cell = new Cell (randomX, -15);
group.push (newCell);
addChild(newCell);
}
for each(var i:MovieClip in group) {
if (i.hitTestObject(island)) {
i.visible = false;
//i.parent.removeChild(i);
var score:int = 0;
score ++;
scoreOutPut.text = score.toString();
}
}
}
}
}`
答案 0 :(得分:1)
您有“无法访问空对象引用的属性或方法”,因为您已从Cell
(其父级)中删除了DisplayObjectContainer
对象,但未从{{1}中删除}数组,所以在你的group
循环的下一次迭代中,该对象不再存在,并且将触发该错误。
为避免这样做,你可以这样做:
for
对于for(var i:int = 0; i < group.length; i++)
{
var cell:Cell = Cell(group[i]);
if (cell.hitTestObject(island))
{
cell.parent.removeChild(cell);
group.splice(i, 1);
score++;
}
}
,它应该是所有课程的全局属性,每次都要更新。
此外,为了让您的代码更有条理,更清晰,最好将每个任务放在一个方法中。
例如,要创建单元格,您可以使用score
方法:
createCell()
然后,您可以在代码中的任何位置使用它,例如,您在构造函数中创建的两个第一个单元格:
// 0 is the default value of __x and -15 is the default one of __y
private function createCell(__x:Number = 0, __y:Number = -15): void
{
var cell:Cell = new Cell(__x, __y);
group.push(cell);
addChild(cell);
}
或public function Main()
{
// ..
createCell(400);
createCell(100);
// ...
}
方法内部:
moveCell()
此外,如果您确实不需要将属性或方法设为if (Math.random() < 0.01)
{
var randomX:Number = Math.random() * 700;
createCell(randomX);
}
,请不要将其公之于众。
...
希望可以提供帮助。