AS3 Flash:从 1 个类中生成 2 个相同的对象?
Posted
技术标签:
【中文标题】AS3 Flash:从 1 个类中生成 2 个相同的对象?【英文标题】:AS3 Flash: Spawning 2 same objects from 1 class? 【发布时间】:2013-01-18 07:40:00 【问题描述】:我正在 AS3 中创建一个游戏,在敌人子弹的类文件中,我有这段代码。
public class enemy2Bullet extends MovieClip
public function enemy2Bullet()
stop();
//Setup an event listener to see if the bullet is added to the stage.
addEventListener(Event.ADDED_TO_STAGE, onAdd);
private function onAdd(e:Event):void
removeEventListener(Event.ADDED_TO_STAGE, onAdd);
//Now that our object is on the stage, run our custom code.
init();
private function init():void
if (Math.random() <= 0.5)
addEventListener(Event.ENTER_FRAME, bullet2Loop)
else
addEventListener(Event.ENTER_FRAME, bullet2Loop2)
private function bullet2Loop(e:Event):void
if (currentLabel != "destroyed")
this.x += 8;
if (currentLabel == "destroyedComplete")
destroyEnemy2Bullet();
private function bullet2Loop2(e:Event):void
if (currentLabel != "destroyed")
this.x -= 8;
if (currentLabel == "destroyedComplete")
destroyEnemy2Bullet();
public function destroyEnemy2Bullet():void
//Remove the object from stage
stage.removeChild(this);
//Remove any event listeners
removeEventListener(Event.ENTER_FRAME, bullet2Loop);
编译后,游戏运行,但子弹只向 1 个方向射击。 我怎样才能使子弹从左右两侧射出,并保持在那个方向?
这是我的enemy2函数。
private function enemy2Control():void
if (getTimer() - lastSpawnTime2 > 3000 && aEnemy2Array.length < 3)
var newEnemy2:MovieClip = new mcEnemy2;
newEnemy2.x = Math.random() * 800;
newEnemy2.y = 0;
aEnemy2Array.push(newEnemy2);
stage.addChild(newEnemy2);
lastSpawnTime2 = getTimer();
//Control enemy's bullets
for (var i:int = aEnemy2Array.length - 1; i >= 0; i--)
if (enemy2LastFire + 750 / (aEnemy2Array.length) < getTimer())
var currentEnemy2:mcEnemy2 = aEnemy2Array[i];
if (Math.random() < 0.06)
var newEnemy2Bullet:enemy2Bullet = new enemy2Bullet();
newEnemy2Bullet.x = currentEnemy2.x;
newEnemy2Bullet.y = currentEnemy2.y;
enemy2BulletArray.push(newEnemy2Bullet);
stage.addChild(newEnemy2Bullet);
enemy2LastFire = getTimer();
for (var j:int = enemy2BulletArray.length - 1; j >= 0; j--)
var currentEnemy2Bullet:enemy2Bullet = enemy2BulletArray[j];
if (currentEnemy2Bullet.y >= stage.stageHeight)
enemy2BulletArray.splice(j, 1);
currentEnemy2Bullet.destroyEnemy2Bullet();
if (currentEnemy2Bullet.hitTestObject(playerCore))
playerHP -= 1;
currentEnemy2Bullet.gotoAndPlay(2);
enemy2BulletArray.splice(j, 1);
任何帮助将不胜感激。
【问题讨论】:
调试代码看它是否进入bullet2Loop2
init()
在哪里被调用?
【参考方案1】:
一些事情:
• 您可以将currentEnemy2Bullet
替换为j
并删除整个var currentEnemy2Bullet:enemy2Bullet = enemy2BulletArray[j];
语句。
• 永远不会调用init()
。但最好在newEnemy2Bullet
的实际初始化中进行方向计算并使用newEnemy2Bullet.addEventListener(Event.ENTER_FRAME, whatever)
。
• 说实话,您的代码相当混乱,可以简化。例如,您可以通过给类一个变量来确定子弹的方向,在初始化时给它一个值,然后让循环根据该变量更新它的位置。
【讨论】:
我的错误,init() 在前面的函数中被调用了。更新了我的代码。 我现在遇到一个错误,每当我运行游戏并被其中一个敌人的子弹击中时,我都会收到这个 TypeError: Error #1009: Cannot access a property or method of a空对象引用。在enemy2Bullet/destroyEnemy2Bullet() 在enemy2Bullet/bullet2Loop2() @user2036822 那是因为你应该在移除孩子之前移除事件监听器。您还应该使用splice()
将其从数组中删除。
@user2036822 另外,请记住在完成后关闭此问题。
我知道这是一个愚蠢的错误:/ 这就是我在凌晨 5 点尝试编码时得到的结果,哈哈哈。太感谢了! :)以上是关于AS3 Flash:从 1 个类中生成 2 个相同的对象?的主要内容,如果未能解决你的问题,请参考以下文章
想要在 Actionscript 2.0 Flash 中生成多个影片剪辑实例
Actionscript,AS3,MXML,Flex,Flex Builder,Flash Builder,Flash,AIR,Flash Player之关系