2017-03-19 16 views
1

処理の衝突を扱うのは簡単です。しかし、どのように私は歩道との衝突を特定するのですか?処理:トレールとの衝突

例:必要に応じて、トライロンのライトサイクルを想像してください。デリケートなライトサイクルのトレイルが消えることはありません。トロンでは、あるサイクルが他のどのサイクルと交差していても、それ自身が含まれていて、これまで存在していた場合、それは「死ぬ」。処理でこのイベントを効率的に見つけるにはどうすればよいですか?

答えて

2

回避策の1つは、線をPImageに描画して、ある場所の色が背景と同じかどうか(たとえば、既存の線、したがって衝突)を確認することです。同様の概念は、リスト内のポイントを追跡している場合、新たなポイントをチェックすることが行うことができます

PImage buffer; 

//how mutch we scale down = how pixely this will look 
int multiplier = 8; 
//scaled down width/height 
int w,h; 
//cursor position 
int px,py; 
//cursor velocity; 
int vx,vy; 


void setup(){ 
    size(400,400); 
    noSmooth(); 

    w = width/multiplier; 
    h = height/multiplier; 

    buffer = createImage(w,h,RGB); 
    clear(); 
} 
void clear(){ 
    java.util.Arrays.fill(buffer.pixels,color(0)); 
    buffer.updatePixels(); 
} 
void draw(){ 
    //update cursor 
    px += vx; 
    py += vy; 
    //check edges 
    if(px < 0){ 
    px = w-1; 
    } 
    if(px > w){ 
    px = 0; 
    } 
    if(py < 0){ 
    py = h-1; 
    } 
    if(py > h){ 
    py = 0; 
    } 
    //check collision 
    if(keyPressed){ 
    if(keyCode == UP || keyCode == DOWN || keyCode == LEFT || keyCode == RIGHT){ 
     checkSelfIntersection(); 
    } 
    } 
    //paint cursor 
    buffer.set(px,py,color(0,192,0)); 

    //render on screen 
    image(buffer,0,0,width,height); 
} 
void checkSelfIntersection(){ 
    //if the pixel ahead is not the same colour as the background 
    if(buffer.get(px+vx,py+vy) > color(0)){ 
    clear(); 
    println("Cycle go BOOM!"); 
    } 
} 
void keyPressed(){ 
    if(keyCode == UP){ 
    vy = -1; 
    } 
    if(keyCode == DOWN){ 
    vy = +1; 
    } 
    if(keyCode == LEFT){ 
    vx = -1; 
    } 
    if(keyCode == RIGHT){ 
    vx = +1; 
    } 
} 
void keyReleased(){ 
    vx = vy = 0; 
} 

はここ概念の)によるget()/set()呼び出しに(ラフ(とやや非効率的な証拠ですすでにこのリストの一部(衝突)かではありません。

ArrayList<PVector> path = new ArrayList<PVector>(); 


//cursor position 
int px,py; 
//cursor velocity; 
int vx,vy; 

void setup(){ 
    size(400,400); 
    noFill(); 
    strokeWeight(10); 
} 
void draw(){ 
    //update cursor 
    px += vx; 
    py += vy; 
    //check edges 
    if(px < 0){ 
    px = 0; 
    } 
    if(px > width){ 
    px = width; 
    } 
    if(py < 0){ 
    py = 0; 
    } 
    if(py > height){ 
    py = height; 
    } 
    //check collision 
    if(keyPressed){ 
    if(keyCode == UP || keyCode == DOWN || keyCode == LEFT || keyCode == RIGHT){ 
     checkSelfIntersection(); 
    } 
    } 

    background(255); 
    beginShape(); 
    for(int i = 0 ; i < path.size(); i++){ 
    PVector p = path.get(i); 
    vertex(p.x,p.y); 
    } 
    endShape(); 
} 
void checkSelfIntersection(){ 
    PVector cursor = new PVector(px,py); 
    if(path.contains(cursor)){ 
    path.clear(); 
    println("Cycle go BOOM!"); 
    }else{ 
    path.add(cursor); 
    } 
} 
void keyPressed(){ 
    if(keyCode == UP){ 
    vy = -5; 
    } 
    if(keyCode == DOWN){ 
    vy = +5; 
    } 
    if(keyCode == LEFT){ 
    vx = -5; 
    } 
    if(keyCode == RIGHT){ 
    vx = +5; 
    } 
} 
void keyReleased(){ 
    vx = vy = 0; 
} 

概念は蛇/ヴォルフィードの/ etcのような方法をゲームと大差ないが、自己交差をチェック

注:小さなベロシティのキーで「カーソル」を更新することでちょっと欺いています。これは、ラインの隙間を避けます。マウスで置き換えようとすると、記録されたポイントのリストに対して1つのポイントを確認しながらマウスが速く動くと、衝突チェックが失敗することがあります。代わりに、点のリストを線のペアに分割し、新しい点がそれらのいずれかと交差するかどうかを確認することもできます。

これもチェックしてみることもできます。similar question

-2

スタックオーバーフローは実際には一般的な「どのようにこれを行うのですか」タイプの質問には対応していません。それは具体的なものです。「私はXを試しましたが、Yは期待されましたが、代わりにZがあります。つまり、私は一般的な意味で助けようとします。

おそらく、プレイヤーが回ったすべての点のうち、ArrayListという形で、サイクルによって形成された線を追跡するだけでよいでしょう。次に、各ステップで、プレイヤーがこれらのラインと交差しているかどうかを確認できます。

具体的には、前のプレイヤー座標と次のプレイヤー座標の間に別の線を作成したいと思うかもしれません。次に、Googleの検索で見つけた数式を使って、その行が他の行と交差しているかどうかを確認します。

非常に大きな競技場(数百万行など)について話している場合を除き、おそらくそれ以上のことはしないでください。したがって、効率について質問するのは少し早いです。

もちろん、この問題には他にも多くの方法があります。また、歩道を追跡する2D配列を使用することもできますし、ピクセルベースの衝突やその他のさまざまなソリューションを使用することもできます。ポイントは何かを試して、あなたが立ち往生した場合は特定の質問と一緒にMCVEを投稿する必要があります、そして我々はそこから行くでしょう。がんばろう。