2012-12-15 1 views
0

Gary Rosenzweig의 게임을 기초로 actionscript 3을 기반으로 한 터치 기반 플랫폼 게임을 만들었습니다. 오늘까지는 모두 잘 돌아가고 있었고, 나는 바닥 개체 등을 많이 바꾸지 않고 바꿨습니다. actionscript 전혀 및 다음 오류가 있습니다.Actionscript3 ArgumentError : Error # 2109 :

ArgumentError : 오류 # 2109 : 장면 전환에서 프레임 레이블 점프를 찾을 수 없습니다. [C : \ Users \ Michael \ Desktop \ platformGame \ PlatformGame.as : 418] at PlatformGame/moveEnemies() 에서 flash.display :: MovieClip/gotoAndStop() at PlatformGame/moveCharacter() 마이 그 레이션 \ Desktop \ platformGame \ PlatformGame.as : 314] at PlatformGame/gameLoop() [C : \ Users \ Michael \ Desktop \ platformGame \ PlatformGame.as : 303]

또한 충돌 감지에 문제가있는 것 같습니다. .

코드는 다음과 같습니다. (나는 원본에서 장면이나 레이블 이름을 변경하지 않았지만 여전히 오류를 보여줍니다).

package { 
    import flash.display.*; 
    import flash.events.*; 
    import flash.text.*; 
    import flash.utils.getTimer; 
    import flash.ui.Multitouch; 
    import flash.ui.MultitouchInputMode; 

    public class PlatformGame extends MovieClip { 
     // movement constants 
     static const gravity:Number = .004; 

     // screen constants 
     static const edgeDistance:Number = 100; 

     public var rightButton:SimpleButton; 

     // object arrays 
     private var fixedObjects:Array; 
     private var otherObjects:Array; 

     // hero and enemies 
     private var hero:Object; 
     private var enemies:Array; 

     // game state 
     private var playerObjects:Array; 
     private var gameScore:int; 
     private var gameMode:String = "start"; 
     private var playerLives:int; 
     private var lastTime:Number = 0; 



     // start game 
     public function startPlatformGame() { 
      playerObjects = new Array(); 
      gameScore = 0; 
      gameMode = "play"; 
      playerLives = 3; 
     } 


     // start level 
     public function startGameLevel() { 

      // create characters 
      createHero(); 
      addEnemies(); 

      // examine level and note all objects 
      examineLevel(); 

      // add listeners 
      this.addEventListener(Event.ENTER_FRAME,gameLoop); 
      Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
      gamelevel["rButton"].addEventListener(TouchEvent.TOUCH_BEGIN,touchRight); 
      gamelevel["rButton"].addEventListener(TouchEvent.TOUCH_END,touchRightReleased); 
      gamelevel["lButton"].addEventListener(TouchEvent.TOUCH_BEGIN,touchLeft); 
      gamelevel["lButton"].addEventListener(TouchEvent.TOUCH_END,touchLeftReleased); 
      gamelevel["jButton"].addEventListener(TouchEvent.TOUCH_BEGIN,jump); 
      gamelevel["jButton"].addEventListener(TouchEvent.TOUCH_END,jumpReleased); 


      trace("hi"+gamelevel["rButton"]); 

      // set game state 
      gameMode = "play"; 
      addScore(0); 
      showLives(); 
     } 



     // start level 
     public function startGameLevelHarder() { 

      // create characters 
      createHero(); 
      addHardEnemies(); 

      // examine level and note all objects 
      examineLevel(); 


      // set game state 
      gameMode = "play"; 
      addScore(0); 
      showLives(); 
     } 

     // start level 
     public function startGameLevelHardest() { 

      // create characters 
      createHero(); 
      addHardestEnemies(); 

      // examine level and note all objects 
      examineLevel(); 


      // set game state 
      gameMode = "play"; 
      addScore(0); 
      showLives(); 
     } 

     // creates the hero object and sets all properties 
     public function createHero() { 
      hero = new Object(); 
      hero.mc = gamelevel.hero; 
      hero.dx = 0.0; 
      hero.dy = 0.0; 
      hero.inAir = false; 
      hero.direction = 0; 
      hero.animstate = "stand"; 
      hero.walkAnimation = new Array(2,3,4,5,6,7,8); 
      hero.animstep = 0; 
      hero.jump = false; 
      hero.moveLeft = false; 
      hero.moveRight = false; 
      hero.jumpSpeed = .8; 
      hero.walkSpeed = .15; 
      hero.width = 15.0; 
      hero.height = 35.0; 
      hero.startx = hero.mc.x; 
      hero.starty = hero.mc.y; 
     } 




     // finds all enemies in the level and creates an object for each 
     public function addEnemies() { 
      enemies = new Array(); 
      var i:int = 1; 
      while (true) { 
       if (gamelevel["enemy"+i] == null) break; 
       var enemy = new Object(); 
       enemy.mc = gamelevel["enemy"+i]; 
       enemy.dx = 0.0; 
       enemy.dy = 0.0; 
       enemy.inAir = false; 
       enemy.direction = 1; 
       enemy.animstate = "stand" 
       enemy.walkAnimation = new Array(2,3,4,5); 
       enemy.animstep = 0; 
       enemy.jump = false; 
       enemy.moveRight = true; 
       enemy.moveLeft = false; 
       enemy.jumpSpeed = 1.0; 
       enemy.walkSpeed = .08; 
       enemy.width = 30.0; 
       enemy.height = 30.0; 
       enemies.push(enemy); 
       i++; 
      } 
     } 

     // finds all enemies in the level and creates an object for each 
     public function addHardEnemies() { 
      enemies = new Array(); 
      var i:int = 1; 
      while (true) { 
       if (gamelevel["enemy"+i] == null) break; 
       var enemy = new Object(); 
       enemy.mc = gamelevel["enemy"+i]; 
       enemy.dx = 0.0; 
       enemy.dy = 0.0; 
       enemy.inAir = false; 
       enemy.direction = 1; 
       enemy.animstate = "stand" 
       enemy.walkAnimation = new Array(2,3,4,5); 
       enemy.animstep = 0; 
       enemy.jump = false; 
       enemy.moveRight = true; 
       enemy.moveLeft = false; 
       enemy.jumpSpeed = 1.0; 
       enemy.walkSpeed = .15; 
       enemy.width = 56.0; 
       enemy.height = 80.0; 
       enemies.push(enemy); 
       i++; 
      } 
     } 


     // finds all enemies in the level and creates an object for each 
     public function addHardestEnemies() { 
      enemies = new Array(); 
      var i:int = 1; 
      while (true) { 
       if (gamelevel["enemy"+i] == null) break; 
       var enemy = new Object(); 
       enemy.mc = gamelevel["enemy"+i]; 
       enemy.dx = 0.0; 
       enemy.dy = 0.0; 
       enemy.inAir = false; 
       enemy.direction = 1; 
       enemy.animstate = "stand" 
       enemy.walkAnimation = new Array(2,3,4,5); 
       enemy.animstep = 0; 
       enemy.jump = false; 
       enemy.moveRight = true; 
       enemy.moveLeft = false; 
       enemy.jumpSpeed = 1.0; 
       enemy.walkSpeed = .25; 
       enemy.width = 40.0; 
       enemy.height = 40.0; 
       enemies.push(enemy); 
       i++; 
      } 
     } 

     // look at all level children and note walls, floors and items 
     public function examineLevel() { 
      fixedObjects = new Array(); 
      otherObjects = new Array(); 
      for(var i:int=0;i<this.gamelevel.numChildren;i++) { 
       var mc = this.gamelevel.getChildAt(i); 

       // add floors and walls to fixedObjects 
       if ((mc is Floor) || (mc is Wall) || (mc is ground1) || (mc is wall1) || (mc is ledge1) || (mc is ledge2) || (mc is rock) ||(mc is rocktip)) { 
        var floorObject:Object = new Object(); 
        floorObject.mc = mc; 
        floorObject.leftside = mc.x; 
        floorObject.rightside = mc.x+mc.width; 
        floorObject.topside = mc.y; 
        floorObject.bottomside = mc.y+mc.height; 
        fixedObjects.push(floorObject); 

       // add treasure, key and door to otherOjects 
       } else if ((mc is Treasure) || (mc is Key) || (mc is Door) || (mc is Chest)) { 
        otherObjects.push(mc); 
       } 
      } 
     } 


     // note key presses, set hero properties 
     public function touchRight(event:TouchEvent) { 
      trace("touchRight"); 
      hero.moveRight = true; 
     } 

     public function touchRightReleased(event:TouchEvent) { 
      hero.moveRight = false; 
     } 
     public function touchLeft(event:TouchEvent) { 
      hero.moveLeft = true; 
     } 

     public function touchLeftReleased(event:TouchEvent) { 
      hero.moveLeft = false; 
     } 

     public function jump(event:TouchEvent) { 
      if (!hero.inAir) { 
        hero.jump = true; 
       } 
     } 

     public function jumpReleased(event:TouchEvent) { 
      if (!hero.inAir) { 
        hero.jump = false; 
       } 
     } 
     // note key presses, set hero properties 
     //public function keyDownFunction(event:KeyboardEvent) { 
      //if (gameMode != "play") return; // don't move until in play mode 

      //if (event.keyCode == 37) { 
       //hero.moveLeft = true; 
      //} else if (event.keyCode == 39) { 
       //hero.moveRight = true; 
      //} else if (event.keyCode == 32) { 
       //if (!hero.inAir) { 
        //hero.jump = true; 
       //} 
      //} 
     //} 

     //public function keyUpFunction(event:KeyboardEvent) { 
      //if (event.keyCode == 37) { 
       //hero.moveLeft = false; 
      //} else if (event.keyCode == 39) { 
       //hero.moveRight = false; 
      //} 
     //} 

     // perform all game tasks 
     public function gameLoop(event:Event) { 

      // get time differentce 
      if (lastTime == 0) lastTime = getTimer(); 
      var timeDiff:int = getTimer()-lastTime; 
      lastTime += timeDiff; 

      // only perform tasks if in play mode 
      if (gameMode == "play") { 
       moveCharacter(hero,timeDiff); 
       moveEnemies(timeDiff); 
       checkCollisions(); 
       scrollWithHero(); 
      } 
     } 

     // loop through all enemies and move them 
     public function moveEnemies(timeDiff:int) { 
      for(var i:int=0;i<enemies.length;i++) { 

       // move 
       moveCharacter(enemies[i],timeDiff); 

       // if hit a wall, turn around 
       if (enemies[i].hitWallRight) { 
        enemies[i].moveLeft = true; 
        enemies[i].moveRight = false; 
       } else if (enemies[i].hitWallLeft) { 
        enemies[i].moveLeft = false; 
        enemies[i].moveRight = true; 
       } 
      } 
     } 

     // primary function for character movement 
     public function moveCharacter(char:Object,timeDiff:Number) { 
      if (timeDiff < 1) return; 

      // assume character pulled down by gravity 
      var verticalChange:Number = char.dy*timeDiff + timeDiff*gravity; 
      if (verticalChange > 15.0) verticalChange = 15.0; 
      char.dy += timeDiff*gravity; 

      // react to changes from key presses 
      var horizontalChange = 0; 
      var newAnimState:String = "stand"; 
      var newDirection:int = char.direction; 
      if (char.moveLeft) { 
       // walk left 
       horizontalChange = -char.walkSpeed*timeDiff; 
       newAnimState = "walk"; 
       newDirection = -1; 
      } else if (char.moveRight) { 
       // walk right 
       horizontalChange = char.walkSpeed*timeDiff; 
       newAnimState = "walk"; 
       newDirection = 1; 
      } 
      if (char.jump) { 
       // start jump 
       char.jump = false; 
       char.dy = -char.jumpSpeed; 
       verticalChange = -char.jumpSpeed; 
       newAnimState = "jump"; 
      } 

      // assume no wall hit, and hanging in air 
      char.hitWallRight = false; 
      char.hitWallLeft = false; 
      char.inAir = true; 

      // find new vertical position 
      var newY:Number = char.mc.y + verticalChange; 

      // loop through all fixed objects to see if character has landed 
      for(var i:int=0;i<fixedObjects.length;i++) { 
       if ((char.mc.x+char.width/2 > fixedObjects[i].leftside) && (char.mc.x-char.width/2 < fixedObjects[i].rightside)) { 
        if ((char.mc.y <= fixedObjects[i].topside) && (newY > fixedObjects[i].topside)) { 
         newY = fixedObjects[i].topside; 
         char.dy = 0; 
         char.inAir = false; 
         break; 
        } 
       } 
      } 

      // find new horizontal position 
      var newX:Number = char.mc.x + horizontalChange; 

      // loop through all objects to see if character has bumped into a wall 
      for(i=0;i<fixedObjects.length;i++) { 
       if ((newY > fixedObjects[i].topside) && (newY-char.height < fixedObjects[i].bottomside)) { 
        if ((char.mc.x-char.width/2 >= fixedObjects[i].rightside) && (newX-char.width/2 <= fixedObjects[i].rightside)) { 
         newX = fixedObjects[i].rightside+char.width/2; 
         char.hitWallLeft = true; 
         break; 
        } 
        if ((char.mc.x+char.width/2 <= fixedObjects[i].leftside) && (newX+char.width/2 >= fixedObjects[i].leftside)) { 
         newX = fixedObjects[i].leftside-char.width/2; 
         char.hitWallRight = true; 
         break; 
        } 
       } 
      } 

      // set position of character 
      char.mc.x = newX; 
      char.mc.y = newY; 

      // set animation state 
      if (char.inAir) { 
       newAnimState = ""; 
      } 
      char.animstate = newAnimState; 

      // move along walk cycle 
      if (char.animstate == "walk") { 
       char.animstep += timeDiff/60; 
       if (char.animstep > char.walkAnimation.length) { 
        char.animstep = 0; 
       } 
       char.mc.gotoAndStop(char.walkAnimation[Math.floor(char.animstep)]); 

      // not walking, show stand or jump state 
      } else { 
       char.mc.gotoAndStop(char.animstate); 
      } 

      // changed directions 
      if (newDirection != char.direction) { 
       char.direction = newDirection; 
       char.mc.scaleX = char.direction*1.35; 
      } 
     } 

     // scroll to the right or left if needed 
     public function scrollWithHero() { 
      var stagePosition:Number = gamelevel.x+hero.mc.x; 
      var rightEdge:Number = stage.stageWidth-edgeDistance; 
      var leftEdge:Number = edgeDistance; 
      if (stagePosition > rightEdge) { 
       gamelevel.x -= (stagePosition-rightEdge); 
       gamelevel["rButton"].x += (stagePosition-rightEdge); 
       gamelevel["lButton"].x += (stagePosition-rightEdge); 
       gamelevel["jButton"].x += (stagePosition-rightEdge); 
       if (gamelevel.x < -(gamelevel.width-stage.stageWidth)) gamelevel.x = -(gamelevel.width-stage.stageWidth); 
      } 
      if (stagePosition < leftEdge) { 
       gamelevel.x += (leftEdge-stagePosition); 
       gamelevel["rButton"].x -= (leftEdge-stagePosition); 
       gamelevel["lButton"].x -= (leftEdge-stagePosition); 
       gamelevel["jButton"].x -= (leftEdge-stagePosition); 
       if (gamelevel.x > 0) gamelevel.x = 0; 
      } 
     } 

     // check collisions with enemies, items 
     public function checkCollisions() { 

      // enemies 
      for(var i:int=enemies.length-1;i>=0;i--) { 
       if (hero.mc.hitTestObject(enemies[i].mc)) { 

        // is the hero jumping down onto the enemy? 
        if (hero.inAir && (hero.dy > 0)) { 
         enemyDie(i); 
        } else { 
         heroDie(); 
        } 
       } 
      } 

      // items 
      for(i=otherObjects.length-1;i>=0;i--) { 
       if (hero.mc.hitTestObject(otherObjects[i])) { 
        getObject(i); 
       } 
      } 
     } 

     // remove enemy 
     public function enemyDie(enemyNum:int) { 
      var pb:PointBurst = new PointBurst(gamelevel,"Got Em!",enemies[enemyNum].mc.x,enemies[enemyNum].mc.y-20); 
      gamelevel.removeChild(enemies[enemyNum].mc); 
      enemies.splice(enemyNum,1); 
     } 

     // enemy got player 
     public function heroDie() { 
      // show dialog box 
      var dialog:Dialog = new Dialog(); 
      dialog.x = 175; 
      dialog.y = 100; 
      addChild(dialog); 

      if (playerLives == 0) { 
       gameMode = "gameover"; 
       dialog.message.text = "Game Over!"; 
      } else { 
       gameMode = "dead"; 
       dialog.message.text = "He Got You!"; 
       playerLives--; 
      } 

      hero.mc.gotoAndPlay("die"); 
     } 

     // player collides with objects 
     public function getObject(objectNum:int) { 
      // award points for treasure 
      if (otherObjects[objectNum] is Treasure) { 
       var pb:PointBurst = new PointBurst(gamelevel,100,otherObjects[objectNum].x,otherObjects[objectNum].y); 
       gamelevel.removeChild(otherObjects[objectNum]); 
       otherObjects.splice(objectNum,1); 
       addScore(100); 

      // got the key, add to inventory 
      } else if (otherObjects[objectNum] is Key) { 
       pb = new PointBurst(gamelevel,"Got Key!" ,otherObjects[objectNum].x,otherObjects[objectNum].y); 
       playerObjects.push("Key"); 
       gamelevel.removeChild(otherObjects[objectNum]); 
       otherObjects.splice(objectNum,1); 

      // hit the door, end level if hero has the key 
      } else if (otherObjects[objectNum] is Door) { 
       if (playerObjects.indexOf("Key") == -1) return; 
       if (otherObjects[objectNum].currentFrame == 1) { 
        otherObjects[objectNum].gotoAndPlay("open"); 
        levelComplete(); 
       } 

      // got the chest, game won 
      } else if (otherObjects[objectNum] is Chest) { 
       otherObjects[objectNum].gotoAndStop("open"); 
       gameComplete(); 
      } 

     } 

     // add points to score 
     public function addScore(numPoints:int) { 
      gameScore += numPoints; 
      scoreDisplay.text = String(gameScore); 
     } 

     // update player lives 
     public function showLives() { 
      livesDisplay.text = String(playerLives); 
     } 

     // level over, bring up dialog 
     public function levelComplete() { 
      gameMode = "done"; 
      var dialog:Dialog = new Dialog(); 
      dialog.x = 175; 
      dialog.y = 100; 
      addChild(dialog); 
      dialog.message.text = "Level Complete!"; 
     } 

     // game over, bring up dialog 
     public function gameComplete() { 
      gameMode = "gameover"; 
      var dialog:Dialog = new Dialog(); 
      dialog.x = 175; 
      dialog.y = 100; 
      addChild(dialog); 
      dialog.message.text = "You Got the Treasure!"; 
     } 

     // dialog button clicked 
     public function clickDialogButton(event:MouseEvent) { 
      removeChild(MovieClip(event.currentTarget.parent)); 

      // new life, restart, or go to next level 
      if (gameMode == "dead") { 
       // reset hero 
       showLives(); 
       hero.mc.x = hero.startx; 
       hero.mc.y = hero.starty; 
       gameMode = "play"; 
      } else if (gameMode == "gameover") { 
       cleanUp(); 
       gotoAndStop("start"); 
      } else if (gameMode == "done") { 
       cleanUp(); 
       nextFrame(); 
      } 

      // give stage back the keyboard focus 
      stage.focus = stage; 
     }   

     // clean up game 
     public function cleanUp() { 
      removeChild(gamelevel); 
      this.removeEventListener(Event.ENTER_FRAME,gameLoop); 
     }  


    } 



} 

답변

0

오류는 다음과 같은 라인이며, 표시 "점프"프레임이없는 참조 MovieClip 때문에 발생 :

char.mc.gotoAndStop(char.animstate); 

내 생각 엔 당신이 MovieClip에 변화가 작성되는 당신의 캐릭터를 포함하고 있으며, 이렇게함으로써, 위의 코드가 참조하는 라벨을 제거했습니다.

+0

나에게 돌아와 줘서 고마워. 이상한 일이라면 원본과의 차이점을 찾을 수 없다. –

+0

내가 주목해야 할 것은 그가 지금 '점핑'상태에서 게임을 시작한다는 점이다. –

+0

프레임 중 하나가 "점프"라고 표시되어 있습니까? –