Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在SpriteKit中将动态物理对象保持在手指下_Ios_Swift_Xcode_Sprite Kit_Swift4 - Fatal编程技术网

Ios 在SpriteKit中将动态物理对象保持在手指下

Ios 在SpriteKit中将动态物理对象保持在手指下,ios,swift,xcode,sprite-kit,swift4,Ios,Swift,Xcode,Sprite Kit,Swift4,我正在用spritekit开发一个相对简单的儿童游戏,比如一个虚拟玩具屋。在这个游戏中,他们的角色是纸上的,但也有一些像弹跳球这样的互动对象。目前,我能够在移动手指时给出球的速度,球与移动的手指保持一致。然而,当我的手指(拿着球)仍停留在屏幕上的某个位置时,球就会变得不稳定,开始在房间里跳来跳去,或者从我的手指上掉下来。我为角色解决了这个问题,当他们被握住时,我将isDynamic设置为false,并将他们的位置更新到我的手指上,但这不能用于球,因为它会阻止速度的工作。我已经包括了moveCha

我正在用spritekit开发一个相对简单的儿童游戏,比如一个虚拟玩具屋。在这个游戏中,他们的角色是纸上的,但也有一些像弹跳球这样的互动对象。目前,我能够在移动手指时给出球的速度,球与移动的手指保持一致。然而,当我的手指(拿着球)仍停留在屏幕上的某个位置时,球就会变得不稳定,开始在房间里跳来跳去,或者从我的手指上掉下来。我为角色解决了这个问题,当他们被握住时,我将isDynamic设置为false,并将他们的位置更新到我的手指上,但这不能用于球,因为它会阻止速度的工作。我已经包括了moveChar和moveBall函数,因此您可以看到它们之间的区别,以及在调用它们的地方触摸移动。谢谢

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
//        print("Ball velocity is: ", ball.physicsBody?.velocity as Any)
    if let touch = touches.first {
        let location = touch.location(in: self)
        let startLocation = touch.previousLocation(in: self)
        if let sprite = currentSpriteHeld {
            if sprite == ball {
                moveBall(sprite: sprite, to: location)
            } else {
                moveChar(sprite: sprite, to: location)
            }
        } else {
            let impulse = CGFloat(2.0)
            let dx = (impulse * (startLocation.x - location.x))
            let dy = (impulse * (startLocation.y - location.y))
            let cameraPos = desiredPosition;
            let newCameraPos = CGPoint(x: cameraPos.x+dx, y: cameraPos.y + dy);
//                cameraNode.position = newCameraPos
            desiredPosition = newCameraPos
        }
    }

}

func moveBall(sprite: SKSpriteNode, to location: CGPoint) {
    ball.physicsBody?.velocity = CGVector(dx: 0.0, dy: 0.0)
    let distance = CGDistance(from: sprite.position, to: location);
    print("CGDistance is: ", distance)
    if distance > 10.0 {
        let dx = location.x-sprite.position.x;
        let dy = location.y-sprite.position.y;
        let drag:CGFloat = 0.01
        var vel = CGVector(dx: dx/drag, dy: dy/drag)
        vel = velocityCheck(vel: vel);
        sprite.physicsBody!.velocity = vel
    } else {
        ball.position = location;
    }
}

func moveChar(sprite: SKSpriteNode, to location: CGPoint) {
    if (sprite == dad) {
        dad.texture = dadPickup
    }
    sprite.physicsBody?.isDynamic = false;
    sprite.zPosition = 2;
    sprite.position = location
    touchPoint = location;
}
override func touchesMoved(touch:Set,带有事件:UIEvent?){
//打印(“球速度为:”,Ball.physicsBody?.velocity如有)
如果让触摸=先触摸{
让位置=触摸。位置(in:self)
let startLocation=触摸先前位置(in:self)
如果让精灵=当前精灵保持{
如果精灵=球{
移动球(精灵:精灵,目标:位置)
}否则{
moveChar(精灵:精灵,收件人:位置)
}
}否则{
让脉冲=CGFloat(2.0)
设dx=(脉冲*(startLocation.x-location.x))
设dy=(脉冲*(startLocation.y-location.y))
让cameraPos=所需位置;
设newCameraPos=CGPoint(x:cameraPos.x+dx,y:cameraPos.y+dy);
//cameraNode.position=newcamerarapos
desiredPosition=newCameraPos
}
}
}
func移动球(精灵:SKSpriteNode,至位置:CGPoint){
ball.physicsBody?速度=CGVector(dx:0.0,dy:0.0)
let distance=CGDistance(从:sprite.position,到:位置);
打印(“CGDistance为:”,距离)
如果距离>10.0{
设dx=location.x-sprite.position.x;
设dy=location.y-sprite.position.y;
让拖动:CGFloat=0.01
var-vel=CGVector(dx:dx/drag,dy:dy/drag)
vel=速度检查(vel:vel);
sprite.physicsBody!.velocity=vel
}否则{
球位置=位置;
}
}
func moveChar(精灵:SKSpriteNode,至位置:CGPoint){
if(sprite==dad){
dad.texture=dad
}
sprite.physicsBody?.isDynamic=false;
sprite.zPosition=2;
sprite.position=位置
接触点=位置;
}

解决方法:我通过将moveBall移动到结束点来修复此问题。现在,我可以像抓住精灵一样抓住球,只有在我放开时才施加速度(导致震动)。

解决方法:我通过将moveBall移动到结束位置来解决这个问题。现在我可以像抓精灵一样抓着球,只有当我放开时才施加速度(这是引起震动的原因)