CocosCreatorの(タッチ)イベント登録について
-
記事執筆時点の最新 (v2.0.2) の話
-
公式には
node.on
での設定が推奨されている模様 -
http://docs.cocos2d-x.org/creator/manual/en/scripting/events.html?h=event
-
しかし
node.on
によるタッチイベント登録は、内部実装でswallowTouches:true
となっており「イベントを発火した上で背部のNodeへさらにタッチを通す」ことができない -
https://github.com/cocos-creator/engine/blob/master/cocos2d/core/CCNode.js#L1387
-
cocosの forum にログインして聞こうとしたものの、ログイン時にエラーになり聞くことができない
-
(ユーザー登録がhttpなのも気になる)
-
engineのIssueもあんまり見てないっぽい
非公開Apiを用いて設定する
どうにもならないので、昔公開されていた非公開のApiを使用して設定しました
TypeScriptで書いてるので必要に応じてJSに戻すなどしてください
const listener1 = cc.EventListener.create({
event: cc.EventListener.TOUCH_ONE_BY_ONE,
swallowTouches: false,
onTouchBegan: (touch: cc.Touch, event) => {
// Node内をtapしているかでtrue/false切り替えても良い
return true;
},
onTouchEnded: (touch, event) => {
// 発火した上で透過させたい処理
}
});
cc.eventManager.addListener(listener1, this.touchNode);
非公開なので、 EventListener
や eventManager
部分が赤くなったり下記警告が出力されます。
Simulator: JS: [WARN]: The 'cc.eventManager' will be removed in v2.0, please use 'cc.EventTarget or cc.systemEvent' instead.
公式も明確に cc.eventManager
を使わないでくれと言っています
- http://docs.cocos2d-x.org/creator/api/en/classes/Node.html#on
It's the recommended way to register touch/mouse event for Node, please do not use cc.eventManager directly for Node.
いつ使えなくなるかはわかりませんが現状の対応ということで