如何沿操纵杆度数的方向运行 SKAction



我正在创建一个游戏,但我很难让子弹朝操纵杆的方向射出。这是我的子弹的方法

func spawnBullets(){
    let bullet = SKSpriteNode(imageNamed: "bullet.png") 
    bullet.zPosition = -5
    bullet.position = CGPointMake(hero.position.x, hero.position.y)        
    bullet.xScale = 0.25
    bullet.yScale = 0.25
    bullet.physicsBody = SKPhysicsBody(rectangleOfSize: bullet.size)
    bullet.physicsBody?.categoryBitMask = PhysicsCategory.bullet
    bullet.physicsBody?.contactTestBitMask = PhysicsCategory.enemy
    bullet.physicsBody?.affectedByGravity = false
    bullet.physicsBody?.dynamic = false
    let action = SKAction.moveToY(self.size.height + 30, duration: 1.0)     
    let actionDone = SKAction.removeFromParent()
    bullet.runAction(SKAction.sequence([action, actionDone]))
    self.addChild(bullet)
}

以下是我在中调用该方法的方式

 override func didMoveToView(view: SKView) {
_ = NSTimer.scheduledTimerWithTimeInterval(0.25, target: self, 
selector: Selector ("spawnBullets"), userInfo: nil, repeats: true)
}

下面是我如何编码我的触摸移动功能(我相信这是我需要编辑的方法)

override func touchesMoved(touches: Set<UITouch>, withEvent event: 
UIEvent?) {
    for touch in touches {
        let location = touch.locationInNode(self)
        let v = CGVector(dx: location.x - joystickBase.position.x, dy: 
        location.y - joystickBase.position.y)
        let angle = atan2(v.dy, v.dx)
        let deg = angle * CGFloat(180 / M_PI)
        let length: CGFloat = joystickBase.frame.size.height / 2
        let xDist:CGFloat = sin(angle - 1.5709633) * length
        let yDist:CGFloat = cos(angle - 1.5709633) * length
        print(deg + 180)
        if (stickActive == true) {
        if (CGRectContainsPoint(joystickBase.frame, location)) {
            joystick.position = location
        }else{
joystick.position = CGPointMake(joystickBase.position.x - 
xDist, joystickBase.position.y + yDist)
            }
        }
    }
}

您只是在垂直方向上移动项目符号:

let action = SKAction.moveToY(self.size.height + 30, duration: 1.0)

不确定这是否是一场双棍游戏。

要让精灵在操纵杆的基础上运行,只需执行以下

let accel = 10 //accel is the # of pixels the sprite moves per frame, do not use moveTo, because moveTo will change the speeds of your sprite based on distance   
let action = SKAction.moveByX(joystick.x * accel,y:joystick.y * accel,duration:1)

当然,这是基于这样一种理解,即操纵杆坐标在每个轴上从-1.0到1.0,向上或向右的点会得到1.0的结果

不过,我甚至不会采用这种方法,SKActions对于非自动化的事情来说不是一个好的选择。你应该在更新阶段的某个点更新精灵的位置

sprite.position.x += joystick.x * accel
sprite.position.y += joystick.y * accel

最新更新