У меня есть синий квадратный спрайт и карта в форме буквы. Синий квадрат должен свободно перемещаться внутри карты.
Моя цель состоит в том, чтобы ограничить спрайт синего квадрата внутри карты тайлов, даже если действие касания все еще происходит.
Проблема заключается в том, что спрайт синего квадрата движется касанием в определенном направлении, если касание все еще продолжается, спрайт выйдет за пределы красных плиток.
![enter image description here](https://i.stack.imgur.com/jItMO.png)
решение, которое я пробовал
logi c:
создать логический флаг (isNeighbourTileNil) определить, является ли соседняя плитка ноль (не на красной плитке) в обновлении ()
- У меня нет проблем для этого шага.
Если isNeighbourTileNil равно true, то спрайт игрока должен перестать двигаться, даже когда касание все еще движется / происходит.
- У меня проблемы с этим шагом. Проблема, с которой я столкнулся, заключается в том, что переменная bool isNeighbourTileNil обновляется каждым кадром. Однако событие touch (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()
}
}