如何使用swift在sprite kit中旋转sprite [英] How to rotate sprite in sprite kit with swift

查看:147
本文介绍了如何使用swift在sprite kit中旋转sprite的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题是关于两个精灵的旋转。当我触摸屏幕的右半部分时,旋转开始并移动sprite2和sprite3。如果我触摸屏幕的左半部分,旋转会停止,因为速度 - 速度= 0.如果我再次触摸左半部分,旋转开始。

Hi my problem is regarding the rotation of two sprites. When I touch the right half of the screen the rotation starts and moving sprite2 and sprite3. If I touch the left half of the screen the rotation stops because velocity-velocity = 0. If I touch the left half again the rotation begins.

但是,如果我触摸与当前旋转方向相对应的屏幕的一半,则速度会重复。我希望能够改变旋转方向,但速度保持不变。

However, if I touch the half of the screen corresponding with the current rotational-direction the velocity is duplicated. I want to be able to change the direction of the rotation, but for the speed to remain constant.

视频演示问题: http://youtu.be/HxLwl1QZiNM

import SpriteKit

class GameScene: SKScene {
    let sprite = SKSpriteNode(imageNamed:"bWhite")
    let sprite2 = SKSpriteNode(imageNamed:"bBlue")
    let sprite3 = SKSpriteNode(imageNamed:"bRed")
    let circle = SKSpriteNode(imageNamed:"bCircle")       

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */
        backColor = SKColor(red: 0, green: 0, blue: 0, alpha: 1)
        self.backgroundColor = backColor

        sprite.setScale(1.25)
        sprite2.setScale(1)
        sprite3.setScale(1)
        sprite.position = CGPointMake(self.frame.size.width/2, (self.frame.size.height/2)-200);
        circle.position = CGPointMake(self.frame.size.width/2, (self.frame.size.height/2)-200);
        sprite3.zRotation = 172.77
        sprite2.anchorPoint = CGPointMake(-1.10, 0.5);
        sprite3.anchorPoint = CGPointMake(-1.10, 0.5);

        self.addChild(sprite)
        self.addChild(circle)
        sprite.addChild(sprite2)
        sprite.addChild(sprite3)
    }

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        /* Called when a touch begins */
        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)

            let action = SKAction.rotateByAngle(CGFloat(M_PI), duration:1)
            let action2 = SKAction.rotateByAngle(CGFloat(-M_PI), duration:1)

            if (location.x > self.frame.size.width / 2)
            {
                sprite2.runAction(SKAction.repeatActionForever(action2))
                sprite3.runAction(SKAction.repeatActionForever(action2))
            } else {
                sprite2.runAction(SKAction.repeatActionForever(action))
                sprite3.runAction(SKAction.repeatActionForever(action))
            }     
        }
    }


推荐答案

好的,拿三个。我不是100%确定旋转何时应该结束的具体细节等等,但所有部分都应该使用下面的代码。它将:

OK, take three. I'm not 100% sure about the specifics of when the rotation should end etc. but all the pieces should be in place with the below code. It will:


  • 根据第一次触摸的位置顺时针或逆时针开始旋转

  • 停止

  • 如果用户触摸屏幕的另一半,则切换旋转

  • start rotation clockwise or counterclockwise based on the position of the first touch
  • stop the rotation if the user touches for the same direction again
  • switch the rotation if the user touches on the other half of the screen

  import SpriteKit  

  enum rotationDirection{
       case clockwise
       case counterClockwise
       case none
   } 

  class GameScene: SKScene {
    var currentRotationDirection = rotationDirection.none
    let sprite = SKSpriteNode(color: UIColor.yellowColor(), size: CGSizeMake(100, 100))

    override func didMoveToView(view: SKView) {
      sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
      sprite.physicsBody.affectedByGravity = false
      sprite.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
      self.addChild(sprite)
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
      let touch : UITouch = touches.anyObject() as UITouch
      let touchPosition = touch.locationInNode(self)
      let newRotationDirection : rotationDirection = touchPosition.x < CGRectGetMidX(self.frame) ? .clockwise : .counterClockwise

      if currentRotationDirection != newRotationDirection && currentRotationDirection != .none{
        reverseRotation()
        currentRotationDirection = newRotationDirection
      } else if currentRotationDirection == newRotationDirection{
        stopRotation()
        currentRotationDirection = .none
      } else if (currentRotationDirection == .none){
      setupRotationWith(direction: newRotationDirection)
      currentRotationDirection = newRotationDirection
      }
    }

    func reverseRotation(){
      let oldRotateAction = sprite.actionForKey("rotate")
      let newRotateAction = SKAction.reversedAction(oldRotateAction)
      sprite.runAction(newRotateAction(), withKey: "rotate")
    }

    func stopRotation(){
      sprite.removeActionForKey("rotate")
    }

    func setupRotationWith(#direction: rotationDirection){
      let angle : Float = (direction == .clockwise) ? Float(M_PI) : -Float(M_PI)
      let rotate = SKAction.rotateByAngle(angle, duration: 1)
      let repeatAction = SKAction.repeatActionForever(rotate)
      sprite.runAction(repeatAction, withKey: "rotate")
    }
  }


编辑:更改示例以满足问题中的特定需求。有些奇怪的代码格式不太确定那里发生了什么。

Changed example to cater the specific needs in the question. Something odd with the code formatting not quite sure what's going on there.

这篇关于如何使用swift在sprite kit中旋转sprite的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆