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

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

ただいまの
回答率

90.35%

  • Swift

    7632questions

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

  • Xcode 7

    615questions

    Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

  • SpriteKit

    113questions

    SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

アプリがクラッシュしてしまう。その1

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 451

NaNoSa

score 20

コードが長くて1ページに収まらないので2度投稿させてください。このコードを応用してセレクト画面を作っています。(https://github.com/burczyk/SwiftTeamSelect/blob/master/SwiftTeamSelect/GameScene.swift)ビルドもできスタートボタンも機能しスクロールも上手く行っているのですがホーム画面に戻ろうとするとスクロールの画像達がホーム画面に現れてしまいます。そして再びスタートボタンを押すとクラッシュしてしまいます。どうしたらよいですか?また、ゲームを作るにあたってこれからも質問していきたいのですがソースコードをこのように公開してしまって大丈夫でしょうか?

import SpriteKit

class GameScene: SKScene {

    enum Zone {
        case Left, Center, Right
    }
    var SelectWorldBTN = [SKSpriteNode]()
    var leftSelectWorldBTN: SKSpriteNode?
    var centerSelectWorldBTN: SKSpriteNode?
    var rightSelectWorldBTN: SKSpriteNode?
    var leftGuide : CGFloat {
        return round(view!.bounds.width / 3.0)
    }
    var rightGuide : CGFloat {
        return view!.bounds.width - leftGuide
    }
    var gap : CGFloat {
        return (size.width / 2 - leftGuide) / 2
    }
    var SelectWorld = SKSpriteNode()
    var startBTN = SKSpriteNode()
    var backhomeBTN = SKSpriteNode()
    var HomeBackGround = SKSpriteNode()

    override func didMove(to view: SKView) {
        createHome()
    }

    func createHome(){
        HomeBackGround = SKSpriteNode(imageNamed: "HomeBackGround")
        HomeBackGround.size = CGSize(width: self.frame.width, height: self.frame.height)
        HomeBackGround.position = CGPoint(x: self.frame.width/2, y: self.frame.height/2)
        self.addChild(HomeBackGround)
        createstartBTN()
    }


    func createstartBTN(){
        startBTN = SKSpriteNode(imageNamed: "startBTN")
        startBTN.position = CGPoint(x: self.frame.width/4, y: self.frame.height/2)
        startBTN.size = CGSize(width: self.frame.width/10, height: self.frame.height/5)
        self.addChild(startBTN)
    }

    func SelectWorldField(){
        SelectWorld = SKSpriteNode(imageNamed: "SelectWorld")
        SelectWorld.size = CGSize(width: self.frame.width, height: self.frame.height)
        SelectWorld.position = CGPoint(x: self.frame.width/2, y: self.frame.height/2)
        self.addChild(SelectWorld)
        createbackhomeBTN()
        placeSelectWorldBTNOnPositions()
        calculateZIndexesForPlayers()
    }


    func createbackhomeBTN(){
        backhomeBTN = SKSpriteNode(imageNamed: "backhomeBTN")
        backhomeBTN.position = CGPoint(x: self.frame.width/10, y: self.frame.height/15*14)
        backhomeBTN.size = CGSize(width: self.frame.width/8, height: self.frame.width/8)
        self.addChild(backhomeBTN)
    }

    override init(size: CGSize) {
        super.init(size:size)
        createSelectWorldBTN()
        centerSelectWorldBTN = SelectWorldBTN[SelectWorldBTN.count/2]
        setLeftAndRightSelectWorldBTN()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func createSelectWorldBTN() {
        for i in 0..<9 {
            let player = SKSpriteNode(imageNamed: "SelectWorldBTN\(i)")
            player.size = CGSize(width: self.frame.width/8, height: self.frame.width/2)
            SelectWorldBTN.append(player)
        }
    }

    func placeSelectWorldBTNOnPositions() {
        for i in 0..<SelectWorldBTN.count/2 {
            SelectWorldBTN[i].position = CGPoint(x: leftGuide, y: self.frame.height/4*3)
        }
        SelectWorldBTN[SelectWorldBTN.count/2].position = CGPoint(x: self.frame.width/2, y: self.frame.height/4*3)

        for i in SelectWorldBTN.count/2 + 1..<SelectWorldBTN.count {
            SelectWorldBTN[i].position = CGPoint(x: rightGuide, y: self.frame.height/4*3)
        }
        for player in SelectWorldBTN {
            player.setScale(calculateScaleForX(x: player.position.x))
            self.addChild(player)
        }
    }

    func calculateScaleForX(x:CGFloat) -> CGFloat {
        let minScale = CGFloat(0.5)

        if x <= leftGuide || x >= rightGuide {
            return minScale
        }

        if x < size.width/2 {
            let a = 1.0 / (size.width - 2 * leftGuide)
            let b = 0.5 - a * leftGuide

            return (a * x + b)
        }

        let a = 1.0 / (frame.size.width - 2 * rightGuide)
        let b = 0.5 - a * rightGuide

        return (a * x + b)
    }

    func calculateZIndexesForPlayers() {
        var playerCenterIndex : Int = SelectWorldBTN.count / 2

        for i in 0..<SelectWorldBTN.count {
            if centerSelectWorldBTN == SelectWorldBTN[i] {
                playerCenterIndex = i
            }
        }

        for i in 0...playerCenterIndex {
            SelectWorldBTN[i].zPosition = CGFloat(i)
        }

        for i in playerCenterIndex+1..<SelectWorldBTN.count {
            SelectWorldBTN[i].zPosition = centerSelectWorldBTN!.zPosition * 2 - CGFloat(i)
        }

    }

    func movePlayerToX(player: SKSpriteNode, x: CGFloat, duration: TimeInterval) {
        let moveAction = SKAction.moveTo(x: x, duration: duration)
        let scaleAction = SKAction.scale(to: calculateScaleForX(x: x), duration: duration)

        player.run(SKAction.group([moveAction, scaleAction]))
    }

    func movePlayerByX(player: SKSpriteNode, x: CGFloat) {
        let duration = 0.01

        if player.frame.midX <= rightGuide && player.frame.midX >= leftGuide {
            player.run(SKAction.moveBy(x: x, y: 0, duration: duration), completion: {
                player.setScale(self.calculateScaleForX(x: player.frame.midX))
            })

            if player.frame.midX < leftGuide {
                player.position = CGPoint(x: leftGuide, y: player.position.y)
            } else if player.frame.midX > rightGuide {
                player.position = CGPoint(x: rightGuide, y: player.position.y)
            }
        }
    }

    func zoneOfCenterSelectWorldBTN() -> Zone {
        let gap = size.width / 2 - leftGuide

        switch centerSelectWorldBTN!.frame.midX {

        case let x where x < leftGuide + gap/2:
            return .Left

        case let x where x > rightGuide - gap/2:
            return .Right

        default: return .Center
        }
    }

    func setLeftAndRightSelectWorldBTN() {
        var playerCenterIndex : Int = SelectWorldBTN.count / 2

        for i in 0..<SelectWorldBTN.count {
            if centerSelectWorldBTN == SelectWorldBTN[i] {
                playerCenterIndex = i
            }
        }

        if playerCenterIndex > 0 && playerCenterIndex < SelectWorldBTN.count {
            leftSelectWorldBTN = SelectWorldBTN[playerCenterIndex-1]
        } else {
            leftSelectWorldBTN = nil
        }

        if playerCenterIndex > -1 && playerCenterIndex < SelectWorldBTN.count-1 {
            rightSelectWorldBTN = SelectWorldBTN[playerCenterIndex+1]
        } else {
            rightSelectWorldBTN = nil
        }
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        for touch in touches{

            let location = touch.location(in: self)

            if startBTN.contains(location){
                SelectWorldField()
            }

            if backhomeBTN.contains(location){
                createHome()
            }
        }
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2017/04/06 09:23

    コードの量が多いときは外部サイト(例えばgithubなど)に置いた方が良いと思います。

    キャンセル

回答 1

check解決した方法

0

このように置き換えることでクラッシュしなくなりました。

if backhomeBTN.contains(location){
                self.removeAllChildren()
                self.removeAllActions()
                createHome()

            }


でも何が原因なのかわからない、リムーブしないと重くなるということかな?
これを見た人教えてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Swift

    7632questions

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

  • Xcode 7

    615questions

    Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

  • SpriteKit

    113questions

    SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。