我有一个蓝色方形精灵和一个字母A形的瓷砖地图。蓝色方块应该能够在地图内自由移动。
我的目标是即使触摸活动仍在发生,也要限制图块贴图内的蓝色方形精灵。
问题是,当蓝色方形精灵朝特定方向触摸移动时,如果触摸仍在进行,则精灵将行进到红色方块之外。
我尝试过的解决方案
逻辑:
在update()中创建一个布尔值标志(isNeighbourTileNil)以检测相邻图块是否为nil(不在红色图块上)
如果isNeighbourTileNil为true,则即使触摸仍在移动/正在发生,播放器精灵也应停止移动。
这是我尝试过的代码:
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()
}
}
这有点复杂,细节取决于您的设置方式,因此我不会编写一堆代码,但是我建议按以下方式组织事情:
canMove
的变量或类似的名称,当播放器处于可移动状态时,该变量应为true
。UISwipeGestureRecognizer
以识别每次滑动。 Google“ uigesturerecognizer spritekit”提供了有关如何执行此操作的示例。滑动时,这将回调您的代码,并为您提供播放器要移动的方向。 canMove
为false
时忽略滑动。canMove
为true
时,请查看玩家是否可以根据相邻的图块向想要的方向移动。如果不是,请忽略滑动。canMove
为true
且滑动指示有效方向的情况...将canMove
设置为false
并触发播放器移动到新方块的动画,并运行[C0 ] 管他呢。使用完成处理程序运行该操作,该处理程序在操作完成时将SKAction.move(to:duration:)
设置为canMove
。