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

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

ただいまの
回答率

90.48%

  • Swift 2

    1339questions

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

  • SpriteKit

    131questions

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

物理演算がうまく機能しません

解決済

回答 1

投稿

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

nachizou

score 9

前提・実現したいこと

初心者で、簡単なピンボールアプリを作成しようとしています。
上から落下したボールが、設置したブロックに跳ね返る処理を作成したいです。

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

設置したブロックが長方形の画像の場合は、物理演算がうまく作動して跳ね返るのですが、
斜めのブロック画像の場合、すり抜けてしまい、物理演算が作動しません。
すり抜けたのちに、長方形の部分で反応したり中途半端な状態です。
何か設定が不足しているのでしょうか。。。
大変恐縮ですが、どなたかアドバイスをいただけるとありがたいです。

斜めのブロックがすり抜ける

該当のソースコード

import Foundation
import SpriteKit

class GameScene: SKScene,SKPhysicsContactDelegate {

    var timer:NSTimer?

    override func didMoveToView(view: SKView) {
        self.physicsWorld.gravity = CGVector(dx:0,dy:-3.0)
        self.physicsWorld.contactDelegate = self

        wall001()
        wall002()
        wall003()
        self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1,target:self,selector:#selector(GameScene.makeFruit),userInfo:nil,repeats:true)

    }

    func wall001(){
        let wall001tx = SKTexture(imageNamed:"wall001.png")
        wall001tx.filteringMode = .Linear
        let wall001sp = SKSpriteNode(texture:wall001tx)
        wall001sp.position = CGPoint(x:375/4,y:667/4)
        wall001sp.size = CGSize(width:240,height:180)
        wall001sp.physicsBody = SKPhysicsBody(texture:wall001tx,size:wall001sp.size)
        wall001sp.physicsBody?.dynamic = false
        wall001sp.physicsBody?.contactTestBitMask = 1
        wall001sp.physicsBody?.restitution = 0.1
        self.addChild(wall001sp)
    }
    func wall002(){
        let wall002tx = SKTexture(imageNamed:"wall002.png")
        wall002tx.filteringMode = .Linear
        let wall002sp = SKSpriteNode(texture:wall002tx)
        wall002sp.position = CGPoint(x:375/4*3,y:667/4)
        wall002sp.size = CGSize(width:240,height:180)
        wall002sp.physicsBody = SKPhysicsBody(texture:wall002tx,size:wall002sp.size)
        wall002sp.physicsBody?.dynamic = false
        wall002sp.physicsBody?.contactTestBitMask = 1
        wall002sp.physicsBody?.restitution = 0.1
        self.addChild(wall002sp)
    }
    func wall003(){
        let testtx = SKTexture(imageNamed:"block01.png")
        testtx.filteringMode = .Linear
        let testsp = SKSpriteNode(texture:testtx)
        testsp.position = CGPoint(x:375/4*2,y:667/4*2)
        testsp.size = CGSize(width:140,height:50)
        testsp.physicsBody = SKPhysicsBody(texture:testtx,size:testsp.size)
        testsp.physicsBody?.dynamic = false
        testsp.physicsBody?.contactTestBitMask = 1
        testsp.physicsBody?.restitution = 0.1
        self.addChild(testsp)
    }

    func makeFruit(){
        let ball001tx = SKTexture(imageNamed:"fruitsicon01-001s.png")
        ball001tx.filteringMode = .Linear
        let ball001sp = SKSpriteNode(texture:ball001tx)
        ball001sp.position = CGPoint(x:180,y:500)
        ball001sp.size = CGSize(width:30,height:30)
        ball001sp.physicsBody = SKPhysicsBody(texture:ball001tx,size:ball001sp.size)
        ball001sp.physicsBody?.contactTestBitMask = 1
        self.addChild(ball001sp)

    }

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

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}

試したこと

テクスチャからPhysicsBodyを追加するなど

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

より詳細な情報

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

+1

元々の画像をひきのばして使用していたのですが、元のサイズで使用したらうまく機能しました。
原因はイマイチよくわからないのですが、なんとか解決しました。お騒がせしました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • Swift 2

    1339questions

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

  • SpriteKit

    131questions

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