2017-03-19 2 views
1

프로세싱에서 충돌을 처리하는 것은 간단합니다. 그러나 트레일과의 충돌을 어떻게 식별 할 수 있습니까?프로세싱 : 트레일과의 충돌

예 : 원하는 경우 재조정 된 빛 사이클의 흔적이 사라지지 않도록 Tron에서 빛의 순환을 상상해보십시오. Tron에서주기가 어떤 지점과 교차하는 경우, 그 자체가 포함 된 다른주기가 이제까지 있었던 것이며, 그것은 '죽습니다'. 처리에서이 이벤트를 효율적으로 찾으려면 어떻게해야합니까?

답변

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

개념은 뱀/Volfied/등 자기 교차점을 확인

같은 방법 게임에서 서로 다른되지 않습니다 : 이미 목록 (충돌)에 속해 있는지3210

참고 작은 속도로 키의 "커서"를 업데이트하여 약간의 부정 행위가 있습니다. 이는 줄의 틈을 피합니다. 마우스로 교체하려고하면 마우스가 빠르게 움직이면 충돌 체크가 실패 할 수 있습니다. 한 지점을 기록 된 포인트 목록과 비교하여 검사합니다. 다른 방법으로는 포인트 목록을 라인 쌍으로 나눠서 새 포인트가 교차하는지 검사 할 수 있습니다.

이 내용도 확인하시기 바랍니다. similar question

-2

스택 오버플로는 일반적으로 "어떻게해야합니까?"형식 질문을 위해 설계되지 않았습니다. 구체적으로 "나는 X를 시도했는데 예상 Y이지만 Z를 대신 입력"했습니다. 즉, 나는 일반적인 의미로 돕기 위해 노력할 것입니다.

플레이어가 돌아간 모든 지점을 ArrayList 형태로 사이클에 의해 형성된 라인을 추적 할 수 있습니다. 그런 다음 각 단계에서 플레이어가 해당 라인과 교차하는지 확인할 수 있습니다.

보다 구체적으로, 이전 플레이어 좌표와 다음 플레이어 좌표 사이에 다른 행을 추가하고자 할 수 있습니다. 그런 다음 Google 검색 또는 2를 통해 찾을 수있는 수식을 사용하여 그 행이 다른 행과 교차하는지 확인하십시오.

매우 큰 경기장 (수백만 줄과 같이)에 대해 이야기하지 않는 한 그보다 더 똑똑하지 않아도됩니다. 효율성에 대해 물어 보는 것은 조금 일찍입니다.

물론 다른 많은 방법으로 문제에 접근 할 수 있습니다. 트레일을 추적하는 2D 배열을 사용하거나 픽셀 기반 충돌 또는 기타 여러 가지 솔루션을 사용할 수 있습니다. 요점은 당신이 뭔가를 시도하고 붙어 얻을 경우 특정 질문과 함께 MCVE 게시, 우리는 거기에서 갈거야. 행운을 빕니다.