as3 检查对象是否从舞台上移除
as3 check if an object is removed from the stage
这是我第一次在这个论坛上发帖,所以如果我做错了什么请告诉我。我正在尝试用 as3 制作游戏。在游戏中,您会看到一个代表颜色的单词。当您单击该块时,该块就会消失。问题是我如何检查该块是否在舞台上。因为尽管我单击该块并因此将其删除,但布尔值似乎并没有变为真。提前致谢
这是我所有的代码,所以我做了 8 个块,里面都有一个词(代表一种颜色)。我想要的是随机创建的单词与块中的那些单词相对应,如果您单击带有正确单词的块,您就赢了。所以问题主要是关于那篇被注释掉的文章
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
[SWF(backgroundColor = "0x000000")]
public class Main extends Sprite
{
public var blok:blokken = new blokken();
public var blok2:blokken = new blokken();
public var blok3:blokken = new blokken();
public var blok4:blokken = new blokken();
public var blok5:blokken = new blokken();
public var blok6:blokken = new blokken();
public var blok7:blokken = new blokken();
public var blok8:blokken = new blokken();
public var kleuren:Array = new Array("rood", "blauw", "geel", "groen");
public var kleur:int = Math.floor(Math.random() * kleuren.length);
public var tekstKleur:TextField = new TextField;
public var grootheidswaanzin:TextFormat = new TextFormat();
public var aanwezig:Boolean = true;
public var tijdje:Timer = new Timer(15000,1);
public var eindTekst:TextField = new TextField;
public function Main()
{
grootheidswaanzin.size = 25;
tekstKleur.defaultTextFormat = grootheidswaanzin;
tekstKleur.text = kleuren[kleur];
tekstKleur.x = 415;
tekstKleur.y = 80;
tekstKleur.textColor = 0xFFFFFF;
addChild(tekstKleur);
eindTekst.x = 415;
eindTekst.y = 200;
eindTekst.textColor = 0xFFFFFF;
eindTekst.text = "je faalt";
eindTekst.defaultTextFormat = grootheidswaanzin;
blok.x = 315;
blok.y = 150;
blok.naamTekst("rood");
addChild(blok);
blok2.x = 440;
blok2.y = 150;
blok2.naamTekst("rood");
addChild(blok2);
blok3.x = 315;
blok3.y = 235;
blok3.naamTekst("blauw");
addChild(blok3);
blok4.x = 440;
blok4.y = 235;
blok4.naamTekst("blauw");
addChild(blok4);
blok5.x = 315;
blok5.y = 320;
blok5.naamTekst("geel");
addChild(blok5);
blok6.x = 440;
blok6.y = 320;
blok6.naamTekst("geel");
addChild(blok6);
blok7.x = 315;
blok7.y = 405;
blok7.naamTekst("groen");
addChild(blok7);
blok8.x = 440;
blok8.y = 405;
blok8.naamTekst("groen");
addChild(blok8);
tijdje.addEventListener(TimerEvent.TIMER, vijfSecondenRegel);
tijdje.start();
/*if (blok.stage || blok2.stage)
{
aanwezig = false;
}else
{
aanwezig = true;
trace (aanwezig);
}
trace (aanwezig);
if (kleuren[kleur] == "rood" && aanwezig == true)
{
trace ("victory");
}*/
}
public function vijfSecondenRegel(e:TimerEvent):void
{
removeEventListener(TimerEvent.TIMER,vijfSecondenRegel);
removeChild(blok);
removeChild(blok2);
removeChild(blok3);
removeChild(blok4);
removeChild(blok5);
removeChild(blok6);
removeChild(blok7);
removeChild(blok8);
removeChild(tekstKleur);
addChild(eindTekst);
}
}
}
package
{
import flash.display.Shape;
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.MouseEvent;
import flash.text.TextFormat;
public class blokken extends Sprite
{
public var blokAchtergrond:Sprite = new Sprite;
public var tekstInBlok: TextField = new TextField;
public var TekstGrootte:TextFormat = new TextFormat();
public function blokken()
{
blokAchtergrond.graphics.beginFill(Math.random() * 0xFFFFFF);
blokAchtergrond.graphics.drawRect(0, 0, 120, 80);
addChild(blokAchtergrond);
TekstGrootte.size = 25;
tekstInBlok.defaultTextFormat = TekstGrootte;
tekstInBlok.width = 120;
tekstInBlok.height = 40;
tekstInBlok.y = 40;
tekstInBlok.x = 30;
addChild(tekstInBlok);
addEventListener(MouseEvent.MOUSE_DOWN, klikjes);
}
public function naamTekst(label:String):void
{
tekstInBlok.text = label;
}
public function klikjes(e:MouseEvent):void
{
removeChild(blokAchtergrond);
removeChild(tekstInBlok);
}
}
}
您的问题是您在 class 的构造函数中设置了 aanwezig
var(它只运行一次,甚至在任何显示树内容初始化之前)。因此,如果您以后不再次设置 var,该值将始终为 true
。
For the boolean var to change it's value, you have to have code that updates it
因此,在删除块的同时,您必须更新该布尔值:
removeChild(blok);
aanwezig = false; //or however you compute the value
也许你想做的行为不是普通变量(如果你想改变值就必须显式更新),创建一个 getter 函数:(getters/setters 就像一个变量,但每次访问时都使用一个函数来计算 return 值)
public function get aanwezig():Boolean {
return !blok.stage && !blok2.stage
}
然后当您执行以下操作时:trace(aanwezig)
如果这些对象都不在显示列表中,它将 return 为真。
此外,在您的 blokken
class 中,您只是删除了块的子项,而不是块本身(所以 block2.stage
实际上仍然是真的,因为它仍在显示列表中,因为您只删除了它的子项)。
而不是做:
removeChild(blokAchtergrond);
removeChild(tekstInBlok);
执行此操作(将自身从其父项中删除)
if(parent){
parent.removeChild(this);
}
这是我第一次在这个论坛上发帖,所以如果我做错了什么请告诉我。我正在尝试用 as3 制作游戏。在游戏中,您会看到一个代表颜色的单词。当您单击该块时,该块就会消失。问题是我如何检查该块是否在舞台上。因为尽管我单击该块并因此将其删除,但布尔值似乎并没有变为真。提前致谢
这是我所有的代码,所以我做了 8 个块,里面都有一个词(代表一种颜色)。我想要的是随机创建的单词与块中的那些单词相对应,如果您单击带有正确单词的块,您就赢了。所以问题主要是关于那篇被注释掉的文章
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
[SWF(backgroundColor = "0x000000")]
public class Main extends Sprite
{
public var blok:blokken = new blokken();
public var blok2:blokken = new blokken();
public var blok3:blokken = new blokken();
public var blok4:blokken = new blokken();
public var blok5:blokken = new blokken();
public var blok6:blokken = new blokken();
public var blok7:blokken = new blokken();
public var blok8:blokken = new blokken();
public var kleuren:Array = new Array("rood", "blauw", "geel", "groen");
public var kleur:int = Math.floor(Math.random() * kleuren.length);
public var tekstKleur:TextField = new TextField;
public var grootheidswaanzin:TextFormat = new TextFormat();
public var aanwezig:Boolean = true;
public var tijdje:Timer = new Timer(15000,1);
public var eindTekst:TextField = new TextField;
public function Main()
{
grootheidswaanzin.size = 25;
tekstKleur.defaultTextFormat = grootheidswaanzin;
tekstKleur.text = kleuren[kleur];
tekstKleur.x = 415;
tekstKleur.y = 80;
tekstKleur.textColor = 0xFFFFFF;
addChild(tekstKleur);
eindTekst.x = 415;
eindTekst.y = 200;
eindTekst.textColor = 0xFFFFFF;
eindTekst.text = "je faalt";
eindTekst.defaultTextFormat = grootheidswaanzin;
blok.x = 315;
blok.y = 150;
blok.naamTekst("rood");
addChild(blok);
blok2.x = 440;
blok2.y = 150;
blok2.naamTekst("rood");
addChild(blok2);
blok3.x = 315;
blok3.y = 235;
blok3.naamTekst("blauw");
addChild(blok3);
blok4.x = 440;
blok4.y = 235;
blok4.naamTekst("blauw");
addChild(blok4);
blok5.x = 315;
blok5.y = 320;
blok5.naamTekst("geel");
addChild(blok5);
blok6.x = 440;
blok6.y = 320;
blok6.naamTekst("geel");
addChild(blok6);
blok7.x = 315;
blok7.y = 405;
blok7.naamTekst("groen");
addChild(blok7);
blok8.x = 440;
blok8.y = 405;
blok8.naamTekst("groen");
addChild(blok8);
tijdje.addEventListener(TimerEvent.TIMER, vijfSecondenRegel);
tijdje.start();
/*if (blok.stage || blok2.stage)
{
aanwezig = false;
}else
{
aanwezig = true;
trace (aanwezig);
}
trace (aanwezig);
if (kleuren[kleur] == "rood" && aanwezig == true)
{
trace ("victory");
}*/
}
public function vijfSecondenRegel(e:TimerEvent):void
{
removeEventListener(TimerEvent.TIMER,vijfSecondenRegel);
removeChild(blok);
removeChild(blok2);
removeChild(blok3);
removeChild(blok4);
removeChild(blok5);
removeChild(blok6);
removeChild(blok7);
removeChild(blok8);
removeChild(tekstKleur);
addChild(eindTekst);
}
}
}
package
{
import flash.display.Shape;
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.MouseEvent;
import flash.text.TextFormat;
public class blokken extends Sprite
{
public var blokAchtergrond:Sprite = new Sprite;
public var tekstInBlok: TextField = new TextField;
public var TekstGrootte:TextFormat = new TextFormat();
public function blokken()
{
blokAchtergrond.graphics.beginFill(Math.random() * 0xFFFFFF);
blokAchtergrond.graphics.drawRect(0, 0, 120, 80);
addChild(blokAchtergrond);
TekstGrootte.size = 25;
tekstInBlok.defaultTextFormat = TekstGrootte;
tekstInBlok.width = 120;
tekstInBlok.height = 40;
tekstInBlok.y = 40;
tekstInBlok.x = 30;
addChild(tekstInBlok);
addEventListener(MouseEvent.MOUSE_DOWN, klikjes);
}
public function naamTekst(label:String):void
{
tekstInBlok.text = label;
}
public function klikjes(e:MouseEvent):void
{
removeChild(blokAchtergrond);
removeChild(tekstInBlok);
}
}
}
您的问题是您在 class 的构造函数中设置了 aanwezig
var(它只运行一次,甚至在任何显示树内容初始化之前)。因此,如果您以后不再次设置 var,该值将始终为 true
。
For the boolean var to change it's value, you have to have code that updates it
因此,在删除块的同时,您必须更新该布尔值:
removeChild(blok);
aanwezig = false; //or however you compute the value
也许你想做的行为不是普通变量(如果你想改变值就必须显式更新),创建一个 getter 函数:(getters/setters 就像一个变量,但每次访问时都使用一个函数来计算 return 值)
public function get aanwezig():Boolean {
return !blok.stage && !blok2.stage
}
然后当您执行以下操作时:trace(aanwezig)
如果这些对象都不在显示列表中,它将 return 为真。
此外,在您的 blokken
class 中,您只是删除了块的子项,而不是块本身(所以 block2.stage
实际上仍然是真的,因为它仍在显示列表中,因为您只删除了它的子项)。
而不是做:
removeChild(blokAchtergrond);
removeChild(tekstInBlok);
执行此操作(将自身从其父项中删除)
if(parent){
parent.removeChild(this);
}