2012-03-19 15 views
0

mouseXとmouseYの位置を直接変更できないため、私のプロジェクトの開発に不可欠な難題です。読み取り専用変数。Flash AS3:マウスを特定の境界内に維持する

基本的に、特定のインスタンスがアクティブなときに特定の三角形の領域内でマウスを動かすことができます。後者のビットではうまく管理できますが、マウスの動きやマウスの動きが制限されています。

これまで行ってきたことは次のとおりです。 1. Mouse.MOUSE_MOVEに移動する必要があることを認めていますが、ライブラリmoveclipをEvent.ENTER_FRAMEイベントのmouseXおよびmouseY位置に割り当てます。 (これはまだ問題ありません) 2. Corey O'Neils衝突検出キットを使用して、十字線/カーソルを使って領域の境界線のインスタンスをヒットテストします。 3.カーソルを適切にオフセットし、標準ブール値をfalseに設定して、カーソルがカーソルに何度も何度も戻ってくることを避けます。

私の問題は、マウスの動きを許すのが最善の方法であるかどうかわかりません。誰でも私にこれを行うための最善の方法のヒントを教えてもらえますか、必要に応じて、マウスの動きを制限するのが簡単な別の方向を教えてください。

これは、ユーザーがトップダウン(ish)シューティングゲームでキャラクターとの非現実的な方向を目指すのを止めることです。

Corey O'NeilのCollision Detection Kitに慣れていない人には、ビットマップ(または多分ベクトル)の衝突テストの設定済みの設定だと思います。間違っている可能性があります。どのように動作するかについての詳細はわかりませんが、基本的な実装だけです。

ここ

がこれまでマウスの動きに関する私のコードです:

import flash.ui.Mouse; 
import flash.events.event 
import com.coreyoneil.collision.CollisionList; 
Mouse.hide(); 
var c:crosshair = new crosshair(); 
addchild(c); 
var myCollisionList:CollisionList; 
myCollisionList = new CollisionList(c); //sets up detection for the object c 
myCollisionList.addItem(mcB); // adds mcB to the list of objects to check c's hittest with 

function aim(e:Event) { 
    var collisions:Array = myCollisionList.checkCollisions(); 
    if (collisions.length>0) 
    { 
     hashit = true; // tells the program that the mouse has collided with a boundary 
     c.x += 1; 
     c.y += 1; 
    } 
    else 
    { 
     if (hashit == false) 
     { 
      c.x = mouseX; 
      c.y = mouseY; 
     } 
    } 
} 

コードブロックのための謝罪が、私はそれがすべての関連するコードを表示するのが最適です理解 - 私はこれの複雑さについてはよく分かりませんマウスのXおよびY位置の読み取り専用の性質のために発生します。

また、私はclunkyにならない可能性のある解決策を探しています。つまり、マウスがその領域に戻ったらすぐに、マウスの動きは本来のように滑らかになります。マウスの位置に合っていることを意味します(つまり、カーソルは常にマウスに関連しており、マウスが境界を離れると位置は変わりません)。

誰でも私にいくつかのポインタを教えてください。長い質問を申し訳ありません。私はここで少し頭がおかしくなるかもしれませんが、AS3には比較的新しいです - でも、もしあなたが正しい方向を示して両方の論理少し物事のプログラミング面。ここで

等の境界領域を明確にするために、私のステージの図である A diagram of my stage to clarify further http://i40.tinypic.com/2csfivm.png

事前に任意の助けのために非常に多くの

おかげで、私は本当に感謝します!

乾杯、ハリー。

答えて

0

特定のポイントの下にあるオブジェクトの配列を返すgetObjectsUnderPointを試してみてください。 三角形オブジェクトが配列内にある場合は、その上にカーソルを置く必要があります。

var pt:Point = new Point(c.x, c.y); 
var objects:Array = stage.getObjectsUnderPoint(pt); 

if (objects.indexOf(triangleObject) > -1) { 
trace("still within bounds"); 
} 
+0

私はそのコマンドに完全に慣れていません。私はそれを使用するとき、私はbounds *になることはできません:[あなたはあまりにも、私はそれを実装していることを確認triangleObject境界線ですか? – hazdog

+0

triangleObjectは三角形のスプライトで、線ではありません。すなわち、新しいスプライトを作成し、三角形を描き、それをステージに追加して、インスタンス名をtriangleObjectにします – crooksy88

+0

まだ私はまだ境界内にいると私に教えてもらえません。あなたは小さな事例を盛り上げることができますか?申し訳ありません仲間 – hazdog

0

ここでの回避策は、システムマウスカーソルを非表示にして、オーダーに特注のカーソルムービークリップを追加することです。

ステージにアタッチされたMOUSE_MOVEイベントリスナーを使用して、stage.mouseXとstageに合わせてカスタマイズされたカーソルのmovieclipを設定します。movyeclipがあなたの範囲外にあるかどうかをテストします。そうなら、あなたの範囲内に戻してください。

+0

お詫び - 私はマウスカーソルも隠してしまいましたが、カスタムグラフィックスをムービークリップ(この場合はcです)として使用しています。残念ながら、ムービークリップが境界線の外側にあるかどうかをテストする方法はわかりません。各境界線が対角線であるため、カーソルを除外する実際のx座標とy座標はありません。このため、私は衝突検出キットを使用しています。 :)タ、ハリー。 – hazdog

関連する問題