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

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

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

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

Q&A

1回答

2081閲覧

キャラが画面外にでてしまう。spritekit(swift3.1)

hellommm

総合スコア49

Swift

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

0グッド

0クリップ

投稿2017/10/06 14:21

編集2017/10/10 19:16

###前提・実現したいこと

キャラをタップで操作することができるのですが、画面外にでてしまいます。
調べるとSKrangで範囲を決めれるとかいていたのですが、使い方がわかりま
せん。他の方法でもいいので、キャラが画面外に出ない方法を教えていただき
たいです。

イメージ説明
よろしくお願いします。

###発生している問題・エラーメッセージ

###該当のソースコード

swift3.1

1import SpriteKit 2import GameplayKit 3 4class GameScene: SKScene, SKPhysicsContactDelegate { 5 6 var lastEnemy: CFTimeInterval! 7 var lastBullet: CFTimeInterval! 8 var countup = 0.0; 9 10 let timerLabel = SKLabelNode(fontNamed: "Chalkduster") 11 var char = SKSpriteNode(imageNamed: "Char") 12 13 14 override func didMove(to view: SKView) { 15 16 // フォントサイズを設定. 17 timerLabel.fontSize = 45 18 19 20 // 色を指定(赤). 21 timerLabel.fontColor = UIColor.black 22 23 // 表示するポジションを指定. 24 timerLabel.position = CGPoint(x:self.frame.midX, y:self.frame.maxY-50); 25 26 // シーンに追加. 27 self.addChild(timerLabel) 28 29 physicsWorld.gravity = CGVector(dx:0, dy:0)//重力 30 31 char.position = CGPoint(x:250, y:300)//メインキャラ生成 32 char.physicsBody = SKPhysicsBody(rectangleOf: char.size) 33 addChild(char) 34 35 physicsWorld.contactDelegate = self // 今回追加部分 36 char.physicsBody?.contactTestBitMask = 0x1 // 今回追加部分 //?? 37 38 let fieldImageLength: CGFloat = 32 39 for i in 0...Int(frame.size.width / fieldImageLength) + 1 { // + 1 ?? 40 41 for j in 0...Int(frame.size.height / fieldImageLength) + 1 { //背景画像 42 43 let field = SKSpriteNode(imageNamed: "Field") 44 field.position = CGPoint(x: CGFloat(i) * fieldImageLength, y: CGFloat(j) * fieldImageLength) 45 field.zPosition = -1 46 addChild(field) 47 48 } 49 } 50 51 52 53 } 54 55 56 func createEnemy(){//enemy生成 57 let rand = CGFloat(arc4random_uniform(10))/10//乱数生成 58 let enemy_img = SKTexture(imageNamed: "Enemy")//2は画像名 59 60 let sprite = SKSpriteNode(texture: enemy_img) 61 62 sprite.position = CGPoint(x: 0, y: self.size.height*rand) 63 64 //ターゲットノードをタッチした座標まで移動するアクションを実行する。 65 let action = SKAction.move(to: CGPoint(x: self.size.width + 30, y: self.size.height*rand), duration:2.0) 66 sprite.run(action) { 67 sprite.removeFromParent() //? 68 } 69 sprite.physicsBody = SKPhysicsBody(rectangleOf: sprite.size) 70 self.addChild(sprite) 71 72 73 } 74 75 76 func count() { 77 78 countup += 0.1; 79 // Labelに文字列を設定. 80 timerLabel.text = "".appendingFormat("%.1f", countup) 81 82 83 84 85 } 86 87 override func update(_ currentTime: TimeInterval) { 88 89 90 if !(lastEnemy != nil) { 91 lastEnemy = currentTime 92 } 93 if !(lastBullet != nil) { 94 lastBullet = currentTime 95 } 96 97 // 0.8秒間隔で敵を生成する。 98 if lastEnemy + 0.8 <= currentTime { 99 self.createEnemy() 100 //addChild(enemy) 101 lastEnemy = currentTime 102 } 103 104 if lastEnemy + 0.1 <= currentTime {//0.1秒間でカウント(うまくいかない) 105 count() 106 print(countup) 107 } 108 109 } 110 111 112 113 114 func didBegin(_ contact: SKPhysicsContact) { 115 116 } 117 118 119 120 121 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 122 for touch in touches { 123 let newPosition = touch.location(in: self) 124 let oldPosition = touch.previousLocation(in: self) 125 let yTranslation = newPosition.y - oldPosition.y 126 127 var originalY = char.frame.midY 128 129 if (originalY == 0) { 130 originalY -= yTranslation 131 132 // print(originalY) 133 } else if (originalY == self.frame.maxY){ 134 originalY -= yTranslation 135 } else { 136 originalY += yTranslation 137 } 138 char.run(SKAction.moveTo(y: originalY, duration: 0.0)) 139 140 } 141 } 142 143 override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 144 } 145 146 } 147 148

###試したこと

if (originalY == 0) {
originalY -= yTranslation

// print(originalY) } else if (originalY == self.frame.maxY){ originalY -= yTranslation } else { originalY += yTranslation } char.run(SKAction.moveTo(y: originalY, duration: 0.0))

これで画面外からでないようにできると思ったのですがダメでした。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

xcode8.3.3
swift3.1

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

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

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

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

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

guest

回答1

0

self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
追加したらダメですか?

投稿2017/12/26 18:21

tanakana

総合スコア150

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問