我有一个用AS3制作的基本太空射击游戏。
游戏目前由一个敌人和一个玩家组成 - 一个可移动的炮塔。
游戏的前提是,当敌人被击中时,它会重生,并且玩家得分会上升一点。
现在我希望通过在比赛场地上拥有多个敌人来延长比赛时间。每个波的敌人数量可能不同,所以我真的不想单独跟踪它们。
当我想创造一个敌人时,我打电话(从我的主要班级内)
this.addChild(createNewEnemy());
创建createNewEnemy()函数,并返回一个匿名的Enemy对象。
我的问题是,如何在玩家射击子弹的情况下对这些匿名敌人进行命中测试?当敌人与子弹发生碰撞时,应该将其移除并且分数应该增加。
答案 0 :(得分:1)
我不太确定“匿名对象”是什么意思。你真的应该以能跟踪它们的方式创造这些东西。一种方法可能是覆盖容器精灵的addChild方法并将新敌人推送到矢量。例如:
var enemies:Vector.<Enemy> = new Vector.<Enemy>();
override public function addChild(child:DisplayObject):DisplayObject
{
if(child is Enemy) {
enemies.push(child);
}
super.addChild(child);
}
现在您只需针对敌人矢量进行测试,或者在子弹碰撞中使用相同的“is
”关键字来检查并查看碰撞的显示对象是否基于类型Enemy
。
就进行碰撞检测的实际代码而言,请参阅以下答案:https://stackoverflow.com/a/7083965/562566
答案 1 :(得分:1)
您好!
我真的不明白你的意思是“匿名”,但其中一个解决方案是创建所谓的 hitboxes 。
让我们假设你有一个敌人类:
public class Enemy {
public var hitBox:Sprite = new Sprite() ;
public function Enemy() {
hitBox.graphics.clear() ; /* Not filled by a color, as needs to be invisible */
hitBox.graphics.drawRect(x,y,width,height) ; /* Adjust the parameters manually */
this.addChild(hitBox) ;
}
}
有很多敌人,所以只需创建敌人阵营并将敌人推入其中。 这是玩家的子弹:
public class PlayerBullet extends Sprite {
private var stageReference:Stage ;
public function PlayerBullet(coord:Point, stageReference:Stage){
this.x = coord.x ;
this.y = coord.y ;
this.stageReference = stageReference ;
this.stageReference.addChild(this) ;
this.addEventListener(Event.ENTER_FRAME, loop) ;
}
private function loop(e:Event){
/*Provide some movement for bullet by changing or incrementing
this.x and this.y as you wish */
for (var i:Number = 0 ; i < enemyArray.length ; i++){
if (this.hitTestObject(enemyArray[i].hitBox)) {
enemyArray.splice(i,1) ; /* Remove the enemy from enemy array on collision */
this.stageReference.removeChild(this) ; /* Do not display bullet anymore on collision with enemy */
}
}
}
}
注意:hitbox只提供一些方形区域。如果您需要一些碰撞的精确细节,请创建几个hitbox。
我希望,这会有所帮助! :)