所以我試圖在圓形玩家和塗鴉遊戲中的一條線(使用as3)之間進行碰撞檢測。爲此,我知道3個點,線的端點和包含圓的圖像的左上角。在隨筆畫遊戲中碰撞檢測的錯誤
//Detects collision between a given player and a given line
public function detectCollision(p:Player, l:Line): Boolean{
//First create a line running parallel to l that runs through the center of p
//p hereby referred to by "the player"
//l hereby referred to by "the offending line"
//start by finding the center of p
var pCenter:Point = new Point(p.x + 38, p.y + 38); //38 = radius
//now find the angle of the offending line (in Q1 or Q2)
var theta:Number = Math.atan2(l.y2 - l.y1, l.x2 - l.x1);
//now make a line within the player that conforms to this angle
var paraLine:Line = new Line(pCenter.x - Math.cos(theta) * 38, pCenter.y - Math.sin(theta) * 38, pCenter.x + Math.cos(theta) * 38, pCenter.y + Math.sin(theta) * 38);
//Next we're going to create a perpendicular line in the circle pointing at the offending line
var perpenLine:Line = new Line(pCenter.x - Math.cos(theta) * 38, pCenter.y + Math.sin(theta) * 38, pCenter.x + Math.cos(theta) * 38, pCenter.y + Math.sin(theta) * 38);
var closestOnCircle:Point = new Point(pCenter.x - Math.cos(theta) * 38, pCenter.y + Math.sin(theta) * 38); //this is the point on the circle closest to the offending line
//Now to find where the line running perpendicular to the offending line through the center of the player intersects with the offending line
//this is done by using algebra
//y = mx + b (perpenLine)
//y = nx + c (offending line)
//mx + b = nx + c
//b - c = (n - m)x
//x = (b - c)/(n - m)
var xIntercept:Number = (perpenLine.getOffset() - l.getOffset())/(l.getSlope() - perpenLine.getSlope());
var pointOnLine:Point = new Point(xIntercept, xIntercept * l.getSlope() + l.getOffset()); //point on the line where the intersection happens
//Finally whether a collision has occurred is calculated
//this is done by seeing if both pCenter and closestOnCircle are on the same side of pointOnLine
if((pCenter.y > pointOnLine.y && closestOnCircle.y > pointOnLine.y) || (pCenter.y < pointOnLine.y && closestOnCircle.y < pointOnLine.y))
return false;
else
return true;
}
該代碼有點複雜,我不擅長三角學,我一直無法找出它爲什麼不工作。播放器從屏幕頂部開始,線出現的那一刻它會記錄一次碰撞。如果有任何問題,請問,我真的很想弄清楚。提前致謝。
我在解決xi和yi這兩個方程時遇到了問題,你能否提供一個解決這個問題的方案? – avorum
劃痕,讓它工作。感謝您的幫助,就像魅力一樣。 – avorum