2011-05-28 50 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