В игре, подобной тетрису, я пытаюсь использовать действия для перемещения фигур вниз, а затем, когда вызывается следующая фигура, она останавливает предыдущую фигуру от перемещения, так что они не имеют перемещение. Я попытался использовать removeAllActions
и removeActionForKey
во множестве других вопросов, заданных по этому вопросу, а также в документации SKNode, но он, похоже, не работает. Я проверил actionForKey
на моем коде, и кажется, что он не подбирает никаких действий, которые выполняются, даже если другие фигуры все еще движутся.Остановить действие в SpriteKit с быстрым
Я сначала вызываю функцию doMethod
внутри didMoveToView
, которая генерирует форму и затем начинает ее перемещать следующим образом. Это называется всякий раз, когда я нажимаю кнопку, чтобы я мог контролировать, когда каждая новая фигура создается.
func doMethod(){
if(true){
if(number_of_blocks != 1){
current_min = current_max + 1
}
// calculate points for shape
var box_d = createBox(self.size.width/2, yinit: 7*self.size.height/8)
// using box_d, make a SKNode with each calculated value
makeBox(box_d)
// move the blocks down
MoveBlocks()
number_of_blocks++
}
}
Тогда моя MoveBlocks
функция заключается в следующем
func MoveBlocks(){
if(number_of_blocks > 1){
let newnum = number_of_blocks - 1
let KeyName = "MoveBlocks_"+String(newnum)
let ActName = actionForKey(KeyName) // returns nil
// removeAllActions()
// removeActionForKey(KeyName)
}
var Sprite = childNodeWithName("BOX_"+String(current_min))
var y_min = (Sprite?.position.y)
// calc y_min to stop when gets to bottom - not currently implemented correctly
for i in current_min...(current_max-1){
var CurrentSprite = childNodeWithName("BOX_"+String(i))
if(CurrentSprite?.position.y < y_min){
y_min = (CurrentSprite?.position.y)
}
}
if(y_min > CGFloat(BOX_WIDTH/2)){
for i in current_min...current_max {
var CurrentSprite = childNodeWithName("BOX_"+String(i))
//var current_pos = sprite_self?.position.y
//sprite_self?.position.y = (sprite_self?.position.y)! - CGFloat(BOX_WIDTH/2)
let moveAction = SKAction.moveBy(CGVector(dx: 0,dy: -60), duration: 0.001)
let pauseAction = SKAction.waitForDuration(0.999)
let runSequence = SKAction.sequence([moveAction, pauseAction])
var KeyName = "MoveBlocks_"+String(number_of_blocks)
CurrentSprite?.runAction(SKAction.repeatActionForever(runSequence), withKey: KeyName)
}
}
}
Я закомментировал другой removeAllActions
и removeActionForKey
просто чтобы показать, что я был первоначально. Кроме того, первый бит MoveBlocks
находится там, так что, когда генерируется первая форма, он не пытается остановить какие-либо действия, если они не существуют. Тогда это будет для второго, третьего и так далее.
У меня такое ощущение, что это как-то связано с тем, как я на самом деле создаю действие, но я не слишком уверен.
removeAllActions удаляет только с места происшествия, а не ваш текущий спрайт. Вам также нужно вызвать удаление на спрайтах. 'CurrentSprite? .removeAllActions' – Knight0fDragon
https://www.raywenderlich.com/42699/spritekit-tutorial-for-beginners – Knight0fDragon
О да, спасибо! Я реализовал цикл for так же, как в конце 'MoveBlocks()', и сделал то, что вы сказали, и это сработало. Благодаря! Есть ли у вас какие-либо учебные пособия, кроме как с быстрым, а не с объективным-c? – MathCoder