SpriteKit SKFieldNode: почему я не могу переместить поле во время выполнения?
Я пытаюсь переместить SKFieldNode (radialGravity) во время выполнения:
let movingField = SKFieldNode.radialGravityField(
movingField.position = location //location is a touch position
addChild(movingField)
Он падает, как только я приказываю полевому узлу сменить положение. У меня нет проблем с размещением узла поля в статической позиции на didMoveToView.
Я предполагаю, что узлы SKFieldNode просто должны оставаться на месте, но, возможно, есть решение.
Основная идея состоит в том, чтобы прикрепить радиальные поля к спрайтам (к которым прикреплены физические тела), чтобы они имели взаимодействия притяжения / отталкивания. Я понимаю, что это можно сделать с помощью более ручного подхода, но я пытался воспользоваться преимуществами физики, доступной в SpriteKit.
Спасибо!
2 ответа
Я могу легко перемещать узлы поля, заставляя их перемещаться в соответствии с сенсорными событиями. Работает отлично.
Внутри GameScene.m
-(void)didMoveToView:(SKView *)view {
/* Setup your scene here */
self.backgroundColor = SKColorWithRGB(0, 0, 0);
// This uses SKTUtils to load my simple SKEmitter
SKEmitterNode *nd = [SKEmitterNode skt_emitterNamed:@"bokeh"];
nd.particleZPosition += 100;
nd.position = CGPointMake(self.size.width/2,self.size.height/2);
nd.fieldBitMask = 1;
field = [SKFieldNode radialGravityField];
field.position = CGPointMake(self.size.width/2,self.size.height/2);;
field.minimumRadius = 50;
field.categoryBitMask = 1;
[self addChild:field];
[self addChild:nd];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint t = [touch locationInNode:self];
field.position = t;
}
В моем приложении у меня очень похожий подход, как у вас. Я могу установить новые позиции узлов поля просто отлично. Вот выдержка:
// _targetPos is the touch location in UIView coordinates
CGPoint pos = [k.world convertToScenePoint:_targetPos]; // convert to scene coordinates
self.gravityField.position = pos;
self.dragField.position = pos;
Я могу только предположить, что упомянутый вами сбой произошел где-то еще в вашем коде. Какую строку кода показывает Xcode при сбое вашего приложения?