2013-08-03 2 views
-1

그래서 AS2.0에서 게임을하고 있습니다. 움직일 수있는 스퀘어를 제어하고 벽이나 레벨 리셋을 건드리지 않아야하고 초기 위치로 돌아갑니다. 나는 그것을 할 수 있었지만 각 벽면에 대해 If를 만들어야하고 복사/붙여 넣기를하더라도 더 큰 레벨에 도달하면 영원한 작업이 될 것입니다. 같은 시간에 여러 객체를 히트 테스팅하는 방법이 있습니까? DAS2.0에서 여러 객체를 동시에 테스트하는 방법은 무엇입니까?

on(keyPress "<Left>") { 
    this._x -= 5; 
} 
on(keyPress "<Right>") { 
    this._x += 5; 
} 
on(keyPress "<Down>") { 
    this._y += 5; 
} 

on(keyPress "<Up>") { 
    this._y -= 5; 
} 
onClipEvent(EnterFrame) { 
    if (_root.square.hitTest(_root.wall)) { 
     _root.touch._Alpha = 100; 
     this._x = _root.x0; 
     this._y = _root.y0; 
    } 
    if (_root.square.hitTest(_root.wall1)) { 
     _root.touch._Alpha = 100; 
     this._x = _root.x0; 
     this._y = _root.y0; 
    } 
    if (_root.square.hitTest(_root.wall2)) { 
     _root.touch._Alpha = 100; 
     this._x = _root.x0; 
     this._y = _root.y0; 
    } 
    if (_root.square.hitTest(_root.goal)) { 
     _root.gotoAndStop(3); 
    } 
} 

는 광장의 행동에 이루어집니다 : 당신이 그것을 필요로하는 경우에 감사는 - 당신은 여기 내 코드입니다 .

답변

1

많은 양의 코드를 복사하여 붙여 넣는 경우 매우 짧아서 루프에 넣을 수있는 가능성이 높습니다 (코드 복사 및 붙여 넣기는 무엇인가가 잘못 = b).

아니요, "동일"시간에 모두 확인할 수는 없지만 루프를 사용하여 if 문 문제를 해결할 수 있습니다. 모든 벽에 붙은 무비 클립을 배열 (또는 무언가 반복 가능)에 집어 넣고 루프를 돌립니다. 이동하여 배열을 만든 후

// create an array and add a reference to all your wall clips 
var collidableWalls:Array = new Array(); 
collidableClips.push(_root.wall); 
collidableClips.push(_root.wall1; 
collidableClips.push(_root.wall2); 

그런 다음, 각 벽에 대한 그러나 hitTest를 확인할 수 있습니다 :

하여 위의 코드의 루프 버전의 예는 같은 것

for(var counter:Number = 0; counter < collidableClips.length; counter++){ 
    if (_root.square.hitTest(collidableClips[counter])) { 
     _root.touch._Alpha = 100; 
     this._x = _root.x0; 
     this._y = _root.y0; 
    } 
} 

지금 당장은 "_root.goal"을 별도로 처리해야하므로 별도로 처리해야합니다. 이 오버 헤드 비트의 결과, 모든 단일 프레임을 만들 수 배열을 일으킬 것처럼

if (_root.square.hitTest(_root.goal)) { 
    _root.gotoAndStop(3); 
} 

은에서는 onClipEvent (를 enterFrame)에있어서의 배열하지 않는다. 어딘가에 두는 것이 좋기 때문에 한 번만 생성됩니다 (조언 참조). 또한, 동적으로 이동하여 동영상 클립을 참조 할 수도 있습니다 :

_root["wall" + 1] 

이 염두에두고

_root.wall1 

같은 것, 모든 벽 클립이와 (같은 이름 경우 요 (단 2 벽을 추가

for(var counter:Number = 1; counter < 3; counter++){ 
    collidableClips.push(_root["wall" + counter]); 
} 

잔인하지만 그들 중 몇 백이있는 경우, 그것은 을 도움이 될 수 있습니다 접두사 "벽"과 숫자), 당신이 뭔가를 할 수 u는 배열을 사용하지 않고 직접 비교할 수도 있습니다.)

자, 이제는 "onClipEvent"를 사용하고 코드를 움직이는 코드로 바꿀 것입니다. 나중에 코드를 작성하면 코드를 구성하기가 어려울 수 있습니다. 또한 refernce 문제를 실행하고 코드가 정확히 어떤 클립에 있는지 혼동 할 수 있습니다 (특히 디버그 할 시간이 있고 많은 시간이 필요할 때 특히 그렇습니다). 대신 '프레임 스크립트'로 이동하는 것이 좋습니다 ('다음 단계'가 표시됨).

나중에 가능하면 _root를 사용하지 않는 것이 좋습니다. 그것에 의존하는 습관으로 인해 많은 문제가 발생할 수 있습니다 (예 : swfs를 서로로드하거나 _root가 전혀 존재하지 않는 AS3으로 이동하는 경우).

+0

니스! 감사.그런데, 몇몇 경우에는 _root를 사용해야했습니다. 예를 들어 프레임 전환과 히트 테스트가 그렇지 않은 경우 충돌하기 때문입니다. 또한, 나는 "분명히 '독단적 인'충고 '가 매우 도움이된다는 것을 발견했다 : D – OrangeWall