2017-11-03 1 views
1

작년에 내 학생들에게 Flash에서 AS3을 사용하여 캐치를 만들고 게임을 피할 수있는 첫 해가되었습니다. 올해는 점점 좋아지고 있습니다. 해마다 나는 적어도 한 번 도움을 청합니다.샷 충돌 확인 및 AS3에서 샷 및 타겟 제거

두 번째 게임 프로젝트의 가능성에 총격을 추가하려고합니다. 나는 총을 우주선, 총기, 무엇이든간에 발생시켜 움직 이도록 할 수 있으며, 스크린에서 꺼지면 제거 할 수 있지만, 샷과 타겟을 멀리 떨어 뜨리는 깨끗한 방법을 찾지 못했습니다 (removeChild 및 array.splice) 충돌시.

코드

나는 작품 종류가 있지만, 나는 팔자 '가 계속 "형식 오류 : 오류 # 1010 : 용어가 정의되지 않고 속성 DropShootV02_fla :: MainTimeline이/checkShots에서 ()를이 없습니다.". 일반적으로 이것은 객체와 인덱스 번호가 일치하지 않기 때문에 발생합니다.하지만 이것은 상자와 글 머리 기호를 제거하는 두 번째 배열에 대한 호출과 관련이 있습니다. 간단히 촬영 코드 만 입력하면됩니다. 비슷한 조직이 상자를 만들고 삭제합니다.

도움을 주시면 감사하겠습니다. BTW 우리는 AS 파일에서 외부 스크립트를 사용하지 않습니다.

var shotSpeed = 18; 
var shots:Array = new Array(); 
import flash.events.MouseEvent; 
import flash.events.Event; 
stage.addEventListener(MouseEvent.CLICK, fireLaser); 
function fireLaser(e:MouseEvent):void 
{ 
    if (gameOn==true) 
    { 
     var shot:Shot=new Shot(); 
     addChild(shot); 
     shots.push(shot); 
     shot.gotoAndStop(1); 
     shot.x = user.x; 
     shot.y = user.y; 
     trace(shots.length); 
    } 
} 
addEventListener(Event.ENTER_FRAME, moveShot); 
function moveShot(e:Event):void 
{ 
    for (var i:int=shots.length-1; i>=0; i--) 
    { 
     shots[i].y -= shotSpeed; 
     if (shots[i].y < -25) 
     { 
      removeChild(shots[i]); 
      shots.splice(i,1); 

     } 
    } 
} 
addEventListener(Event.ENTER_FRAME, checkShots); 
function checkShots(e:Event):void 
{ 
    for (var i:int=shots.length-1; i>=0; i--) 
    { 
     for (var k:int=boxes.length-1; k>=0; k--) 
     { 
      if (shots[i].hitTestObject(boxes[k])) 
      { 
       if (boxes[i].type == "good") 
       { 
        score--; 
        scoreDisplay.text = "Score:" + score; 
       } 
       if (boxes[i].type == "bad") 
       { 
        score++; 
       } 
       removeChild(boxes[k]); 
       boxes.splice(k,1); 
       //if I leave this part out I get no errors, 
       //but but the bullet goes on to strike again 
       removeChild(shots[i]); 
       shots.splice(i,1); 
      } 
     } 
    } 
} 

덕분에 kaarto : 는 그 이전에 시도와 같은 오류가 계속했다. 나는이 게임 코드의 다른 곳에 사용했다. 내가 플레이어가 얼마나 자주 총을 쐈는지 검토 할 필요가 있음을 알 수 있습니다. 대신 마우스로 촬영하는 대신 공간을 사용하는 것으로 바뀌 었습니다. 이제 문제는 사라졌습니다. 휴식은 확실히 좋은 것입니다.

+3

히트를 찾으면 상자와 샷을 제거합니다. 그런 다음 내부 루프는 다음 상자로 다른 라운드로 이동하지만 hitTestObject를 이미 제거한 것과 똑같은 방식으로 시도합니다. 따라서 히트가 발생할 때 내부 루프를 '끊어서'외부 루프를 돌보아야한다는 것을 기억해야합니다. – kaarto

+1

@Kaarto는 플레이어가 얼마나 자주 촬영할 수 있는지에 관계없이 정확합니다. 히트 테스트가 통과하고'k'에서 마지막 반복이 아니면'shot [i] '가 더 이상 다음 반복에서 오류가됩니다. 존재한다. (왜냐하면 당신은 그것을 뽑아 내고 이제는 '나는'범위를 벗어날 것이기 때문이다.) 'removeChild (boxes.removeAt (k));'를 사용하여 제거 작업을 단순화 할 수 있습니다. 성능상의 이유로 입력 프레임 처리기를 하나로 합치는 것이 좋습니다. – BadFeelingAboutThis

+0

@RobCampbell, [cseducators.se] 커뮤니티를 확인해 보는 것도 좋습니다. –

답변

-2

move shotcheckShots을 하나의 ENTER_FRAME 처리기에 병합하십시오.

관련 문제