テトリスのようなゲームでは、アクションを使用してシェイプを移動しようとしていますが、次のシェイプが呼び出されると、前のシェイプが移動しなくなり、動く。私はremoveAllActions
とremoveActionForKey
をこれとSKNodeドキュメンテーションで尋ねられた多くの他の質問に使用しようとしましたが、動かないようです。私はactionForKey
を私のコードでテストしました。それは、他の形がまだ動いているにもかかわらず実行されているアクションを取り上げていないようです。即時のSpriteKitでのアクションの停止
まず、図形を生成するdidMoveToView
の中で私のdoMethod
関数を呼び出してから、次のように移動を開始します。これは、ボタンを押すたびに呼び出されるので、いつ新しいシェイプが作成されるかを制御できます。
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)
}
}
}
を次のように
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
関数である私はちょうど私がもともと持っていたかを示すために、他のremoveAllActions
とremoveActionForKey
をコメントアウトしています。また、MoveBlocks
の最初のビットはちょうどそこにあるので、最初のシェイプが生成されたときには、アクションが停止しないようにします。その後、それは2番目、3番目などのためになります。
私は実際に私が最初にアクションを作成している方法と関係があると感じていますが、あまりよく分かりません。
removeAllActionsは現在のスプライトではなく、シーンから削除します。スプライトでもremoveactionsを呼び出す必要があります。 'CurrentSprite?.removeAllActions' – Knight0fDragon
https://www.raywenderlich.com/42699/spritekit-tutorial-for-beginners – Knight0fDragon
ありがとう!私は 'MoveBlocks()'の終わりのようにforループを実装し、あなたが言ったことをやっていました。ありがとう!あなたは客観的なものではなく迅速なものを除いて、そのようなチュートリアルはありますか? – MathCoder