学校のプロジェクトのためにAS3でゲームを作成していますが、ゲームの再開に追われています。ゲームが終了すると、最終画面が表示され、メニューに戻ることができます。これはすべてうまくいきますが、もう一度プレイしてみると、次のように表示されます。
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/setChildIndex()
at MethodInfo-277()
これをデバッグして、次のコードブロックに移動します。
if (bringToFront==1){
setChildIndex(player,numChildren - 1);
setChildIndex(foppeLeft, numChildren - 1);
setChildIndex(foppeIdle, numChildren - 1);
setChildIndex(foppeRight, numChildren - 1);
setChildIndex(foppeDown, numChildren - 1);
setChildIndex(foppeUp, numChildren - 1);
setChildIndex(foppeTalent, numChildren - 1);
setChildIndex(abeIdle, numChildren - 1);
setChildIndex(abeUp, numChildren - 1);
setChildIndex(abeDown, numChildren - 1);
setChildIndex(abeLeft, numChildren - 1);
setChildIndex(abeRight, numChildren - 1);
setChildIndex(abeSkateIdle, numChildren -1);
setChildIndex(abeSkateUp, numChildren - 1);
setChildIndex(abeSkateDown, numChildren - 1);
setChildIndex(abeSkateLeft, numChildren - 1);
setChildIndex(abeSkateRight, numChildren - 1);
setChildIndex(abeSkateOn, numChildren- 1);
setChildIndex(abeSkateOff, numChildren - 1);
setChildIndex(marcoIdle, numChildren - 1);
setChildIndex(marcoDown, numChildren - 1);
setChildIndex(marcoUp, numChildren - 1);
setChildIndex(marcoLeft, numChildren - 1);
setChildIndex(marcoRight, numChildren - 1);
setChildIndex(marcoJumpUp, numChildren - 1);
setChildIndex(marcoJumpIdle, numChildren - 1);
setChildIndex(marcoJumpDown, numChildren - 1);
setChildIndex(marcoJumpRight, numChildren - 1);
setChildIndex(marcoJumpLeft,numChildren - 1);
setChildIndex(hudIngame,numChildren - 1);
setChildIndex(time,numChildren - 1);
setChildIndex(c1000PuP, numChildren - 1);
setChildIndex(univePuP, numChildren - 1);
setChildIndex(rabobankPuP, numChildren - 1);
setChildIndex(frieslandPuP, numChildren - 1);
setChildIndex(jakoPuP, numChildren - 1);
bringToFront=0;
}
これをすべて削除することで、実際にはエラーは発生しなくなりましたが、私のゲームでは、atileSheet
と配列からレベルを作成しました。次のレベルに進むと、タイルが読み込まれません。最初のレベルが表示されますが、コードは2番目のレベルで機能します。
(私の混沌としたコードを許してください;私はこれに不慣れです。)
コードは2000行以上なので投稿しませんが、少しクリアになるかもしれない部分を投稿します。
最後に到達すると、これが発生します。
for (var mapEnd in mapsEndArr){
if (player.hitTestObject(mapsEndArr[mapEnd])){
if (oneRound==0){
oneRound=1;
player.x=0;
}
}
}
if (oneRound==1){
//Making sure the arrows & pick up points get deleted when going to another map.
if (foppeAction == true){
for (var drawClueEnd in clueArray){
removeChild( clueArray[drawClueEnd] );
}
if (c1000PuPDrawn==true){
c1000PuP.visible=false;
}
if (univePuPDrawn==true){
univePuP.visible=false;
}
if (rabobankPuPDrawn==true){
rabobankPuP.visible=false;
}
if (frieslandPuPDrawn==true){
frieslandPuP.visible=false;
}
if (jakoPuPDrawn==true){
jakoPuP.visible=false;
}
foppeAction = false;
freeze=0;
}
mapNumberY=0;
mapNumberX=0;
mapsUpArr.splice(0, mapsUpArr.length);
mapsDownArr.splice(0, mapsDownArr.length);
mapsLeftArr.splice(0, mapsLeftArr.length);
mapsRightArr.splice(0, mapsRightArr.length);
wallArrayS.splice(0, wallArrayS.length);
wallArray.splice(0, wallArray.length);
iceArray.splice(0, iceArray.length);
iceBorderArray.splice(0, iceBorderArray.length);
clueArray.splice(0, clueArray.length);
pickUpPoint.splice(0, pickUpPoint.length);
c1000PuPDrawn=false;
univePuPDrawn=false;
rabobankPuPDrawn=false;
frieslandPuPDrawn=false;
jakoPuPDrawn=false;
hudBars = new HudBars();
hudBars.x = 0;
hudBars.y = 0;
addChild(hudBars);
dispatchEvent( new NavigationEvent( NavigationEvent.FINAL ) );
if (points==0){
DocumentClass.endScreen.pointsText.text=("Je hebt geen logo's verzamelt.");
}
if (points>0 && points<5){
DocumentClass.endScreen.pointsText.text=("Je hebt "+ points.toString() +"logo('s) verzamelt.");
}
if (points==5){
DocumentClass.endScreen.pointsText.text=("Je hebt alle logo's verzamelt!");
}
points=0;
//Removing all the childs and eventlisteners to clean stuff up in the cleanup function.
cleanup();
oneRound=2;
}
とクリーンアップ:
function cleanup():void
{
removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
removeEventListener(MouseEvent.MOUSE_DOWN, menuButtonClicked)
removeEventListener(KeyboardEvent.KEY_DOWN, downKey);
removeEventListener(KeyboardEvent.KEY_UP, upKey);
removeEventListener(Event.ENTER_FRAME, loop);
removeEventListener(Event.ENTER_FRAME, pauseLoop);
for (var deleteChilds in deleteChildArr){
removeChild(deleteChildArr[deleteChilds]);
}
setToNull();
}
}
function setToNull():void
{
myGame=null;
time=null;
}
すべてをnullに設定しようとして、少し戸惑いましたが、どこかでそれが発生していないように感じます。何かご意見は?このコードも、ある時点でnullに設定されます。ここで、最後の画面を終了します。
public function finalScreen():void
{
endScreen = new EndScreen();
endScreen.addEventListener( NavigationEvent.MENU, onRequestMenu );
endScreen.x = 0;
endScreen.y = 0;
addChild(endScreen);
playScreen=null;
}
これらのいずれかが貴重な答えにつながることを願っています。さまざまな用語でグーグル検索を行ったところ、ゲームでは、前面に設定する必要のあるムービークリップがまだあるとどういうわけか考えているのに、nullに設定されているために到達できないことがわかりました。
初めてプレイしたときと同じように、すべてをクリアしてから新しいゲームを開始することは可能ですか?