菜鸟教程小白 发表于 2022-12-11 21:47:12

ios - Spritekit 动画没有改变


                                            <p><p>我的游戏中有一个虚拟控制板。如果我点击并按住其中一个方向按钮,播放器会朝正确的方向移动并显示正确的图像和动画。但是,如果我将手指从一个控件滑到另一个控件(比如从右到下),播放器会向下移动,但图像和动画在我抬起手指之前不会改变。下面是我处理触摸的代码:</p>

<pre><code>override func touchesBegan(_ touches: Set&lt;UITouch&gt;, with event: UIEvent?) {
    for touch in (touches as! Set&lt;UITouch&gt;) {
      let location = touch.location(in: cameraNode)

      if upRect.contains(location) {
            moveXDirection = 0
            moveYDirection = 1
            isIdle = false
            playerSprite.walkUpPlayer()
      } else if rightRect.contains(location) {
            moveXDirection = 1
            moveYDirection = 0
            isIdle = false
            playerSprite.walkLRPlayer()
      } else if downRect.contains(location) {
            moveXDirection = 0
            moveYDirection = -1
            isIdle = false
            playerSprite.walkDownPlayer()
      } else if leftRect.contains(location) {
            moveXDirection = -1
            moveYDirection = 0
            isIdle = false
             playerSprite.walkLRPlayer()
      }
      if !isIdle &amp;&amp; moveXDirection != 0 {
            playerSprite.xScale = moveXDirection
      }
    }
}

override func touchesMoved(_ touches: Set&lt;UITouch&gt;, with event: UIEvent?) {
    for touch in (touches as! Set&lt;UITouch&gt;) {
      let location = touch.location(in: cameraNode)

      if upRect.contains(location) {
            moveXDirection = 0
            moveYDirection = 1
            isIdle = false
      } else if rightRect.contains(location) {
            moveXDirection = 1
            moveYDirection = 0
            isIdle = false
      } else if downRect.contains(location) {
            moveXDirection = 0
            moveYDirection = -1
            isIdle = false
      } else if leftRect.contains(location) {
            moveXDirection = -1
            moveYDirection = 0
            isIdle = false
      }
      if !isIdle &amp;&amp; moveXDirection != 0 {
            playerSprite.xScale = moveXDirection
      }

    }
override func touchesEnded(_ touches: Set&lt;UITouch&gt;, with event: UIEvent?) {
    idlePlayer()
}
</code></pre>

<p>我更改播放器动画的代码是:</p>

<pre><code>func idlePlayer() {
    removeAllActions()
}

func walkLRPlayer() {
    removeAllActions()
    run(SKAction.repeatForever(walkLRAnimation!))
}

func walkUpPlayer() {
    removeAllActions()
    run(SKAction.repeatForever(walkUpAnimation!))
}

func walkDownPlayer() {
    removeAllActions()
    run(SKAction.repeatForever(walkDownAnimation!))
}
</code></pre>

<p>任何建议将不胜感激。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您的播放器从 <code>touchesBegan</code> 中的方向开始并在 <code>touchesEnded</code> 中停止。问题是您没有处理 <code>touchesMoves</code> 上的方向变化。</p>

<p>让我们创建一个全局变量,它会告诉我们是否改变了方向。</p>

<pre><code>var previous_direction : Int = -1 // idle state
</code></pre>

<p>在触摸功能上,添加 <code>previous_direction</code> 行为。</p>

<pre><code>override func touchesBegan(_ touches: Set&lt;UITouch&gt;, with event: UIEvent?) {
    for touch in (touches as! Set&lt;UITouch&gt;) {

      // we start with previous_direction being the start direction

      if upRect.contains(location) {
            previous_direction = 0// up
      } else if rightRect.contains(location) {
            previous_direction = 1// right
      } else if downRect.contains(location) {
            previous_direction = 2// down
      } else if leftRect.contains(location) {
            previous_direction = 3// left
      }
    }
}

override func touchesMoved(_ touches: Set&lt;UITouch&gt;, with event: UIEvent?) {
    for touch in (touches as! Set&lt;UITouch&gt;) {

      // we create a current_direction also
      var current_direction : Int = -1

      // get current_direction
      if upRect.contains(location) {
            current_direction = 0 // up
      } else if rightRect.contains(location) {
            current_direction = 1 // right
      } else if downRect.contains(location) {
            current_direction = 2 // down
      } else if leftRect.contains(location) {
            current_direction = 0 // left
      }

      // now we compare if the current_direction is different from previous_direction
      if current_direction != previous_direction
      {
             player.removeAllActions()

             // attribute new direction
             if current_direction == 0 {
                   playerSprite.walkUpPlayer()
             } else if current_direction == 1 {
                   walkLRPlayer.walkLRPlayer()
             } else if current_direction == 2 {
                   walkLRPlayer.walkDownPlayer()
             } else if current_direction == 3 {
                   walkLRPlayer.walkLRPlayer() }

             // we prepare previous_direction for the next time he enters this function
             previous_direction = current_direction
      }
    }
}

override func touchesEnded(_ touches: Set&lt;UITouch&gt;, with event: UIEvent?) {
    // reset previous_direction
    previous_direction = - 1 // idle state
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Spritekit 动画没有改变,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/54227703/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/54227703/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Spritekit 动画没有改变