当用户点击屏幕时,如何更改代码以使Sprite沿圆形轨道旋转,跳上然后又跳下?

时间:2019-01-11 18:47:52

标签: ios sprite-kit rotation

我正在尝试使我的橙色圆形精灵以圆周运动运行,在其旋转的蚂蚁点跳动,并在用户点击屏幕但又似乎无法弄清我的目标时再次掉落我做错了。请帮忙。

我已经尝试过将建议带到这里类似的职位,但是没有运气。

from dynamodb_layer.customer import CustomerManager

预期结果将是一个称为播放器的小圆圈精灵,该圆圈围绕一个称为“精灵”的较大圆圈绕圆形轨道旋转,当用户点击屏幕时,播放器(小圆圈)会在其任意位置跳升然后下移实际结果是,圆绕着较大的圆旋转,但是当我在iPhone模拟器中单击屏幕时,圆并没有跳起来。

1 个答案:

答案 0 :(得分:0)

跳跃状态需要记录为:isJumpping。如果是isJumpping,则更新将无法执行。

第二个问题是,在进行修饰之后,玩家会回到轨道上。当玩家直接落到圆圈上时,这里给出一个简单的数学运算。

但是,如果情况很复杂,则可以考虑使用PhysicsField来模拟情况。

它正在Xcode 10和游乐场中运行

import UIKit
import PlaygroundSupport
import SpriteKit
import simd

class GameScene: SKScene {
let sprite = SKSpriteNode(imageNamed: "circle")

let player = SKSpriteNode(imageNamed: "player")
var node2AngularDistance: CGFloat = 0

override func didMove(to view: SKView) {
    print(100)
  //  backgroundColor = SKColor(red: 94.0/255, green: 63.0/255, blue: 107.0/255, alpha: 1)
     backgroundColor = SKColor.black

    physicsWorld.gravity = CGVector(dx: 0, dy: 0)
    sprite.size = CGSize(width: 150, height: 150)
    sprite.position = CGPoint(x: 0,y: 0)
    sprite.physicsBody = SKPhysicsBody(circleOfRadius: 10)
    player.size = CGSize(width: 100, height: 100)
    player.position = CGPoint(x: 0+50, y: 0)
    player.physicsBody = SKPhysicsBody(circleOfRadius: 10)
    self.anchorPoint = CGPoint.init(x: 0.5, y: 0.5)
    self.addChild(sprite)
    self.addChild(player)
}

//dont touch blue lines that discard code and don't allow you to undo

override func update(_ currentTime: TimeInterval) {

    guard  !isJumpping else {

        return
    }

    let dt: CGFloat = 1.0/60.0 //Delta Time
    let period: CGFloat = 3 //Number of seconds it takes to complete 1 orbit.
    let orbitPosition = sprite.position //Point to orbit.
    let orbitRadius = CGPoint(x: 150, y: 150) //Radius of orbit.


   let currentDistance = distance(double2(x: Double(orbitPosition.x), y: Double(orbitPosition.y)), double2(x: Double(player.position.x), y: Double(player.position.y)))
    if (  currentDistance > 150){

        player.physicsBody!.velocity = CGVector(dx:(orbitPosition.x - player.position.x) ,dy:(orbitPosition.y - player.position.y));

        let x = Double(player.position.x) - Double(orbitPosition.x)
        let y = Double(player.position.y) - Double(orbitPosition.y)
        self.node2AngularDistance = CGFloat(acos(x/currentDistance))

   if y < 0 {

    self.node2AngularDistance = 2 * CGFloat.pi -  self.node2AngularDistance }

        return;
    }



    let normal = CGVector(dx:orbitPosition.x + CGFloat(cos(self.node2AngularDistance))*orbitRadius.x ,dy:orbitPosition.y + CGFloat(sin(self.node2AngularDistance))*orbitRadius.y);


    self.node2AngularDistance += (CGFloat(Double.pi)*2.0)/period*dt;
    if (abs(self.node2AngularDistance)>CGFloat(Double.pi)*2) {
        self.node2AngularDistance = 0
    }

    player.physicsBody!.velocity = CGVector(dx:(normal.dx-player.position.x)/dt ,dy:(normal.dy-player.position.y)/dt);



    //func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
    //sprite.position = (touches.first! as! UITouch).location(in: self)
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for t in touches { self.touchDown(atPoint: t.location(in: self)) }
}

func touchDown(atPoint pos: CGPoint) {
    jump()
}
private var isJumpping : Bool = false
func jump() {
    isJumpping.toggle()
    player.texture = SKTexture(imageNamed: "player")
    player.physicsBody?.applyImpulse(CGVector(dx: (self.player.position.x - self.sprite.position.x) / 100.0, dy: (self.player.position.y - self.sprite.position.y) / 100.0))
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

    for t in touches { self.touchUp(atPoint: t.location(in: self)) }
}

func touchUp(atPoint pos: CGPoint) {
    isJumpping.toggle()
    player.texture = SKTexture(imageNamed: "player")
}
}




class GameViewCointroller: UIViewController{

    var skview: SKView!



  override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    skview = SKView.init(frame: view.bounds)
    let scene = GameScene.init(size: view.frame.size)
    skview.presentScene(scene)
    view.addSubview(skview)
   }


}

PlaygroundPage.current.liveView = GameViewCointroller()