누군가 내 플래시 활동을 클릭하면 많은 계산이 트리거됩니다. 사용자가 다시 클릭하면 (예 : 두 번 클릭) 무거운 계산이 완료되면이 이벤트가 대기열에 추가되고 전달됩니다. 여러 번 클릭하면 문제가 복잡해집니다. 충분히 빠르게 클릭하면 대기중인 무거운 계산이 10 초 후에 완료되고 각 clickEvent는 다음 작업을 천천히 빼내줍니다.모든 mousePressed 이벤트에 대한 정확한 시간을 얻으십시오.
두 가지 질문이 있습니다.
첫 번째 : 클릭이 발생한 정확한 시간은 어떻게 알 수 있습니까? 아래의 예에서 클릭이 끊어진 후에도 빠른 클릭 이벤트가 발생합니다 (SP?).
두 번째 : 모든 클릭을 수집하기위한 좋은 디자인 패턴은 무엇입니까? 내 머리 위로 떨어져 나는 누군가가 enterFrame 이벤트에서 계산하는 동안 클릭하면 내가
연기 어떤 계산이 다음 enterFrame 이벤트까지,하지만 ... 그럼,이 같은 문제를 가지고해야 가정 !
무거운 계산을 가짜 스레드로 분해하는 것이 다른 해결책이지만 프로세서의 속도에 따라 입도를 찾는 것이 어렵습니다.
첫 번째 클릭 후 다음 클릭을 무시하기 위해 플래그를 추가하는 중 ... 그러나이 솔루션은 사용자가 잠겨있을 때 수행하려고 시도했던 것을 추적하지 못하게합니다. 나의 첫 번째 질문에 대한 해결책은 내가 여기서 필요로하는 것이다.
어떤 조언을 주셔서 감사합니다. 여기에 문제를 설명하는 몇 가지 예제 코드입니다 : 누르면 빠른 버튼과 관련된 나의 과거 프로젝트의
package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
public class clicky extends Sprite
{
private static var _lastTraceTime:Number = new Date().getTime();
private var _sp:Sprite;
private var _state1:Boolean;
public function clicky():void
{ super();
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
_state1 = true;
_sp = new Sprite();
addChild(_sp);
_sp.graphics.beginFill(0xFF00AA, 1);
_sp.graphics.drawRect(10, 10, 100, 100);
_sp.graphics.endFill();
_sp.addEventListener(MouseEvent.MOUSE_DOWN, mDnCb, false, 0, true);
}
private function mDnCb(evt:MouseEvent):void
{ traceTime("click");
_state1 = !_state1;
var c:uint = 0xFF0000;
if (_state1)
{ c = 0x00FFAA;
}
paintThatRect(c);
killTime();
}
private function paintThatRect(c:uint):void
{
_sp.graphics.beginFill(c, 1);
_sp.graphics.drawRect(10, 10, 100, 100);
_sp.graphics.endFill();
}
private function killTime():void
{ var r:Rectangle = new Rectangle(0, 0, 100, 100);
for (var i:uint = 0; i < 500000; i++)
{
var t:Rectangle = new Rectangle(i, i, i, i);
if (t.intersects(r) || r.containsRect(t) || t.containsRect(r))
{ r = t.union(r);
}
}
}
public static function traceTime(note:String):Number
{ var nowTime:Number = new Date().getTime();
var diff:Number = (nowTime-_lastTraceTime);
trace("[t" + diff + "] " + note);
_lastTraceTime = nowTime;
return diff;
}
}
}
시간이 필요한 이유를 설명하지 않았습니다. 그걸로 무엇을 할 계획 이었습니까? – Gunslinger47
나는 그들이 클릭 할 수있는 속도를 알고 싶습니다 ... 그래서 여러 번 목표물을 쏠 수 있습니다. 효과적이기 위해서는 히트 곡이 빠르게 연속되어야합니다. – jedierikb