處理處理中的碰撞非常簡單。但是,如何確定與路徑的碰撞?例如:如果您願意,可以想象一下特朗的燈光循環,其中亮燈週期的軌跡不會消失。在Tron中,如果一個週期與另一個週期相交,而它本身包括在內,那麼它就會「死亡」。如何在Processing中有效地找到此事件?處理:與小徑碰撞
Q
處理:與小徑碰撞
1
A
回答
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以及一個特定的問題,如果你卡住了,我們會從那裏開始。祝你好運。
相關問題
- 1. 級碰撞。處理
- 2. Swiftkit碰撞處理
- 3. 並行處理碰撞對
- 4. 散列表碰撞處理
- 5. 處理碰撞實體
- 6. 球和磚碰撞處理
- 7. Threejs和處理碰撞
- 8. HashTables如何處理碰撞?
- 9. hibernate如何處理碰撞?
- 10. 碰撞後處理交易
- 11. 處理級聯碰撞?
- 12. 如何在檢測到碰撞後處理碰撞
- 13. SurfaceView與碰撞
- 14. Django slugified網址 - 如何處理碰撞?
- 15. LibGdx輸入處理和碰撞檢測
- 16. 跨平臺碰撞處理程序
- 17. 處理碰撞 - 陣列查找昂貴
- 18. 旋轉矩形碰撞處理
- 19. XNA碰撞時的處理得分
- 20. java遊戲 - 光滑 - 碰撞處理
- 21. 在box2djs碰撞事件處理程序
- 22. 碰撞處理...困惑去哪裏
- 23. 處理顏色碰撞檢測(java)
- 24. 無物理碰撞
- 25. WPF路徑碰撞檢測?
- 26. Java複雜路徑碰撞
- 27. 框與球碰撞
- 28. 與錨點碰撞
- 29. BOX2D - 與Monster碰撞
- 30. 問題與碰撞