无法在游乐场的spritekit中移动我的化身

问题描述 投票:0回答:1

我最近正在尝试使用spriteKit构建游戏,我想将我的化身移动到我的接触位置,并将所有其他敌人移动到我的化身的当前位置。但是我的化身并没有从其位置移动,而只是在我触摸的方向。我想将其移动到我的触摸位置。这是我的代码:“'

导入SpriteKit

公共类GameScene:SKScene,SKPhysicsContactDelegate {

let playerSpeed: CGFloat = 40.0
let coronaSpeed: CGFloat = 10.0

var mask: SKSpriteNode?
var player: SKSpriteNode?
var mcorona: [SKSpriteNode] = []

var lastTouch: CGPoint? = nil

override public func didMove(to view: SKView) {
    physicsWorld.contactDelegate = self

    // Animations
    player = childNode(withName: "player") as? SKSpriteNode

    mask = childNode(withName: "mask") as? SKSpriteNode
    mask!.run(SKAction.repeatForever(
        SKAction.sequence([
            SKAction.moveBy(x: 0, y: 10, duration: 0.45),
            SKAction.moveBy(x: 0, y: -10, duration: 0.45)
            ]
    )))

    for child in self.children {
        if child.name == "corona" {
            if let child = child as? SKSpriteNode {
                mcorona.append(child)
            }
        }
    }
    // </> Animations
}
override public func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) { handleTouches(touches) }

override public func touchesMoved(_ touches: Set<UITouch>,with event: UIEvent?) { handleTouches(touches) }

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

fileprivate func handleTouches(_ touches: Set<UITouch>) { lastTouch = touches.first?.location(in: self) }

override public func didSimulatePhysics() {
    if player != nil {
        updatePlayer()
        updateZombies()
    }
}
fileprivate func updatePosition(for sprite: SKSpriteNode, to target: CGPoint, speed: CGFloat) {

    let currentPosition = sprite.position
    let angle = CGFloat.pi + atan2(currentPosition.y - target.y, currentPosition.x - target.x)
    let rotateAction = SKAction.rotate(toAngle: angle + (CGFloat.pi*0.5), duration: 0)
    sprite.run(rotateAction)

    let velocityX = speed * cos(angle)
    let velocityY = speed * sin(angle)

    let newVelocity = CGVector(dx: velocityX, dy: velocityY)
    sprite.physicsBody?.velocity = newVelocity
}

fileprivate func gameOver(_ didWin: Bool) {
    let resultScene = MenuScene(size: size, didWin: didWin, levelToSend: 2)
    let transition = SKTransition.flipVertical(withDuration: 1.0)
    view?.presentScene(resultScene, transition: transition)
}


fileprivate func shouldMove(currentPosition: CGPoint,
                            touchPosition: CGPoint) -> Bool {
    guard let player = player else { return false }
    return abs(currentPosition.x - touchPosition.x) > player.frame.width / 2 ||
        abs(currentPosition.y - touchPosition.y) > player.frame.height / 2
}

fileprivate func updatePlayer() {
    guard let player = player,
        let touch = lastTouch
        else { return }
    let currentPosition = player.position
    if shouldMove(currentPosition: currentPosition,
                  touchPosition: touch) {
        updatePosition(for: player, to: touch, speed: playerSpeed)
    } else {
        player.physicsBody?.isResting = true
    }
}

func updateZombies() {
    guard let player = player else { return }
    let targetPosition = player.position

    for corona in mcorona {
        updatePosition(for: corona, to: targetPosition, speed: coronaSpeed)
    }
}


public func didBegin(_ contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody
    var secondBody: SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    // Check contact
    if firstBody.categoryBitMask == player?.physicsBody?.categoryBitMask &&
        secondBody.categoryBitMask == mcorona[0].physicsBody?.categoryBitMask {
        // Player & corona
        gameOver(false)
    } else if firstBody.categoryBitMask == player?.physicsBody?.categoryBitMask &&
        secondBody.categoryBitMask == mask?.physicsBody?.categoryBitMask {
        // Player & mask
        gameOver(true)
    }
}

“'Here is the GIF to the problem I faced

请帮助!谢谢!

ios swift sprite-kit swift-playground
1个回答
0
投票

在您的代码中,您正在创建一个新的速度并将其分配给您的播放器,但是据我所知,您并没有在代码中更新您的播放器位置。尝试添加一条线以实际更新您的updatePosition函数中的玩家位置。

sprite.position += sprite.physicsBody.velocity
© www.soinside.com 2019 - 2024. All rights reserved.