質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

0回答

1443閲覧

spriteNodeの表示場所がずれて表示される。

afuroda

総合スコア36

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2018/04/07 15:21

前提・実現したいこと

downBlock1()で作成したdownblock1Spriteの表示箇所が1回目のdownBlock()ではblockNode1.removeAllChildren()で消したblock1Spriteと同じ箇所に表示されますが、2回目以降は必ずずれて表示されてしまいます。blockNode1.removeAllChildren()block1Spriteを消した箇所にdownblock1Spriteを表示させる方法を教えていただきたいです。

###swift4

import UIKit import SpriteKit class GameScene: SKScene ,SKPhysicsContactDelegate{ var plateNode:SKNode! var blockNode1:SKNode! var block1Sprite=SKSpriteNode() var blockPositionx:CGFloat! //ブロックの重力作用用のフラグ var gravityFlag:Bool! //シーンが呼び出された時に呼ばれるメソッド override func didMove(to view: SKView) { backgroundColor = UIColor(red: 1, green: 1, blue: 0.67, alpha: 1) physicsWorld.gravity=CGVector(dx: 0, dy: -4.0) //blockPositionxの初期化 blockPositionx=0 blockNode1=SKNode() addChild(blockNode1) plateNode=SKNode() addChild(plateNode) makePlate() } func makeBlock1(){ //SpriteNodeの生成 block1Sprite=SKSpriteNode(color: UIColor.green, size: CGSize(width: self.frame.size.width/7, height: self.frame.size.height/10)) //ノードの表示箇所 block1Sprite.position=CGPoint(x: self.frame.size.width/2 - blockPositionx, y: self.frame.size.height-self.frame.size.height/10) blockNode1.addChild(block1Sprite) blockPositionx=0 } func downBlock1(){ //SpriteNodeの生成 let downblock1Sprite=SKSpriteNode(color: UIColor.green, size: CGSize(width: self.frame.size.width/7, height: self.frame.size.height/10)) //ノードの表示箇所 downblock1Sprite.position=CGPoint(x: self.frame.size.width/2 - blockPositionx, y: self.frame.size.height-self.frame.size.height/10) print("downBlockPosition:(downblock1Sprite.position.x)") //物理演算の追加 downblock1Sprite.physicsBody=SKPhysicsBody(rectangleOf: downblock1Sprite.size) addChild(downblock1Sprite) } func makePlate(){ let plateSprite=SKSpriteNode(color: UIColor.blue, size: CGSize(width: self.frame.size.width/2, height: self.frame.size.height/13)) plateSprite.position=CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/10) plateSprite.physicsBody=SKPhysicsBody(rectangleOf: plateSprite.size) //衝突時に動かないようにする plateSprite.physicsBody?.isDynamic=false addChild(plateSprite) } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { makeBlock1() } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { for touch in touches{ blockPositionx=0 let newPosition = touch.location(in: self) let oldPosition = touch.previousLocation(in: self) let xTranslation = newPosition.x - oldPosition.x blockPositionx=blockNode1.position.x blockPositionx! += xTranslation //blockNodeを動かすアニメーション let blockAnimation=SKAction.moveTo(x: blockPositionx, duration: 0.0) blockNode1.run(blockAnimation, withKey: "block anime") } } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { blockNode1.removeAllChildren() downBlock1() } }

試したこと

デバッグエリアでdownblock1Spriteの表示箇所を確認してみると、表示するごとに、downblock1Sprite.position.xの値が一つ前のdownblock1Sprite.position.xの値を足して行ってることがわかりましたが、blockPositionxを初期化しても表示箇所が治りませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hameji

2018/06/02 08:12

載っているコードを試させていただきました。しかし、よくわからなかったのですが、右上あら緑色のブロックが降ってくる動きでいいんですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問