2012-04-13 3 views
1

AS3.0에서 achtung die kurve와 비슷한 게임을 만들고 있습니다. 지금까지 나는 4 명의 선수들의 움직임을 보았습니다. 그리고 그것은 괜찮습니다.Actionscript 3.0에서 스프라이트 충돌 감지 플래시

이제 '웜'이 서로 또는 자신의 꼬리와 충돌하는지 테스트하기 위해 충돌 감지를합니다.

내가 이해하는 것처럼, hitTestObject(); 이 등록은 모든 객체를 포함하는 4면 등록을 만들기 때문에 전체 객체의 등록 영역을 사용합니다. 이는 큰 문제입니다. 따라서 이것을 사용하면 실제 웜을 치는 대신이 사각형을 입력하면 '충돌'하게됩니다. 이것은 정확하게 이해되고 있습니까?

나는 충돌 감지의 다른 방법을보고 있었고, 내 프로젝트에 최적의 방법을 찾을 수없는 것 같습니다.

내 생각에 '웜'이 흰색 배경에 새 스프라이트를 그리는 지 확인하는 것이 좋습니다. 그렇지 않다면 무언가를 쳤을 것입니다.

당신은 내가 여기에 내 코드를 사용하는 방법을 볼 수 있습니다 내 잘못 책정 질문에 대한 code in .as format linked to an .fla file

죄송합니다, 그것은 어느 정도 의미가 있기를 바랍니다. 도움을 주시면 대단히 감사하겠습니다 !!

감사합니다 - 객체 세트 폭과 높이가 및 그 객체로 사각형을 정의하기 때문에 예스퍼

+0

다음 항목을 확인해야합니다. http://active.tutsplus.com/sessions/collision-detection- and-reaction/ – davivid

답변

5

당신이 효율적으로 CPU 사용량으로 픽셀 완벽한 충돌 감지하려면이 기능을 사용해보십시오 : 성공적인 예비 hitTestObject()

trace("Collided: " + (areaOfCollision(mc1, mc2) != null)); 
trace("Where: " + areaOfCollision(mc1, mc2)); 

function areaOfCollision(object1:DisplayObject, object2:DisplayObject, tolerance:int = 255):Rectangle { 
    if (object1.hitTestObject(object2)) { 
     var limits1:Rectangle = object1.getBounds(object1.parent); 
     var limits2:Rectangle = object2.getBounds(object2.parent); 
     var limits:Rectangle = limits1.intersection(limits2); 
     limits.x = Math.floor(limits.x); 
     limits.y = Math.floor(limits.y); 
     limits.width = Math.ceil(limits.width); 
     limits.height = Math.ceil(limits.height); 
     if (limits.width < 1 || limits.height < 1) return null; 

     var image:BitmapData = new BitmapData(limits.width, limits.height, false); 
     var matrix:Matrix = object1.transform.concatenatedMatrix; 
     matrix.translate(-limits.left, -limits.top); 
     image.draw(object1, matrix, new ColorTransform(1, 1, 1, 1, 255, -255, -255, tolerance)); 
     matrix = object2.transform.concatenatedMatrix; 
     matrix.translate(-limits.left, -limits.top); 
     image.draw(object2, matrix, new ColorTransform(1, 1, 1, 1, 255, 255, 255, tolerance), BlendMode.DIFFERENCE); 

     var intersection:Rectangle = image.getColorBoundsRect(0xFFFFFFFF, 0xFF00FFFF); 
     if (intersection.width == 0) return null; 
     intersection.offset(limits.left, limits.top); 
     return intersection; 
    } 
    return null; 
} 

,이 기능은 backgroundly 다른 그린 두 개체의 모양에서 스냅 샷을 색상을 각각 섞은 다음 색상을 교차하여 새로운 색상으로 겹쳐서 결과 모양 인 Rectangle을 반환합니다. 너무 멋지다.

당신이이 이름 중 하나를 다음 충돌 감지 구글 수픽셀 완벽한 충돌 감지에 대한 자세한 내용은 "액션 스크립트 남자", "트로이 길버트", "Boulevart (WIM)를 ","스키너 (gSkinner) "또는"Senocular ". 그 놈들은 AS3 레퍼런스를 굉장히 좋아합니다.

+1

이 함수는 매우 유용하지만 문제가 있다고 생각합니다. 다른 해상도를 사용하면 전혀 작동하지 않습니다 ... – tziuka

+0

이것은 내가 필요한 것입니다. 고맙습니다! –

+0

와우 ...이 코드는 매우 유용합니다 !! 고마워요 : D – user2824371

0

는 discribe 문제는 collission 검출을위한 매우 일반적인 문제입니다.

하지만 픽셀 수준의 컬러 검색 시스템을 만들 수있는 해결책이 있습니다. 공식 사이트에서이 사실을 발견했기 때문에 픽셀 수준의 비트 맵에 대해 콜리 션을 감지 할 수있었습니다.

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7d55.html

는 같은 방법으로 당신을 도움이되기를 바랍니다.

+0

답변 해 주셔서 감사합니다. 저는 하루 종일이 작업을 해오 고 있지만 여전히이 문제에 대한 해결책을 찾을 수 없습니다. 비트 맵 충돌 검색을 사용해야한다고 생각합니다. 그러나 어떻게해야할지 모르겠습니다. 잘만되면 나는 신선한 눈으로 내일 그것을 해결할 수있을 것이다. :/ – Jellezilla

0

게임의 스크린 샷을 보면 최상의 모델은 각 웜을 서클 체인으로 설명하는 것입니다. 그런 다음 원/반경보다 약간 큰 셀을 사용하여 그리드에서 월드/레벨을 나눕니다.

충돌 검사는 다음과 같다 :

  1. 명확 그리드
  2. 장소는 모든 세포를 통해
  3. 반복 처리에 빠진다 1 개 이상의 격자 셀에 각각의 원, 각 셀 :
    • 이 셀에서 (부분적으로) 각 원 쌍에 대해 교차하는지 확인하십시오. 그들이하는 경우; 충돌. 이것은 원 A와 B 사이에 둘 이상의 충돌이 발생할 수 있으므로 중복을 피하기 위해 반드시 확인해야합니다.

단계 1 및 2는이 이동 후 원의 각 셀을 갱신하고, 대신에 단계 (2)의 격자를 삭제하지 않음으로써 최적화 될 수있다. 원의 크기가 5 배인 셀의 크기를 조정하면 과도한 추가/제거 작업을 피하면서 원이 몇 프레임 동안 같은 셀에 머물 수 있습니다.

나는 우주선을 제외하고 지금 내 프로젝트에서 비슷한 것을하고 있습니다! 내 표 셀은 현재 256x256 (생각하는 프로젝트에 비해 너무 큽니다)이고 내 단위의 반지름은 약 20입니다.

관련 문제