2012-06-28 10 views
0

현재 프로젝트를 수행하는 동안 hitTestPoint 정확도는 객체를 이동하자마자 한 프레임 지연됩니다. 따라서 객체 A가 완전히 새롭고 먼 위치로 이동되면 해당 객체에서 수행 된 hitTestPoint는 false를 반환합니다. 이를 설명하기 위해, 내가 가장 기본적인 논리를 사용하여 빠른 실험을했습니다 : 나는하여 hitTestPoint 제거하고 아이를 추가 한 후 다시 작동하는 것을 발견AS3 hitTestPoint 정확도가 한 프레임 씩 지연됩니다.

Hit test at (0,0) while object is at (0,0) = true 

>>>>>>>>>> WHERE DID THE OBJECT GO? >>>>>>>>>> 
Hit test at (0,0) while object is at (300,300) = false 
Hit test at (150,150) while object is at (300,300) = false 
Hit test at (300,300) while object is at (300,300) = false 
>>>>>>>>>> WHERE DID THE OBJECT GO? >>>>>>>>>> 

After remove/addChild, hit test at (300,300) while object is at (300,300) = true 

: 여기

import flash.display.Sprite; 
import flash.display.Graphics; 
import flash.events.Event; 

var me:Sprite = new Sprite(); 
var g:Graphics = me.graphics; 
g.beginFill(0xFF0000); 
g.drawRect(-10, -10, 20, 20); 
g.endFill(); 
addChild(me); 

trace("Hit test at (0,0) while object is at (" + me.x + "," + me.y + ") = " + me.hitTestPoint(0, 0, true)); 

me.x = 300; 
me.y = 300; 

trace("\n>>>>>>>>>> WHERE DID THE OBJECT GO? >>>>>>>>>>"); 
trace("Hit test at (0,0) while object is at (" + me.x + "," + me.y + ") = " + me.hitTestPoint(0, 0, true)); 
trace("Hit test at (150,150) while object is at (" + me.x + "," + me.y + ") = " + me.hitTestPoint(150, 150, true)); 
trace("Hit test at (300,300) while object is at (" + me.x + "," + me.y + ") = " + me.hitTestPoint(300, 300, true)); 
trace(">>>>>>>>>> WHERE DID THE OBJECT GO? >>>>>>>>>>\n"); 

removeChild(me); 
addChild(me); 

trace("After remove/addChild, hit test at (300,300) while object is at (" + me.x + "," + me.y + ") = " + me.hitTestPoint(300, 300, true)); 

및 결과입니다 다시 무대로. 그러나 hitTestPoint도 다음 프레임에서 작동합니다.

누구나 지금까지 이와 동일한 문제가 발생 했습니까?

답변

0

플래시가 표시 객체를 처리하는 방식 때문에이 문제가 발생한다고 생각합니다. 내 추측 순간 당신은 '나'를 그리는

addChild(me); 

"하는 AddChild"힘 플래시 호출 할 것입니다. 하지만 'me'를 움직이면 x 및 y 매개 변수를 사용하여 플래시가 완료되고 프레임이 완료 될 때까지 기다린 후 그래픽을 다시 그립니다. 당신이 응용 프로그램을 늦출 수있는 주위 방법이없는 경우를 제외하고 즉시

import flash.display.Sprite; 
import flash.display.Graphics; 
import flash.events.Event; 

var me:Sprite = new Sprite(); 
var g:Graphics = me.graphics; 
var myIndex:int; 
g.beginFill(0xFF0000); 
g.drawRect(-10, -10, 20, 20); 
g.endFill(); 
addChild(me); 

me.x = 300; 
me.y = 300; 

addChild(me); 

이 해킹을 사용하지 마십시오 다시 그리기 플래시를 시행 할 경우

은 다시 내가 추측 입니다. 다시 내 PC에 플래시가 없어서 내가 맞는지 확인할 수 없었습니다.

0

플래시가 스테이지에서 객체의 위치를 ​​업데이트하는 시간에 대해 언급 한 내용을 확인할 수 있지만 설명을 수정하고 확장 할 수 있습니다. Flash는 실제로 고정 된 프레임 속도를 가지며 디스플레이 업데이트가이 타임 라인을 따릅니다. 그러나 게임 로직은 렌더링 속도보다 빠르거나 느릴 수 있습니다. addChild(me)으로 전화하면 즉시 위치가 업데이트되지 않고 다음 프레임이 시작됩니다.

따라서 고정 된 시간 간격 또는 가변적 인 시간 간격을 선택해야합니다. 선택과는 별도로 로직을 업데이트하기 위해 플래시 플레이어에 의존하는 것보다 OnEnterFame과 같은 이벤트를 사용하여 시간 단계를 관리하는 것이 좋습니다.

나는 gamedev.stackexchange.com에 비슷한 문제에 an answer을 쓰고 스레드는 또한 몇 가지 유용한 링크가 있습니다 여기

그리고 또 다른 유용한 스레드가 그의 언어 독립적입니다 : Fixed time step vs Variable time step

관련 문제