2017-03-19 79 views
1

處理處理中的碰撞非常簡單。但是,如何確定與路徑的碰撞?例如:如果您願意,可以想象一下特朗的燈光循環,其中亮燈週期的軌跡不會消失。在Tron中,如果一個週期與另一個週期相交,而它本身包括在內,那麼它就會「死亡」。如何在Processing中有效地找到此事件?處理:與小徑碰撞

回答

2

一個詭祕的解決方法是將線繪製到PImage中,並檢查某個位置的顏色是否與背景相同(例如,預先存在的線,因此是碰撞)。

這裏的概念的粗略(略低效(由於get()/set()電話)證明:

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

類似的概念可以跟蹤點的列表,並檢查可以做,如果一個新的起點已在該列表(碰撞)的一部分,或者不是:

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檢查自相交

不同。

注意我在小鍵盤上更新鍵盤上的「光標」會導致作弊:這樣可以避免線條間的空隙。如果您嘗試用鼠標替換,您會注意到,如果鼠標移動速度較快,碰撞檢查可能會失敗,因爲它會根據記錄點列表檢查一個點。另一種方法可能是將點列表分成兩行,並檢查新點是否與其中的任何點相交。您可能還想檢查此similar question

-2

堆棧溢出不是真的爲一般的「我該怎麼做」類型的問題而設計的。這是針對具體的「我試過X,預計Y,但得到Z」類型的問題。這就是說,我會盡力在一般意義上提供幫助。

您可能只需跟蹤循環所形成的線條,其形式爲球員轉身的所有積分的ArrayList。然後在每一步中,您都可以檢查玩家是否與其中任何一條線相交。

更具體地說,您可能想要在上一個玩家座標和下一個玩家座標之間形成另一條線。然後檢查這條線是否與其他線路相交,使用公式,我相信您可以通過谷歌搜索或兩個公式找到。

除非你在談論非常大的遊戲場(如在數百萬行),否則你可能不需要做任何比這更聰明的事情。因此,詢問效率有點早。

當然有許多其他方法來解決這個問題。您也可以使用跟蹤路徑的二維數組,也可以使用基於像素的碰撞,或者使用任意數量的其他解決方案。關鍵是你需要嘗試一些東西,併發佈一個MCVE以及一個特定的問題,如果你卡住了,我們會從那裏開始。祝你好運。