2014-10-09 21 views
5

Mam SKShapeNode (w tym przypadku prostokąt), które próbuję obrócić wzdłuż jego środka. Obraca się jednak wzdłuż lewego dolnego punktu ekranu. Ponieważ nie mogę ustawić punktu zakotwiczenia dla SKShapeNode, jak mogę osiągnąć moje wymaganie (aby obrócić kształt wzdłuż jego środka). To jest kod, który próbuję.Obracanie SKShapeNode wzdłuż jego środka

let rectangle = SKShapeNode() 
    rectangle.path = UIBezierPath(rect: CGRectMake(view.frame.width/4, view.frame.height/2, view.frame.width/2, view.frame.width/2)).CGPath 
    rectangle.fillColor = UIColor.yellowColor() 
    rectangle.strokeColor = UIColor.yellowColor() 

    let oneRevolution = SKAction.rotateByAngle(360, duration: 100.0) 
    let repeat = SKAction.repeatActionForever(oneRevolution) 
    rectangle.runAction(repeat) 

enter image description here

Odpowiedz

1
SKSpriteNode rectangle = [SKSpriteNode spriteWithSize size: CGSizeMake(20,20)]; 

Można dokonać tego samego prostokąta jako spriteNode, która daje dostęp do zmiany Anchorpoint. Moja składnia może być nieco inna, ale uważam, że może ona również przyjąć kolor w konstruktorze.

+1

poprawione pytanie. –

0

Podczas tworzenia SKShapeNode trzeba ustawić go centrum w ten sposób:

let shapePath = UIBezierPath(...) 
... 
...    
let shape = SKShapeNode(path: shapePath.cgPath, centered: true) 

ten sposób punkt kotwicą SKShapeNode będzie punkt środkowy.

0

Musimy wyraźnie wyśrodkować SKShapeNode przed zastosowaniem rotacji.

import SpriteKit 
    import PlaygroundSupport 

    let bounds = CGRect(x: 0, y: 0, width: 400, height: 200) 
    let skview = SKView(frame: bounds) 

    PlaygroundPage.current.liveView = skview 

W przykładach I i II poniżej, odbywa się to przez ustawienie x i y parametrów podczas inicjalizacji prostokąta, a następnie ustawienie właściwości położenia.

let first = SKShapeNode(rect: CGRect(x:-20, y:-20, width: 40, height: 40)) 
    first.position = CGPoint(x: 70, y: 30) 


    let second = SKShapeNode(rect: CGRect(x:-20, y:-20, width: 40, height: 40)) 
    second.position = CGPoint(x: 70, y: 30) 
    second.zRotation = CGFloat.pi * 0.15 
    second.strokeColor = .red 

W trzecim przykładzie powyżej, odbywa się to przez ustawienie centered do true podczas inicjowania kształt, a następnie ustawienie właściwości położenia.

let path = CGMutablePath(); 
    path.move(to: CGPoint(x: 50,y: 10)) 
    path.addLine(to: CGPoint(x: 90, y: 10)) 
    path.addLine(to: CGPoint(x: 90, y: 50)) 
    path.addLine(to: CGPoint(x: 50, y: 50)) 
    path.addLine(to: CGPoint(x: 50, y: 10)) 

    let third = SKShapeNode(path: path, centered: true); 
    third.position = CGPoint(x: 70,y: 30); 
    third.zRotation = CGFloat.pi * 0.35 
    third.strokeColor = .yellow 

    let scene = SKScene(size: CGSize(width: 400, height: 200)) 
    scene.scaleMode = SKSceneScaleMode.aspectFill 
    scene.size = skview.bounds.size 
    scene.addChild(first); 
    scene.addChild(second); 
    scene.addChild(third); 
    skview.presentScene(scene);