好的,我有一个node.size为(5,5)矩形的节点。它的位置是(100,100),它的锚点是默认值(0.5,0.5)。
我试图找到最右边的点,但仍然是Y的中心。当然,这返回了点(102.5,100)。太棒了。我通过简单地使用CGPointMake(node.position + node.size.width/2, node.position);
这很好用,但问题是我想要在知道那个点的同时旋转节点。我想知道他们是否可以使用节点zRotation进行某种数学计算,以便在旋转后找到新点(节点框架上的相同点)。
为了清楚起见,我想知道最初102.5,100的点在节点旋转之后的位置。
非常感谢你们所有的答案
答案 0 :(得分:2)
设 r 是从精灵的锚点到感兴趣点的距离。在你的情况下,
r = sqrt(dx*dx+dy*dy) = 2.5;
其中 dx = 2.5且 dy = 0。
另外,设θ为旋转角度,最初为零。我们现在在极坐标中有一个点( r , theta ),它代表点(2.5,0)。我们现在可以通过改变θ来旋转关于精灵的锚点的点。旋转精灵后,我们将( r , theta )转换为笛卡尔坐标
x = r * cos(theta);
y = r * sin(theta);
并添加精灵的位置以将点转换为场景坐标。
x = x + sprite.position.x;
y = y + sprite.position.y;
编辑:我认为这就是您要实施的目标。
@interface MyScene()
@property SKSpriteNode *object1;
@property SKSpriteNode *object2;
@end
@implementation MyScene
-(id)initWithSize:(CGSize)size
{
if(self = [super initWithSize:size]) {
_object1 = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(10,5)];
_object1.position = CGPointMake(100, 100);
[self addChild:_object1];
SKAction *wait = [SKAction waitForDuration: 2.5f];
SKAction *rotate = [SKAction rotateByAngle:3*M_PI/4 duration:2.0f];
SKAction *addObject = [SKAction runBlock:^{
_object2 = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(10,5)];
_object2.zRotation = _object1.zRotation;
CGFloat dx = _object1.size.width / 2;
CGFloat dy = 0;
CGFloat r = sqrtf(dx*dx + dy*dy);
CGFloat x = r*cosf(_object1.zRotation);
CGFloat y = r*sinf(_object1.zRotation);
_object2.position = CGPointMake(_object1.position.x + 2*x, _object1.position.y + 2*y);
[self addChild:_object2];
}];
SKAction *seq = [SKAction sequence:@[wait, rotate, addObject]];
[_object1 runAction:seq];
}
return self;
}
答案 1 :(得分:0)
好的,我必须发布代码,所以我必须回答这个问题。
所以我尝试了你的方法0x141E,它运行得很好。我遇到的唯一问题是,每当角度不是0.5PI的倍数时,似乎计算不正确。也许它只是我编码它的方式。我的代码的目标是通过测量一个对象的最左边,中间点与最右边的其他对象,中间点之间的距离来将一个对象放在另一个对象旁边。这样他们就会触及右侧的左侧......基本上是并排的。我先放置一个对象,然后使用给定的算法添加第二个对象,但是我上面说的结果在可以被0.5 PI整除的角度之间得到了一点点时髦。这就是我所做的,如果您想直接将代码导入XCode,如果您想看到我在说什么(我很抱歉,但我没有足够的代表来附加图片,或者我会给出截图):
//This is the MyScene implementation file
@interface MyScene()
{
SKSpriteNode *_object1;
SKSpriteNode *_object2;
}
@end
@implementation MyScene
-(id)initWithSize:(CGSize)size
{
if(self = [super initWithSize:size]
{
object1 = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(10,5)];
[self addChild:object1];
//The wait is just to make it feel smoother and not so sudden when starting up the simulator
SKAction *wait = [SKAction waitForDuration: 2.5f];
SKAction *rotate = [SKAction rotateByAngle:0.25*M_PI duration:2.0f];
SKAction *addObject = [SKAction runBlock:^{
_object2 = [spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(10,5)];
//I set the rotation of the second object to the rotation of the first so they will always be touching side-by-side
_object2.zRotation = _object1.zRotation;
//I used the full width and heigth rather than half to save time. The two ojects are of equal width and height so instead of finding both distances and adding them together I just doubled the distance
CGFloat r = sqrtf(_object2.frame.size.width*_object2.frame.size.width+_object2.frame.size.height*_object2.frame.size.height);
CGFloat x = r*cosf(_object2.zRotation);
CGFloat y = r*sinf(_object2.zRotation);
object2.position = CGPointMake(_object2.position.x + x, _object2.position + y);
[self addChild:_object2];
}
SKAction *seq = [SKAction sequence:@[wait, rotate, addObject]];
[self runAction:seq];
}
}
@end
到目前为止,再次感谢您提供的所有帮助,并感谢您对未来的所有帮助。