Actionscript 3 比赛结束时的失误
好吧,我已经设法修复了大部分错误,剩下的主要错误是当我试图让游戏在达到50点时结束…这是我现在得到的错误,当我进入下一个关卡时,飞船消失了,但游戏使用的是一艘看不见的飞船 ArgumentError:Error#2025:提供的DisplayObject必须是调用者的子对象。 在flash.display::DisplayObjectContainer/removeChild()中 在SpaceRocks_v008/newShip()[/Users/Jess/Documents/UNI/INFT6303_game_design/Ass_3/Flash_V2/SpaceRocks_v008.as:168] 在SpaceRocks_v008/startSpaceRocks_v008()[/Users/Jess/Documents/UNI/INFT6303_game_design/Ass_3/Flash_V2/SpaceRocks_v008.as:84] 在间隔垫圈处_v008/frame2() 无法在此位置显示源代码Actionscript 3 比赛结束时的失误,actionscript-3,flash,Actionscript 3,Flash,好吧,我已经设法修复了大部分错误,剩下的主要错误是当我试图让游戏在达到50点时结束…这是我现在得到的错误,当我进入下一个关卡时,飞船消失了,但游戏使用的是一艘看不见的飞船 ArgumentError:Error#2025:提供的DisplayObject必须是调用者的子对象。 在flash.display::DisplayObjectContainer/removeChild()中 在SpaceRocks_v008/newShip()[/Users/Jess/Documents/UNI/INFT
包{
导入flash.display.*;
导入flash.events.*;
导入flash.text.*;
导入flash.utils.getTimer;
导入flash.utils.Timer;
导入flash.geom.Point;
公共级垫片组\u v008扩展了MovieClip{
静态常数shipRotationSpeed:Number=.1;
静态常数rockSpeedStart:Number=.03;
静态常数rockSpeedIncrease:Number=.02;
静态常数导弹速度:数字=.2;
静态恒推力功率:数字=0.15;
静态常数shipRadius:编号=20;
静态常数启动船舶:uint=3;
//游戏物品
私人船舶:船舶;
私有变量:数组;
私人var导弹:阵列;
//动画定时器
上次私人var:uint;
//箭头键
私有变量rightArrow:Boolean=false;
私有变量leftArrow:Boolean=false;
私有变量向上箭头:布尔值=false;
//船速
私有var shipMoveX:编号;
私有var shipMoveY:编号;
//计时器
专用var延时定时器:定时器;
专用var屏蔽定时器:定时器;
//游戏模式
私有模式:字符串;
私有变量shieldOn:布尔值;
//船与盾
私人var shipsLeft:uint;
私有var-shieldsLeft:uint;
私有图标:数组;
私有变量屏蔽图标:数组;
私有变量显示:TextField;
//分数和水平
私有var gameScore1:编号;
私有级别:uint;
//精灵
私人游戏对象:精灵;
私有对象:精灵;
//开始比赛
公共功能启动SpaceRocks_v008(){
//设置精灵
gameObjects=新精灵();
addChild(游戏对象);
scoreObjects=新精灵();
addChild(scoreObjects);
//重置分数对象
游戏级别=1;
shipsLeft=启动船舶;
gameScore1=0;
createShipIcons();
createScoreDisplay();
//设置侦听器
addEventListener(事件输入帧,移动游戏对象);
stage.addEventListener(键盘事件、按键向下、按键向下功能);
stage.addEventListener(KeyboardEvent.KEY\u UP,keyup函数);
//开始
gameMode=“延迟”;
谢尔顿=假;
导弹=新阵列();
下纵波(空);
新闻(空);
}
//记分对象
//画出剩余的船数
公共函数createShipIcons(){
shipIcons=新数组();
对于(变量i:uint=0;i 0){
removeShieldIcon();
}
}
//船舶建造与运动
//创建一艘新船
公共功能新闻(事件:TimerEvent){
//如果船存在,将其移除
if(ship!=null){
游戏对象。removeChild(飞船);
ship=null;
}
//没有船了
如果(shipsLeft<1){
结束游戏();
回来
}
//到达上阴囊
如果(游戏分数1>=50){
跟踪(“高”)
结束游戏();
回来
}
//创建、定位和添加新船舶
船=新船();
船舶停靠站(1);
x=400;
船舶y=350;
船舶旋转=-180;
ship.shield.visible=假;
gameObjects.addChild(ship);
//设置船舶属性
shipMoveX=0.0;
shipMoveY=0.0;
gameMode=“play”;
//设置防护罩
shieldsLeft=3;
createShieldIcons();
//除了第一个,所有的生命都是从一个免费的盾牌开始的
if(shipsLeft!=启动船舶){
startShield(正确);
}
}
//注册按键
公共函数keydown函数(事件:KeyboardEvent){
如果(event.keyCode==38){
leftArrow=true;
}else if(event.keyCode==40){
右箭头=真;
}else如果(event.keyCode==32){//空格
新导弹();
}如果(event.keyCode==37){//左箭头
startShield(假);
}
}
//注册密钥
公共函数keyUpFunction(事件:KeyboardEvent){
如果(event.keyCode==38){
leftArrow=false;
}else if(event.keyCode==40){
右箭头=假;
}
}
//使船有生气
公共功能移动(timeDiff:uint){
//旋转和推力
//旋转和推力
如果(左箭头){
船舶y-=2;
}else if(右箭头){
船舶y+=2;
}
//移动
ship.x+=shipMoveX;
ship.y+=shipMoveY;
//绕屏
如果(船舶y<65)船舶y=65;
如果(船舶y>380)船舶y=380;
}
//移船
公共功能shipHit(){
gameMode=“延迟”;
船。游戏(“爆炸”);
移除所有屏蔽图标();
delayTimer=新定时器(1000,1);
delayTimer.addEventListener(TimerEvent.TIMER\u COMPLETE,newShip);
delayTimer.start();
removeShipIcon();
希普斯里夫特--;
}
//打开防护罩3秒钟
公共函数startShield(freeShield:Boolean){
如果(shieldsLeft<1)返回;//没有剩余屏蔽
如果(shieldOn)返回;//屏蔽已打开
//打开护罩并将计时器设置为关闭
ship.shield.visible=true;
屏蔽定时器=新定时器(30
package {
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.getTimer;
import flash.utils.Timer;
import flash.geom.Point;
public class SpaceRocks_v008 extends MovieClip {
static const shipRotationSpeed:Number = .1;
static const rockSpeedStart:Number = .03;
static const rockSpeedIncrease:Number = .02;
static const missileSpeed:Number = .2;
static const thrustPower:Number = .15;
static const shipRadius:Number = 20;
static const startingShips:uint = 3;
// game objects
private var ship:Ship;
private var rocks:Array;
private var missiles:Array;
// animation timer
private var lastTime:uint;
// arrow keys
private var rightArrow:Boolean = false;
private var leftArrow:Boolean = false;
private var upArrow:Boolean = false;
// ship velocity
private var shipMoveX:Number;
private var shipMoveY:Number;
// timers
private var delayTimer:Timer;
private var shieldTimer:Timer;
// game mode
private var gameMode:String;
private var shieldOn:Boolean;
// ships and shields
private var shipsLeft:uint;
private var shieldsLeft:uint;
private var shipIcons:Array;
private var shieldIcons:Array;
private var scoreDisplay:TextField;
// score and level
private var gameScore1:Number;
private var gameLevel:uint;
// sprites
private var gameObjects:Sprite;
private var scoreObjects:Sprite;
// start the game
public function startSpaceRocks_v008() {
// set up sprites
gameObjects = new Sprite();
addChild(gameObjects);
scoreObjects = new Sprite();
addChild(scoreObjects);
// reset score objects
gameLevel = 1;
shipsLeft = startingShips;
gameScore1 = 0;
createShipIcons();
createScoreDisplay();
// set up listeners
addEventListener(Event.ENTER_FRAME,moveGameObjects);
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
stage.addEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
// start
gameMode = "delay";
shieldOn = false;
missiles = new Array();
nextRockWave(null);
newShip(null);
}
// SCORE OBJECTS
// draw number of ships left
public function createShipIcons() {
shipIcons = new Array();
for(var i:uint=0;i<shipsLeft;i++) {
var newShip:ShipIcon = new ShipIcon();
newShip.x = 460+i*30;
newShip.y = 328;
scoreObjects.addChild(newShip);
shipIcons.push(newShip);
}
}
// draw number of shields left
public function createShieldIcons() {
shieldIcons = new Array();
for(var i:uint=0;i<shieldsLeft;i++) {
var newShield:ShieldIcon = new ShieldIcon();
newShield.x = 520-i*30;
newShield.y = 210;
scoreObjects.addChild(newShield);
shieldIcons.push(newShield);
}
}
// put the numerical score at the upper right
public function createScoreDisplay() {
scoreDisplay = new TextField();
scoreDisplay.x = 460;
scoreDisplay.y = 68;
scoreDisplay.width = 40;
scoreDisplay.selectable = false;
var scoreDisplayFormat = new TextFormat();
scoreDisplayFormat.color = 0xFFFFFF;
scoreDisplayFormat.font = "Arial";
scoreDisplayFormat.align = "right";
scoreDisplayFormat.size = 15;
scoreDisplay.defaultTextFormat = scoreDisplayFormat;
scoreObjects.addChild(scoreDisplay);
updateScore();
}
// new score to show
public function updateScore() {
scoreDisplay.text = String(gameScore1);
}
// remove a ship icon
public function removeShipIcon() {
scoreObjects.removeChild(shipIcons.pop());
}
// remove a shield icon
public function removeShieldIcon() {
scoreObjects.removeChild(shieldIcons.pop());
}
// remove the rest of the ship icons
public function removeAllShipIcons() {
while (shipIcons.length > 0) {
removeShipIcon();
}
}
// remove the rest of the shield icons
public function removeAllShieldIcons() {
while (shieldIcons.length > 0) {
removeShieldIcon();
}
}
// SHIP CREATION AND MOVEMENT
// create a new ship
public function newShip(event:TimerEvent) {
// if ship exists, remove it
if (ship != null) {
gameObjects.removeChild(ship);
ship = null;
}
// no more ships
if (shipsLeft < 1) {
endGame();
return;
}
//upper scrore reached
if (gameScore1 >= 50) {
trace("high")
endGame();
return;
}
// create, position, and add new ship
ship = new Ship();
ship.gotoAndStop(1);
ship.x = 400;
ship.y = 350;
ship.rotation = -180;
ship.shield.visible = false;
gameObjects.addChild(ship);
// set up ship properties
shipMoveX = 0.0;
shipMoveY = 0.0;
gameMode = "play";
// set up shields
shieldsLeft = 3;
createShieldIcons();
// all lives but the first start with a free shield
if (shipsLeft != startingShips) {
startShield(true);
}
}
// register key presses
public function keyDownFunction(event:KeyboardEvent) {
if (event.keyCode == 38) {
leftArrow = true;
} else if (event.keyCode == 40) {
rightArrow = true;
} else if (event.keyCode == 32) { // space
newMissile();
} else if (event.keyCode == 37) { // left arrow
startShield(false);
}
}
// register key ups
public function keyUpFunction(event:KeyboardEvent) {
if (event.keyCode == 38) {
leftArrow = false;
} else if (event.keyCode == 40) {
rightArrow = false;
}
}
// animate ship
public function moveShip(timeDiff:uint) {
// rotate and thrust
// rotate and thrust
if (leftArrow) {
ship.y -= 2;
} else if (rightArrow) {
ship.y+= 2;
}
// move
ship.x += shipMoveX;
ship.y += shipMoveY;
// wrap around screen
if (ship.y < 65) ship.y = 65;
if (ship.y > 380) ship.y = 380;
}
// remove ship
public function shipHit() {
gameMode = "delay";
ship.gotoAndPlay("explode");
removeAllShieldIcons();
delayTimer = new Timer(1000,1);
delayTimer.addEventListener(TimerEvent.TIMER_COMPLETE,newShip);
delayTimer.start();
removeShipIcon();
shipsLeft--;
}
// turn on shield for 3 seconds
public function startShield(freeShield:Boolean) {
if (shieldsLeft < 1) return; // no shields left
if (shieldOn) return; // shield already on
// turn on shield and set timer to turn off
ship.shield.visible = true;
shieldTimer = new Timer(3000,1);
shieldTimer.addEventListener(TimerEvent.TIMER_COMPLETE,endShield);
shieldTimer.start();
// update shields remaining
if (!freeShield) {
removeShieldIcon();
shieldsLeft--;
}
shieldOn = true;
}
// turn off shield
public function endShield(event:TimerEvent) {
ship.shield.visible = false;
shieldOn = false;
}
// create a single rock of a specific size
public function newRock(x,y:int, rockType:String) {
// create appropriate new class
var newRock:MovieClip;
var rockRadius:Number;
if (rockType == "Big") {
newRock = new Rock_Big();
rockRadius = 35;
} else if (rockType == "Medium") {
newRock = new Rock_Medium();
rockRadius = 30;
} else if (rockType == "Small") {
newRock = new Rock_Small();
rockRadius = 25;
}
// choose a random look
newRock.gotoAndStop(Math.ceil(Math.random()*3));
// set start position
newRock.x = Math.random()*0;
newRock.y = Math.random()*280+80;
// set random movement and rotation
var dx:Number = Math.random()*3;
var dy:Number = Math.random()*2;
// add to stage and to rocks list
gameObjects.addChild(newRock);
rocks.push({rock:newRock, dx:dx, dy:dy, rockType:rockType, rockRadius: rockRadius});
}
// create four rocks
public function nextRockWave(event:TimerEvent) {
rocks = new Array();
newRock(100,1,"Big");
newRock(200,1,"Big");
newRock(450,1,"Big");
newRock(350,1,"Big");
gameMode = "play";
}
// animate all rocks
public function moveRocks(timeDiff:uint) {
for(var i:int=rocks.length-1;i>=0;i--) {
// move the rocks
var rockSpeed:Number = rockSpeedStart + rockSpeedIncrease*gameLevel;
rocks[i].rock.x += rocks[i].dx*timeDiff*rockSpeed;
rocks[i].rock.y += 0
// wrap rocks
if ((rocks[i].rock.x) > 400){
deleteRocks(i);
}
else if ((rocks[i].rock.y) > 401){
deleteRocks(i);
}
}
}
public function rockHit(rockNum:uint) {
// create two smaller rocks
if (rocks[rockNum].rockType == "Big") {
newRock(rocks[rockNum].rock.x,rocks[rockNum].rock.y,"Medium");
newRock(rocks[rockNum].rock.x,rocks[rockNum].rock.y,"Medium");
} else if (rocks[rockNum].rockType == "Medium") {
newRock(rocks[rockNum].rock.x,rocks[rockNum].rock.y,"Small");
newRock(rocks[rockNum].rock.x,rocks[rockNum].rock.y,"Small");
}
// remove original rock
rocks[rockNum].rock.gotoAndPlay("bang");
//gameObjects.removeChild(rocks[rockNum].rock);
rocks.splice(rockNum,1);
}
public function deleteRocks(rockNum:uint) {
//remove rock from game
gameObjects.removeChild(rocks[rockNum].rock);
rocks.splice(rockNum,1);
}
// MISSILES
// create a new Missile
public function newMissile() {
// create
var newMissile:Missile = new Missile();
// set direction
newMissile.dx = Math.cos(Math.PI*ship.rotation/180);
newMissile.dy = Math.sin(Math.PI*ship.rotation/180);
// placement
newMissile.x = ship.x + newMissile.dx*shipRadius;
newMissile.y = ship.y + newMissile.dy*shipRadius;
// add to stage and array
gameObjects.addChild(newMissile);
missiles.push(newMissile);
}
// animate missiles
public function moveMissiles(timeDiff:uint) {
for(var i:int=missiles.length-1;i>=0;i--) {
// move
missiles[i].x += missiles[i].dx*missileSpeed*timeDiff;
missiles[i].y += missiles[i].dy*missileSpeed*timeDiff;
// moved off screen
if ((missiles[i].x < 0) || (missiles[i].x > 550) || (missiles[i].y < 0) || (missiles[i].y > 400)) {
gameObjects.removeChild(missiles[i]);
delete missiles[i];
missiles.splice(i,1);
}
}
}
// remove a missile
public function missileHit(missileNum:uint) {
gameObjects.removeChild(missiles[missileNum]);
missiles.splice(missileNum,1);
}
// GAME INTERACTION AND CONTROL
public function moveGameObjects(event:Event) {
// get timer difference and animate
var timePassed:uint = getTimer() - lastTime;
lastTime += timePassed;
moveRocks(timePassed);
if (gameMode != "delay") {
moveShip(timePassed);
}
moveMissiles(timePassed);
checkCollisions();
}
// look for missiles colliding with rocks
public function checkCollisions() {
// loop through rocks
rockloop: for(var j:int=rocks.length-1;j>=0;j--) {
// loop through missiles
missileloop: for(var i:int=missiles.length-1;i>=0;i--) {
// collision detection
if (Point.distance(new Point(rocks[j].rock.x,rocks[j].rock.y),
new Point(missiles[i].x,missiles[i].y))
< rocks[j].rockRadius) {
// remove rock and missile
rockHit(j);
missileHit(i);
// add score
gameScore1 += 10;
updateScore();
// break out of this loop and continue next one
continue rockloop;
}
}
// check for rock hitting ship
if (gameMode == "play") {
if (shieldOn == false) { // only if shield is off
if (Point.distance(new Point(rocks[j].rock.x,rocks[j].rock.y),
new Point(ship.x,ship.y))
< rocks[j].rockRadius+shipRadius) {
// remove ship and rock
shipHit();
rockHit(j);
}
}
}
}
if (gameScore1 >= 50) {
shipsLeft = 0;
if (shipsLeft < 1) {
endGame();
return;
}
}
// all out of rocks, change game mode and trigger more
if ((rocks.length == 0) && (gameMode == "play")) {
gameMode = "betweenlevels";
gameLevel++; // advance a level
delayTimer = new Timer(2000,1);
delayTimer.addEventListener(TimerEvent.TIMER_COMPLETE,nextRockWave);
delayTimer.start();
}
}
public function endGame() {
// remove all objects and listeners
removeChild(gameObjects);
removeChild(scoreObjects);
gameObjects = null;
scoreObjects = null;
removeEventListener(Event.ENTER_FRAME,moveGameObjects);
stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
gotoAndStop("gameover");
}
}