我试图重新创建的是在流行的iOS游戏“Fragger”中使用的可拖动箭头,同时根据手指拖动同时调整旋转和拉力的强度完成SpriteKit - 我相信他们是在Cocos2D中做到的。
我首先要说的是,我真的花了很多时间重新学习三角学(http://www.mathsisfun.com/是一个很好的资源)并通过Ray Wenderlich的教程(http://www.raywenderlich.com/35866/trigonometry-for-game-programming-part-1)进行梳理,但我找不到一个用于在SpriteKit对象上执行“集体”拖动旋转和强度的解决方案。
是的,设置一个锚点并旋转那个对象(我正在使用一个箭头)相对容易,所以它指向你的手指,感谢Ray,我有一个非常顺利的动作,利用以下内容: / p>
float angleRadians = atan2f(firstFingerTouchY - _arrow.position.y, firstFingerTouchX - _arrow.position.x);
float angleDegrees = RADIANS_TO_DEGREES(angleRadians);
float rotateDegreesPerSecond = 180 / 0.5; // Would take 0.5 seconds to rotate 180 degrees, or half a circle
float degreesDiff = (angleCurrent - angleDegrees) * 1.0;
float rotateDuration = fabs(degreesDiff / rotateDegreesPerSecond);
然而,这只是等式中的一部分...
同样,第一次拖动很好,因为旋转角度来自箭头的支点(它的锚点)以及我的手指最终的位置。但是,让我们说由于屏幕尺寸的限制,我无法在一次拖动中获得我想要的角度,所以我抬起手指然后将其放回以继续拖动?好吧,我不能使用上面提到的代码,因为只要我第二次放下手指,箭头的旋转就跳到我的手指现在开始的位置 - 再次以相同的方式结束。
所以我认为解决方案是根本不使用箭头的锚点,而是使用初始手指接触点(作为新锚点)并根据该接触点计算箭头的角度以及我的手指移动的位置至?这在理论上是有效的,但是当你试图考虑在“Fragger”中表示的“强度抽取”方面(将手指拉近或远离箭头调整手榴弹投掷的强度),那么你就是不要将手指移向箭头以削弱拉力,而是朝向最初触摸的位置 - 这不仅在视觉上很困难,而且当你的手指靠近原点时,奖励会产生很多旋转的生涩感。 / p>
我现在已经工作了大约一个月了(我提到我讨厌数学)试图创造一种同质化的方法(SIN ... COS ... TAN ...我讨厌你们所有人!)来执行以下操作:
如果您曾经玩过“Fragger”游戏,那么您将会发现这种单指动作的复杂性,这也是它的功能之美。我可以让它的部分工作 - 我可以旋转它,我可以调整颜色掩码来指示强度 - 但不是所有它一起工作。也许我认为它完全错了,但是我在网上找到的每一个例子都停在简单地旋转一个物体指向你的手指,每一个新的触摸拖动都以相同的结果结束。