gpt4 book ai didi

ios - 完成在 SpriteNode 上运行的操作而不禁用触摸

转载 作者:行者123 更新时间:2023-11-30 12:32:27 25 4
gpt4 key购买 nike

我有一个玩家,他的物理 body 分为几个部分(躯干,腿,头部等),现在我在屏幕上有一个按钮可以控制玩家的移动,如果向右按下按钮,玩家就会移动到右边,那部分工作正常。问题是每次运动改变时 walk() 方法都会被调用,它的作用是让玩家的腿看起来像在走路,但如果运动没有停止,那么就会继续调用 walk() 而没有完成动画,所以看起来像是来回卡住的。我想要实现的是让玩家能够不断行走,但要调用一次 walk() (动画方法),完成,然后再次调用(只要仍然按下行走按钮)。这是我到目前为止所拥有的:

func walk(){
let leftFootWalk = SKAction.run {
let action = SKAction.moveBy(x: 1, y: 0.1, duration: 0.1)
let actionReversed = action.reversed()
let seq = SKAction.sequence([action, actionReversed])
self.leftUpperLeg.run(seq)
self.leftLowerLeg.run(seq)
}

let rightFootWalk = SKAction.run {
let action = SKAction.moveBy(x: 0.4, y: 0.1, duration: 0.1)
let actionReversed = action.reversed()
let seq = SKAction.sequence([action, actionReversed])
self.rightUpperLeg.run(seq)
self.rightLowerLeg.run(seq)
}

let group = SKAction.sequence([leftFootWalk, SKAction.wait(forDuration: 0.2), rightFootWalk])

run(group)
}


extension GameScene: InputControlProtocol {
func directionChangedWithMagnitude(position: CGPoint) {
if isPaused {
return
}

if let fighter = self.childNode(withName: "fighter") as? SKSpriteNode, let fighterPhysicsBody = fighter.physicsBody {

fighterPhysicsBody.velocity.dx = position.x * CGFloat(300)
walk()

if position.y > 0{
fighterPhysicsBody.applyImpulse(CGVector(dx: position.x * CGFloat(1200),dy: position.y * CGFloat(1200)))
}else{
print("DUCK") //TODO: duck animation
}
}
}

最佳答案

首先你可以使用SKAction.runBlock({ self.doSomething() })作为操作序列中的最后一个操作,而不是使用完成。

关于您的问题,您可以使用hasAction来判断您的SKNode当前是否正在运行任何操作,并且您可以使用 key 机制来更好地管理操作。

请参阅下一个问答 checking if an SKNode is running a SKAction

关于ios - 完成在 SpriteNode 上运行的操作而不禁用触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43333197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com