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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Cocos2d for iPhone

Cocos2d for iPhoneは、Cocos2dのiOS / OS X向けのバージョンです。Cocos2dは、二次元のゲームや視覚的なアプリケーションを開発する為のオープンソースのフレームワークです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

3498閲覧

Swift(SpriteKit )でcategoryBitMaskをどこにも設定していない状態で contactTestBitMask = 1を設定する理由について

moc

総合スコア18

Cocos2d for iPhone

Cocos2d for iPhoneは、Cocos2dのiOS / OS X向けのバージョンです。Cocos2dは、二次元のゲームや視覚的なアプリケーションを開発する為のオープンソースのフレームワークです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2015/03/24 07:01

編集2015/03/24 07:10

こんにちは。今年からSwiftの学習をスタートしたものです。

iOS8 / XCode6.2の環境でSprite Kitを利用し、カジュアルゲームを作成しています。
衝突判定・BitMask関連で質問があります。

前提

Sprite Kitでは、下記3つのBitMaskを指定できると思います。

1.categoryBitMask 2.collisionBitMask 3.contactTestBitMask

そして、
それぞれ下記の意味合いを持つと認識しています。

1→自分が所属するカテゴリー
2→自分と接触した際に、障害物(ぶつかると跳ね返る)となるカテゴリー
3→自分と接触した際に、イベント(didBeginContact or didEndContactメソッド)が発火するカテゴリー

// BitMaskの値を定数でまとめておく struct ColliderType{ static let Player:UInt32 = (1 << 0) static let Brother:UInt32 = (1 << 1) static let Enemy:UInt32 = (1 << 3) } // マリオ(細かい設定は省略してます) let mario = SKSpriteNode(imageNamed: "mario") mario.physicsBody?.categoryBitMask = ColliderType.Player // 自分のカテゴリをPlayerに設定 mario.physicsBody?.contactTestBitMask = ColliderType.Enemy // Enemyカテゴリと接触したときにdidBeginContact()などが発火 self.addChild(mario) // ルイージ(細かい設定は省略してます) let luigi = SKSpriteNode(imageNamed: "luigi") luigi.physicsBody?.categoryBitMask = ColliderType.Brother // 自分のカテゴリをBrotherに設定 luigi.physicsBody?.contactTestBitMask = ColliderType.Enemy // Enemyカテゴリと接触したときにdidBeginContact()などが発火 self.addChild(luigi) // ワリオ(細かい設定は省略してます) let wario = SKSpriteNode(imageNamed: "wario") wario.physicsBody?.categoryBitMask = ColliderType.Enemy // 自分のカテゴリをEnemyにする wario.physicsBody?.contactTestBitMask = CollinderType.Player | ColliderType.Brother // Player or Brotherカテゴリを接触したときにdidBeginContact()などが発火 self.addChild(wario)

質問

書籍やネットのリファレンスなどを読んでいると、
categoryBitMaskの設定記述がどこにもないのにも関わらず、
contactTestBitMask = 1のようにcontactTestBitMaskだけ設定している場合があったのですが、
なぜこのようにしているのでしょうか?

mario.physicsBody?.contactTestBitMask = 1

categoryBitMaskのデフォルト値はUInt型で16進数 0xFFFFFFFF(10進数で4294967295)のはずなのに、contactTestBitMaskdで"1"を設定するのはなぜなんだろうと疑問が消えず、質問に至りました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

リファレンスを見るとcollision maskと他の物体のcategory maskのANDが0でないときに衝突とみなすとあります。

This body’s collision mask is compared to the other body’s category mask by performing a logical AND operation. If the result is a nonzero value, this body is affected by the collision.

どんな値でも1(=0x00000001)とのANDは1(≠0)になりますので、衝突させるという条件をもっとも簡単に表すためではないでしょうか?

投稿2015/04/03 02:36

jollyjoester

総合スコア1585

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

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

moc

2015/04/03 15:17

@jollyjoester なるほどですね!ご回答ありがとうございます。腑に落ちました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問