@@ -213,30 +213,52 @@ function createBurst(centerX: number, centerY: number, options: PixelBurstOption
213213
214214// グローバルなクリックハンドラを設定
215215export function initPixelBurst ( options : PixelBurstOptions = { } ) {
216- function handleClick ( event : MouseEvent | TouchEvent ) {
217- let x : number , y : number ;
218-
219- if ( event instanceof TouchEvent ) {
220- const touch = event . touches [ 0 ] || event . changedTouches [ 0 ] ;
221- // pageX/pageY を使用してページ座標を取得
222- x = touch . pageX ;
223- y = touch . pageY ;
224- } else {
225- // pageX/pageY を使用してページ座標を取得
226- x = event . pageX ;
227- y = event . pageY ;
216+ let lastTouchTime = 0 ;
217+ let lastTouchX = 0 ;
218+ let lastTouchY = 0 ;
219+ const TOUCH_DEBOUNCE_MS = 300 ; // 300ms以内の重複を防ぐ
220+ const TOUCH_DISTANCE_THRESHOLD = 10 ; // 10px以内の距離を同じタップとみなす
221+
222+ function handleTouch ( event : TouchEvent ) {
223+ const touch = event . touches [ 0 ] || event . changedTouches [ 0 ] ;
224+ const x = touch . pageX ;
225+ const y = touch . pageY ;
226+ const now = Date . now ( ) ;
227+
228+ // 短時間内に同じ位置でタッチされた場合は無視(デバウンス)
229+ const timeDiff = now - lastTouchTime ;
230+ const distance = Math . sqrt (
231+ Math . pow ( x - lastTouchX , 2 ) + Math . pow ( y - lastTouchY , 2 )
232+ ) ;
233+
234+ if ( timeDiff < TOUCH_DEBOUNCE_MS && distance < TOUCH_DISTANCE_THRESHOLD ) {
235+ return ;
228236 }
229237
238+ lastTouchTime = now ;
239+ lastTouchX = x ;
240+ lastTouchY = y ;
241+
230242 createBurst ( x , y , options ) ;
231243 }
232244
245+ function handleClick ( event : MouseEvent ) {
246+ // タッチイベントの直後に発火したclickイベントは無視
247+ const now = Date . now ( ) ;
248+ if ( now - lastTouchTime < TOUCH_DEBOUNCE_MS ) {
249+ return ;
250+ }
251+
252+ createBurst ( event . pageX , event . pageY , options ) ;
253+ }
254+
255+ document . addEventListener ( 'touchstart' , handleTouch , { passive : true } ) ;
233256 document . addEventListener ( 'click' , handleClick ) ;
234- document . addEventListener ( 'touchstart' , handleClick , { passive : true } ) ;
235257
236258 // クリーンアップ関数を返す
237259 return ( ) => {
238260 document . removeEventListener ( 'click' , handleClick ) ;
239- document . removeEventListener ( 'touchstart' , handleClick ) ;
261+ document . removeEventListener ( 'touchstart' , handleTouch ) ;
240262
241263 // 全パーティクルを削除
242264 for ( const p of particles ) {
0 commit comments