嗯......我的问题来自于诚实的生活品质偏好。我目前正在工作,所以我不能提供具体的代码;但是,我现在可以给出伪代码,并在我回家时提供实际的代码。
我创建了一个虚拟操纵杆,我希望将屏幕上的对象映射到math.atan2角度。
如果我使用obj.rotation = angle
,这非常有效。
我想要做的事情(并且整夜熬夜试图弄明白)是让对象的过渡顺利进入操纵杆角度,而不仅仅是等于它,这样就不会让人感到紧张。我能想到的唯一想法是得到2的delta并从delta / 4中减去obj.rotation。
大部分都有效,但是当math.atan2
的角度从359变为0时,它会让一切都变得混乱。
有没有人碰到这个和/或愿意帮助我?有没有办法让math.atan2吐出数字> 360?我已经在键盘上敲了很长时间。
非常感谢提前。
local function movePaddle(event)
local obj = right
local mMin = math.min;
local mCos = math.cos;
local mSin = math.sin;
local mAtan2 = math.atan2;
local mSqrt = math.sqrt;
local mFloor = math.floor;
local mPi = math.pi;
local radToDeg = 180/mPi;
local degToRad = mPi/180;
local radius = 40
if event.phase == "began" then
display.getCurrentStage():setFocus(obj)
--startMoveX = obj.x; startMoveY = obj.y;
local parent = obj.parent;
local posX, posY = parent:contentToLocal(event.x, event.y)
obj.x = posX; obj.y = posY;
local angle = (mAtan2( posX, posY )*radToDeg)-90;
local testAngle = angle + 360
--paddleAnchor:applyTorque(delta*100)
if angle < 0 then angle = 360 + angle end;
if angle > 360 then angle = angle - 360 end
if paddleAnchor.rotation < 0 then paddleAnchor.rotation = paddleAnchor.rotation + 360 end
if paddleAnchor.rotation > 360 then paddleAnchor.rotation = paddleAnchor.rotation - 360 end
local delta = (angle)-paddleAnchor.rotation
if delta < angle then
paddleAnchor.rotation = paddleAnchor.rotation + delta/5
elseif paddleAnchor.rotation > angle then
paddleAnchor.rotation = paddleAnchor.rotation - delta/5
end
print(delta)
local distance = mSqrt((posX*posX)+(posY*posY));
if distance >= radius then
local radAngle = angle*degToRad;
distance = radius;
obj.x, obj.y = distance*mCos(radAngle), - distance*mSin(radAngle)
else
obj.x, obj.y = posX, posY;
end
elseif event.phase == "moved" then
local parent = obj.parent;
local posX, posY = parent:contentToLocal(event.x, event.y)
obj.x = (event.x - event.xStart) + posX
obj.y = (event.y - event.yStart) + posY
local angle = (mAtan2( posX, posY )*radToDeg)-90;
--local testAngle = angle + 360
--if (paddleAnchor.rotation ~= -angle - 90) then
--if (paddleAnchor.rotation < -angle - 90) then
--paddleAnchor.rotation = (paddleAnchor.rotation + (-angle-90)/2)
-- elseif
--end
--paddleAnchor.rotation = -angle - 90
if angle < 0 then angle = angle +360 end;
if angle > 360 then angle = angle - 360 end
if paddleAnchor.rotation < 0 then paddleAnchor.rotation = paddleAnchor.rotation + 360 end
if paddleAnchor.rotation > 360 then paddleAnchor.rotation = paddleAnchor.rotation - 360 end
local testAngle = angle + 360
--if (-angle-90) >= 0 then angle = 270 end
local delta = angle-paddleAnchor.rotation
print(delta)
if paddleAnchor.rotation < angle then
paddleAnchor.rotation = paddleAnchor.rotation + delta/5
elseif paddleAnchor.rotation > angle then
paddleAnchor.rotation = paddleAnchor.rotation - delta/5
end
--paddleAnchor:applyTorque(delta)
local distance = mSqrt((posX*posX)+(posY*posY));
if distance >= radius then
local radAngle = angle*degToRad;
distance = radius;
obj.x, obj.y = distance*mCos(radAngle), -distance*mSin(radAngle)
else
obj.x, obj.y = posX, posY;
end
elseif event.phase == "ended" or event.phase == "cancelled" then
obj.y = obj.startMoveY
obj.x = obj.startMoveX
display.getCurrentStage():setFocus(nil)
end
return true
end
答案 0 :(得分:1)
atan2(y, x)
给出arg
的角度或参数x + i * y
。在具有正向的笛卡尔平面中。屏幕坐标不同。
两点之间的角度arg2 - arg1
是分数(x2+i*y2)/(x1+i*y1)
的参数。由于论证不依赖于实际的积极因素,因此这与
(x2+i*y2)*(x1-i*y1) = (x1*x2+y1*y2) + i*(x1*y2-y1*x2)
因此可以计算为
delta_angle = atan2(x1*y2-y1*x2, x1*x2+y1*y2)
因此,始终计算从最后位置(x1, y1)
到新位置(x2, y2)
的角度增量,并将其添加到总角度
angle += delta_angle.
这应该给出一个非跳跃角度测量。