gpt4 book ai didi

iphone - 计算圆形 wrapper ?

转载 作者:行者123 更新时间:2023-12-03 20:08:44 24 4
gpt4 key购买 nike

我刚刚开始学习 iPhone 开发,在 friend 推荐 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 的幂只是在游戏中用于内存优化,对吗?

@蒂姆·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)

但是现在当我运行它时,它是矩形包装而不是圆形,加速度计也表现得非常奇怪和滞后。以下是我设置加速度计的方法:

    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,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

关于iphone - 计算圆形 wrapper ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6158915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com