当触摸活动仍在发生时如何停止精灵移动

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

我有一个蓝色方形精灵和一个字母A形的瓷砖地图。蓝色方块应该能够在地图内自由移动。

我的目标是即使触摸活动仍在发生,也要限制图块贴图内的蓝色方形精灵。

问题是,当蓝色方形精灵朝特定方向触摸移动时,如果触摸仍在进行,则精灵将行进到红色方块之外。

enter image description here

我尝试过的解决方案

逻辑:

  1. 在update()中创建一个布尔值标志(isNeighbourTileNil)以检测相邻图块是否为nil(不在红色图块上)

    • 我对此步骤没有问题。
  2. 如果isNeighbourTileNil为true,则即使触摸仍在移动/正在发生,播放器精灵也应停止移动。

    • 我在此步骤上遇到麻烦。我面临的挑战是,布尔变量isNeighbourTileNil每帧都会更新。但是,触摸事件(touchesBegan()-> touchesMoved()-> touchesEnded())是一个线性过程,这意味着我无法将isNeighbourTileNil这样不断变化的变量传递给touchesMoved()函数并阻止玩家从那里移动。

这是我尝试过的代码:

 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches{
            if(i==0){
                firstTouch = touch.location(in: self)
            }
            if(i==1){
                secondTouch = touch.location(in: self)
            }
            i = i+1
        }
        direction = directionCalculator(firstTouch, secondTouch)
        print(direction)
        if isNeighbourTileNil == false {
            moveInDirection(direction, 10.0, 10.0, -10.0, -10.0)
        }
    }
override func update(_ currentTime: TimeInterval) {
        // Called before each frame is rendere
        let playerPosition = player.position
        let column = mainTileMap.tileColumnIndex(fromPosition: playerPosition)
        let row = mainTileMap.tileRowIndex(fromPosition: playerPosition)
        let currentTile = mainTileMap.tileDefinition(atColumn: column, row: row)
        currentTileTuple.column = column
        currentTileTuple.row = row

        if !self.isMonsterCollisionDetected {
            self.detectMonsterCollisions()
        }
        detectMapCollision()

        if isNeighbourTileNil == true {
            print("player should stop moving")
            player.removeAllActions()
        }
    }
swift sprite-kit
1个回答
0
投票

这有点复杂,细节取决于您的设置方式,因此我不会编写一堆代码,但是我建议按以下方式组织事情:

  1. 具有一个称为canMove的变量或类似的名称,当播放器处于可移动状态时,该变量应为true
  2. 添加UISwipeGestureRecognizer以识别每次滑动。 Google“ uigesturerecognizer spritekit”提供了有关如何执行此操作的示例。滑动时,这将回调您的代码,并为您提供播放器要移动的方向。 canMovefalse时忽略滑动。
  3. 当您收到滑动通知,并且canMovetrue时,请查看玩家是否可以根据相邻的图块向想要的方向移动。如果不是,请忽略滑动。
  4. 最后是canMovetrue且滑动指示有效方向的情况...将canMove设置为false并触发播放器移动到新方块的动画,并运行[C0 ] 管他呢。使用完成处理程序运行该操作,该处理程序在操作完成时将SKAction.move(to:duration:)设置为canMove
© www.soinside.com 2019 - 2024. All rights reserved.