2011-05-28 48 views
3

我剛開始學習iphone開發,在朋友推薦Corona SDK以方便使用後,我終於決定嘗試一下。計算一個圓形包裝?

現在,我剛開始學習如何使用加速計和繪圖形狀,並通過傾斜設備來移動它們。所以我認爲我可以製作一個關卡工具作爲我的第一個應用程序,並且在傾斜時我可以使用所有工具,但現在我決定嘗試製作一個平坦的關卡,但我無法弄清楚如何讓泡泡留在一個圓圈內。

繼承人我如何限制氣泡從瓶外移動在水平位置:

function bubbleBounds() 
    -- left side 
    if bubble.x < (_W/2 - vial.width/2 + bubble.width/2) then 
     bubble.x = (_W/2 - vial.width/2 + bubble.width/2) 
    end 

      -- right side 
    if bubble.x > (_W/2 + vial.width/2 - bubble.width/2) then 
     bubble.x = (_W/2 + vial.width/2 - bubble.width/2) 
    end 
    end 

據我瞭解,你應該總是讓圖像與2的冪,所以我做了一個圓圈,直徑256像素,我的泡泡是64像素。我如何編寫一個限制氣泡移出圓圈的函數?

感謝 辛迪


@Mac,我知道的圖標大小,但2的冪遊戲優化內存只是使用了吧?

@Tim C;

所以,如果我這樣寫我的界限功能;

local bubbleRadius = 32 
local circleRadius = 128 
local sqrt = math.sqrt 
local centerX = display.contentWidth/2; 
local centerY = display.contentHeight/2; 

local function bubbleBounds() 
     Length = sqrt(centerX * centerX + centerY * centerY) 
     normalizedX = centerX/Length; 
     normalizedY = centerY/Length; 

     limitedX = normalizedX * circleRadius; 
     limitedY = normalizedY * circleRadius; 

     if bubble.x < centerX - limitedX + bubbleRadius then 
      bubble.x = centerX - limitedX + bubbleRadius 
     end 

     if bubble.x > centerX + limitedX - bubbleRadius then 
      bubble.x = centerX + limitedX - bubbleRadius 
     end 

     if bubble.y < centerY - limitedY + bubbleRadius then 
      bubble.y = centerY - limitedY + bubbleRadius 
     end 

     if bubble.y > centerY + limitedY - bubbleRadius then 
      bubble.y = centerY + limitedY - bubbleRadius 
     end 

end 
Runtime:addEventListener("enterFrame", bubbleBounds) 

但現在,當我運行這個它是長方形的包裝,而不是一個圓圈,加速度計還充當真正奇怪和laggy。以下是我如何設置加速度計:

local acc = {} 

function acc:accelerometer(event) 
     bubble.x = centerX - (centerX * event.yGravity * 2); 

    bubble.y = centerY - (centerY * event.xGravity * 2); 
    end 
    Runtime:addEventListener("accelerometer", acc) 

這是哪裏出錯了?

+0

多達保持圖像冪的兩個維度是偉大的,運氣好堅持在iPhone上:圖標爲57x57像素,小圖標29x29像素,等等...... :) – Mac 2011-05-28 05:13:48

+0

請不要*使用解答發佈更新或提出更多問題。堆棧溢出不是一個論壇。要麼更新您的問題,要麼對現有答案添加評論。謝謝。 – Kev 2011-05-28 15:58:41

+0

@Kev,對不起。 – 2011-05-29 10:41:07

回答

1

此處需要的是計算從圓心到氣泡對象的向量,並將運動限制爲永遠不超過圓的半徑。

要做到這一點,從你的圓心到氣泡物體的矢量,規範化它,然後乘以圓的半徑。這將以與原始角度相同的角度出現在一個新的矢量中,但僅限於圓的範圍內。

例如,假設圓的中心是0,0,並且氣泡的位置是x,y。

僞代碼:

Length = sqrt(x*x + y*y); //pythagorean theorem 

normalizedX = x/Length; 
normalizedY = y/Length; 

limitedX = normalizedX * circleRadius; 
limitedY = normalizedY * circleRadius; 

此外,爲了防止泡沫破裂圓的界限可言,你應該使用圓的半徑減去泡沫作爲限制半徑半徑。


在看過新發布的代碼之後,問題似乎在於如何實現數學。

首先,長度計算應該是針對氣泡的矢量,而不是針對中心點的。
其次,你仍然單獨檢查每個軸上的邊界與半徑的關係。這將始終導致一個矩形邊界框,除非您完全基於來自中心的矢量的長度。

嘗試這樣的事情,而不是:

local bubbleRadius = 32; 
local circleRadius = 128; 
local sqrt = math.sqrt; 
local centerX = display.contentWidth/2; 
local centerY = display.contentHeight/2; 

local function bubbleBounds() 

    bubbleX = bubble.x - centerX; 
    bubbleY = bubble.y - centerY; 

    Length = sqrt(bubbleX * bubbleX + bubbleY * bubbleY); 

    normalizedX = bubbleX/Length; 
    normalizedY = bubbleY/Length; 

    if Length > circleRadius then 
     bubbleX = normalizedX * circleRadius; 
     bubbleY = normalizedY * circleRadius; 
     bubble.x = bubbleX + centerX; 
     bubble.y = bubbleY + centerY; 
    end 
end 
+0

謝謝。我從理論上了解數學,但如何將其轉化爲代碼是問題所在。我嘗試過,但沒有按照我的希望播放,我做錯了什麼? – 2011-05-28 13:46:09

+0

我編輯了我的帖子,以進一步回答你的問題...希望這個澄清的事情。 – 2011-05-28 16:23:04

+0

好的,謝謝蒂姆。這澄清了整個事情,現在它都是有道理的。再次感謝。 – 2011-05-28 17:28:00