0

現在のプロジェクトを行っているときに、オブジェクトを移動するとすぐに、hitTestPoint の精度が 1 フレーム遅れることがわかりました。したがって、オブジェクト A がまったく新しい遠く離れた位置に移動した場合、そのオブジェクトに対して実行された hitTestPoint は false を返します。これを説明するために、最も基本的なロジックを使用して簡単な実験を行いました。

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 ) );

結果は次のとおりです。

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

子を削除してステージに戻すと、 hitTestPoint が再び機能することがわかりました。しかし、hitTestPoint も次のフレームで機能します。

これまでに誰かがこれと同じことに遭遇しましたか?

4

2 に答える 2

0

フラッシュがステージ上のオブジェクトの位置を更新する時間について、チャンディングが何を言ったかは確認できますが、説明は修正および拡張できます。Flashのフレームレートは確かに固定されており、表示の更新はこのタイムラインに従います。ただし、ゲームロジックは、レンダリング速度よりも速くなったり遅くなったりする可能性があります。呼び出すaddChild(me)と、すぐに位置が更新されるのではなく、次のフレームの開始時にも更新されます。

したがって、固定時間ステップまたは可変時間ステップを選択する必要があります。選択内容に関係なくOnEnterFame、ロジックの更新をFlash Playerに依存するよりも、タイムステップの管理などのイベントを使用することをお勧めします。

私はgamedev.stackexchange.comで同様の問題に対する答えを書きました、そしてスレッドはまたいくつかの有用なリンクを持っています:

そして、言語に依存しない別の便利なスレッドがあります:固定時間ステップと可変時間ステップ

于 2012-06-28T11:17:17.770 に答える
0

この問題は、フラッシュが表示オブジェクトを処理する方法が原因で発生していると思います。私の推測では、あなたが電話した瞬間

addChild(me);

「addChild」は、flash に「me」を強制的に描画させます。ただし、x および y パラメータを使用して「me」を移動すると、フラッシュはフレームが完了するのを待ってからグラフィックを再描画します。

繰り返しますが、フラッシュを強制してすぐに再描画したい場合は推測しています

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 にフラッシュがないため、正しいかどうかを確認できませんでした。

于 2012-06-28T09:01:03.593 に答える