작년에 내 학생들에게 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 : 는 그 이전에 시도와 같은 오류가 계속했다. 나는이 게임 코드의 다른 곳에 사용했다. 내가 플레이어가 얼마나 자주 총을 쐈는지 검토 할 필요가 있음을 알 수 있습니다. 대신 마우스로 촬영하는 대신 공간을 사용하는 것으로 바뀌 었습니다. 이제 문제는 사라졌습니다. 휴식은 확실히 좋은 것입니다.
히트를 찾으면 상자와 샷을 제거합니다. 그런 다음 내부 루프는 다음 상자로 다른 라운드로 이동하지만 hitTestObject를 이미 제거한 것과 똑같은 방식으로 시도합니다. 따라서 히트가 발생할 때 내부 루프를 '끊어서'외부 루프를 돌보아야한다는 것을 기억해야합니다. – kaarto
@Kaarto는 플레이어가 얼마나 자주 촬영할 수 있는지에 관계없이 정확합니다. 히트 테스트가 통과하고'k'에서 마지막 반복이 아니면'shot [i] '가 더 이상 다음 반복에서 오류가됩니다. 존재한다. (왜냐하면 당신은 그것을 뽑아 내고 이제는 '나는'범위를 벗어날 것이기 때문이다.) 'removeChild (boxes.removeAt (k));'를 사용하여 제거 작업을 단순화 할 수 있습니다. 성능상의 이유로 입력 프레임 처리기를 하나로 합치는 것이 좋습니다. – BadFeelingAboutThis
@RobCampbell, [cseducators.se] 커뮤니티를 확인해 보는 것도 좋습니다. –