使用swift

时间:2016-03-31 16:24:08

标签: swift sprite-kit skaction sknode

在类似俄罗斯方块的游戏中,我试图使用动作向下移动形状,然后在调用下一个形状时,它将阻止先前的形状移动,这样它们就不会移动。我已经尝试在很多其他问题中使用removeAllActionsremoveActionForKey以及SKNode文档,但它似乎没有起作用。我在我的代码上测试了actionForKey,看起来即使其他形状仍在移动,它也没有采取任何正在执行的操作。

我首先在生成形状的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)
        }
    }
}

我已经注释掉了其他removeAllActionsremoveActionForKey,只是为了展示我原来的内容。此外,MoveBlocks的第一位就在那里,以便在生成第一个形状时,它不会尝试停止任何动作,因为没有任何动作。然后它将为第二个,第三个等等。

我觉得这与我实际创建动作的方式有关,但我不太确定。

1 个答案:

答案 0 :(得分:0)

略有不同的想法,你可以建立这些物理机构,然后与其他块接触删除他们的行动“冻结”他们?只是一个想法。