actionscript 3 - 从阶段问题中删除 children
actionscript 3 - deleting children from stage issue
所以我正在创建一个 ai 向玩家射击的游戏。我遇到的这个问题是,当 AI 发射子弹并在子弹被摧毁之前被杀死时,由于 AI 被从舞台上移除,子弹在半空中冻结。这是一个展示我的意思的视频:http://i.gyazo.com/a13a43467ae8c6c3d8b1c988b7010bc2.mp4
ai 的子弹存储在一个数组中,我想知道当 ai 本身从舞台上移除时,是否有办法删除 ai 添加到舞台上的 children。
这是处理 AI 被 PLAYER 子弹击中的代码。 ai 的子弹以相同的方式存储,但在另一个 class/file.
中
for (var i = _bullets.length - 1; i >= 0; i--) {
for (var j = enemies.length - 1; j >= 0; j--) {
if (_bullets[i].hitTestObject(enemies[j])) {
stage.removeChild(enemies[j]); //removes the ai
stage.removeChild(_bullets[i]); //removes the players bullet
_bullets.splice(i, 1);
enemies.splice(j, 1);
return;
}
}
}
您可以按照您描述的进行操作,但我不推荐这样做。为此,您可以监听 Event.REMOVED_FROM_STAGE
并执行某种清理:
// in your AI class
addEventListener(Event.REMOVED_FROM_STAGE, removedFromStage);
function removedFromStage(e:Event):void {
// remove all the bullets
for each(var bullet:Bullet in _bullets){
stage.removeChild(bullet);
}
_bullets.length = 0;
}
但是,这种方法并不现实(子弹会在飞行中途消失,而不是像您预期的那样继续沿着它们的路径前进)并且这不是一个很好的设计。
更好的方法是将所有子弹存储在主游戏中 class。 AI 负责 "firing" 一颗子弹,但在那之后主要 class 处理子弹的移动、碰撞等。如果你像这样分离你的逻辑,你不会有更多的问题,比如一个你 运行 进入。
有很多方法可以实现这样的设计,但这里有一个我用过很多次的简单例子:
你的主游戏class:
public class Main {
// a list of all enemies in the game
private var enemies:Vector.<Enemy> = new <Enemy>[];
// a list of all bullets in the game
private var bullets:Vector.<Bullet> = new <Bullet>[];
// adds a new enemy to the game
public function addEnemy():void {
var enemy:Enemy = new Enemy(this); // pass a reference to this Main class
enemies.push(enemy);
addChild(enemy);
}
// removes an enemy from the game
public function removeEnemy(enemy:Enemy):void {
enemies.splice(enemies.indexOf(enemy), 1);
removeChild(enemy);
}
// adds a new bullet to the game
public function addBullet():void {
var bullet:Bullet = new Bullet(this); // pass a reference to this Main class
bullets.push(bullet);
addChild(bullet);
}
// removes a bullet from the game
public function removeBullet(bullet:Bullet):void {
bullets.splice(bullets.indexOf(bullet), 1);
removeChild(bullet);
}
}
你的敌人class:
public class Enemy {
// a reference to the Main class
public var main:Main;
public function Enemy(main:Main){
// store the reference to the Main class
this.main = main;
}
// to shoot a bullet, call the Main class
public function shoot():void {
main.addBullet();
}
// to kill the enemy, call the Main class
public function die():void {
main.removeEnemy(this);
}
}
你的子弹class:
public class Bullet {
// a reference to the Main class
public var main:Main;
public function Bullet(main:Main){
// store the reference to the Main class
this.main = main;
}
// to remove the bullet when it hits something, call the Main class
public function collide():void {
main.removeBullet(this);
}
}
如您所见,Main class 负责添加和删除敌人和子弹,代码中的其他各个地方只是简单地回调 Main class。这种分离将防止出现像您这样的问题 运行,并且在未来会更加灵活。
所以我正在创建一个 ai 向玩家射击的游戏。我遇到的这个问题是,当 AI 发射子弹并在子弹被摧毁之前被杀死时,由于 AI 被从舞台上移除,子弹在半空中冻结。这是一个展示我的意思的视频:http://i.gyazo.com/a13a43467ae8c6c3d8b1c988b7010bc2.mp4
ai 的子弹存储在一个数组中,我想知道当 ai 本身从舞台上移除时,是否有办法删除 ai 添加到舞台上的 children。
这是处理 AI 被 PLAYER 子弹击中的代码。 ai 的子弹以相同的方式存储,但在另一个 class/file.
中 for (var i = _bullets.length - 1; i >= 0; i--) {
for (var j = enemies.length - 1; j >= 0; j--) {
if (_bullets[i].hitTestObject(enemies[j])) {
stage.removeChild(enemies[j]); //removes the ai
stage.removeChild(_bullets[i]); //removes the players bullet
_bullets.splice(i, 1);
enemies.splice(j, 1);
return;
}
}
}
您可以按照您描述的进行操作,但我不推荐这样做。为此,您可以监听 Event.REMOVED_FROM_STAGE
并执行某种清理:
// in your AI class
addEventListener(Event.REMOVED_FROM_STAGE, removedFromStage);
function removedFromStage(e:Event):void {
// remove all the bullets
for each(var bullet:Bullet in _bullets){
stage.removeChild(bullet);
}
_bullets.length = 0;
}
但是,这种方法并不现实(子弹会在飞行中途消失,而不是像您预期的那样继续沿着它们的路径前进)并且这不是一个很好的设计。
更好的方法是将所有子弹存储在主游戏中 class。 AI 负责 "firing" 一颗子弹,但在那之后主要 class 处理子弹的移动、碰撞等。如果你像这样分离你的逻辑,你不会有更多的问题,比如一个你 运行 进入。
有很多方法可以实现这样的设计,但这里有一个我用过很多次的简单例子:
你的主游戏class:
public class Main {
// a list of all enemies in the game
private var enemies:Vector.<Enemy> = new <Enemy>[];
// a list of all bullets in the game
private var bullets:Vector.<Bullet> = new <Bullet>[];
// adds a new enemy to the game
public function addEnemy():void {
var enemy:Enemy = new Enemy(this); // pass a reference to this Main class
enemies.push(enemy);
addChild(enemy);
}
// removes an enemy from the game
public function removeEnemy(enemy:Enemy):void {
enemies.splice(enemies.indexOf(enemy), 1);
removeChild(enemy);
}
// adds a new bullet to the game
public function addBullet():void {
var bullet:Bullet = new Bullet(this); // pass a reference to this Main class
bullets.push(bullet);
addChild(bullet);
}
// removes a bullet from the game
public function removeBullet(bullet:Bullet):void {
bullets.splice(bullets.indexOf(bullet), 1);
removeChild(bullet);
}
}
你的敌人class:
public class Enemy {
// a reference to the Main class
public var main:Main;
public function Enemy(main:Main){
// store the reference to the Main class
this.main = main;
}
// to shoot a bullet, call the Main class
public function shoot():void {
main.addBullet();
}
// to kill the enemy, call the Main class
public function die():void {
main.removeEnemy(this);
}
}
你的子弹class:
public class Bullet {
// a reference to the Main class
public var main:Main;
public function Bullet(main:Main){
// store the reference to the Main class
this.main = main;
}
// to remove the bullet when it hits something, call the Main class
public function collide():void {
main.removeBullet(this);
}
}
如您所见,Main class 负责添加和删除敌人和子弹,代码中的其他各个地方只是简单地回调 Main class。这种分离将防止出现像您这样的问题 运行,并且在未来会更加灵活。