These are chat archives for ac-engine/amusement-creators-engine

15th
Mar 2015
swd
@durswd
Mar 15 2015 14:41
衝突判定どうしようか問題
NumAniCloud
@NumAniCloud
Mar 15 2015 14:43
This message was deleted
This message was deleted
swd
@durswd
Mar 15 2015 14:44
IsHitかオブジェクトのコールバックか
Asato Imanishi
@c-plus-c
Mar 15 2015 14:44
両方というのは?
swd
@durswd
Mar 15 2015 14:45
それは、面倒くさくね・・・と思ったけどどうなんだろう
Asato Imanishi
@c-plus-c
Mar 15 2015 14:47
一つのオブジェクトが複数の当たり判定を保持できるかというのもハングしてましたっけ
これはやるべきだと考えています
NumAniCloud
@NumAniCloud
Mar 15 2015 14:47
うーん、コールバックがあれば、IsHitが必要な場面はDrawAdditionalyで描画したものとの当たり判定くらいでしょうか
swd
@durswd
Mar 15 2015 14:48
コールバックは、弾幕ゲーで弾同士が相互に当たらなくする必要がありますね、くらい
弾幕ゲー作ろうとするとコールバックは逆に大変です
NumAniCloud
@NumAniCloud
Mar 15 2015 14:50
4分木などを使った軽量な当たり判定なんかはコールバックのほうが作りやすそうですね
swd
@durswd
Mar 15 2015 14:51
弾幕ゲーでも木は組んだほうがいいかと
自機周辺の衝突判定に限りたいでしょうし
NumAniCloud
@NumAniCloud
Mar 15 2015 14:51
IsHitとコールバック両方あってもいいかなとは思います
swd
@durswd
Mar 15 2015 14:51
ですね・・・
Siv3Dどっちでしたっけ
NumAniCloud
@NumAniCloud
Mar 15 2015 14:52
IsHitですね
Asato Imanishi
@c-plus-c
Mar 15 2015 14:52
Siv3Dは前者だったかと
swd
@durswd
Mar 15 2015 14:52
ISHitよりGetHitのほうが嬉しそう
全オブジェクトにIsHitしなくていいので
コールバックは、できればコールバックが設定されたオブジェクトのみ走査したいですね
Asato Imanishi
@c-plus-c
Mar 15 2015 14:54
コールバック法を取ってるUnityはゲームジャンルを限定するネックになってる感じがしてます
(反論は認める)
swd
@durswd
Mar 15 2015 14:55
いやまあ合ってる
NumAniCloud
@NumAniCloud
Mar 15 2015 14:56
GetHitというのは当たっているオブジェクトのリストを取得するメソッドですか?
swd
@durswd
Mar 15 2015 14:56
ええ
NumAniCloud
@NumAniCloud
Mar 15 2015 14:59
全オブジェクトにIsHitしなくていいので…というのはどういうことですか?
swd
@durswd
Mar 15 2015 14:59
IsHitだと、全オブジェクト走査しないと、ある範囲内に存在するオブジェクトを全て取得が実現できないなあ、と
Asato Imanishi
@c-plus-c
Mar 15 2015 15:00
そのオブジェクトのサブクラスの情報どうやって取り出すんです?
swd
@durswd
Mar 15 2015 15:00
サブクラスの情報?
Asato Imanishi
@c-plus-c
Mar 15 2015 15:01
Object2Dを継承して
swd
@durswd
Mar 15 2015 15:01
ああ
C++の闇()
dynamic_castしか
Asato Imanishi
@c-plus-c
Mar 15 2015 15:01
何にキャストすればいいのかの情報も乗っけないといけない気が
(タグとかが必要になる感じ?
swd
@durswd
Mar 15 2015 15:02
dynamic_castすればいいのでは?
NumAniCloud
@NumAniCloud
Mar 15 2015 15:02
なぜ派生クラスの情報を取得する必要があるんです?
swd
@durswd
Mar 15 2015 15:04
それが弾か、敵ユニットなのか、とか?
Asato Imanishi
@c-plus-c
Mar 15 2015 15:04
GetHitってObject2DのPtrのコンテナが返ってくるんですよね?
ああ そういうことです
swd
@durswd
Mar 15 2015 15:04
確かにC++だと面倒ですね
Asato Imanishi
@c-plus-c
Mar 15 2015 15:04
そのオブジェクトはゲーム上でどの種類かを判別する必要が有りげだと思うんですが
NumAniCloud
@NumAniCloud
Mar 15 2015 15:05
なるほど
swd
@durswd
Mar 15 2015 15:07
タグなくてもdynamic_cast使えば判別はできます
Asato Imanishi
@c-plus-c
Mar 15 2015 15:08
if(dynamic_cast<Obj1>(obj) != nullptr)
{
~~~~
}
else if(dynamic_cast<Obj2>(obj) != nullptr)
{
~
}
みたいな感じです?
NumAniCloud
@NumAniCloud
Mar 15 2015 15:10
重そう(C#並感
swd
@durswd
Mar 15 2015 15:12
はい
C++面倒ですね・・・
タグとかUserDataが欲しくなります
Asato Imanishi
@c-plus-c
Mar 15 2015 15:13
dynamic_cast推奨したら闇の軍団が湧いてきそう…
swd
@durswd
Mar 15 2015 15:14
ざわ・・・
IsHitもほしくなりますね
Asato Imanishi
@c-plus-c
Mar 15 2015 15:14
Effective C++におもクソ書いてますからね()
swd
@durswd
Mar 15 2015 15:15
コールバックだとその問題はなくなるんですよね
やっぱ両方共欲しい?
Asato Imanishi
@c-plus-c
Mar 15 2015 15:16
>>コールバックだとその問題はなくなるんですよね
どういうことです?
swd
@durswd
Mar 15 2015 15:16
継承したクラスのインスタンスのメソッドが呼ばれるから
自分で判断できる
Asato Imanishi
@c-plus-c
Mar 15 2015 15:17
ああ
virtualにすりゃそうなりますな
NumAniCloud
@NumAniCloud
Mar 15 2015 15:18
本当かな…?
swd
@durswd
Mar 15 2015 15:18
・・・ざわ・・・設計しっかりすればですね
NumAniCloud
@NumAniCloud
Mar 15 2015 15:19
AクラスのコールバックとBクラスのコールバックが同時に呼ばれるからAとBが衝突したと分かる、ということですかね?
swd
@durswd
Mar 15 2015 15:19
はい
・・・衝突した相手の種類は結局わからないですね
NumAniCloud
@NumAniCloud
Mar 15 2015 15:19
ですよね
Asato Imanishi
@c-plus-c
Mar 15 2015 15:19
。。。(
どっちにせよタグ機能はあったほうが良さげですかな
dynamic_cast推奨は色々とまた(
NumAniCloud
@NumAniCloud
Mar 15 2015 15:20
オブジェクトシステムに当たり判定を組み込むならそうなりそうですね…
swd
@durswd
Mar 15 2015 15:21
()
C++の闇だ
ああ、だからSiv3DはisHitのみか・・・
NumAniCloud
@NumAniCloud
Mar 15 2015 15:21
まあ、C#でもダウンキャストしないとならないのは同じですけども
swd
@durswd
Mar 15 2015 15:23
C#は簡単に型が判別できますから
NumAniCloud
@NumAniCloud
Mar 15 2015 15:23
C#のisって重そうな印象があるんですが、実際どうなんでしょうかね
リフレクションが絡んでそうでアレ
swd
@durswd
Mar 15 2015 15:24
あれはリフレクション絡んでないはず
isよりasのほうがいいですが
NumAniCloud
@NumAniCloud
Mar 15 2015 15:25
なるほど、そうなんですか
IsHitメインがいいのかしら
swd
@durswd
Mar 15 2015 15:25
C#、インスタンスが型情報もってますから
範囲とオブジェクトのIsHitは合ったほうがいいと思います
それとは別にGetHitもほしいです
逆にコールバックは使い勝手が難しそうな印象ですがどうなんでしょう?
NumAniCloud
@NumAniCloud
Mar 15 2015 15:28
個人的にコールバックだと、1回の衝突でメソッドが2つ呼ばれるのが気持ち悪いなあと思っています
swd
@durswd
Mar 15 2015 15:29
自分のと相手の2つですか
NumAniCloud
@NumAniCloud
Mar 15 2015 15:29
はい
Asato Imanishi
@c-plus-c
Mar 15 2015 15:29

>>一つのオブジェクトが複数の当たり判定を保持できるかというのもハングしてましたっけ

これなんですがどうします?

swd
@durswd
Mar 15 2015 15:30
それは微妙というか複数持たせるくらいだったら多角形対応したほうがいいのでは・・・
上半身下半身で衝突分けたい時だっけ
Asato Imanishi
@c-plus-c
Mar 15 2015 15:30
そうですね
swd
@durswd
Mar 15 2015 15:31
なんかそれこそその状況欲しい時少ないから
IsHitで対応してと思ってしまうけど
アクションゲーでは必須なんだっけ
Asato Imanishi
@c-plus-c
Mar 15 2015 15:31
そうですね
NumAniCloud
@NumAniCloud
Mar 15 2015 15:32
格ゲーなんかだと攻撃判定と被攻撃判定が分かれていたりしますが、どう実装するのがいいんでしょう
swd
@durswd
Mar 15 2015 15:32
んじゃ複数ありにするしかないですね・・・
格闘ゲームも含めて
Asato Imanishi
@c-plus-c
Mar 15 2015 15:32
自分が持つ判定のどれにヒットしたかというのも取得できたほうが良さげですかな
swd
@durswd
Mar 15 2015 15:34
どんどん複雑になってく
NumAniCloud
@NumAniCloud
Mar 15 2015 15:34
そうですね・・・
swd
@durswd
Mar 15 2015 15:34
多分Unityがコールバックなのって
FPSが作りやすいからなんでしょうね
自分と弾さえ分かれば問題ないので
コールバックのメリットとして
レイヤーに衝突処理フェイズ的なのを用意しなくて住む、というのもありますね
Asato Imanishi
@c-plus-c
Mar 15 2015 15:38
ACEに設計の似たcocos-2dxでも当たり判定に関しては図形同士のインターセクト判定までしかエンジンの仕様に入ってないんですよねえ…
swd
@durswd
Mar 15 2015 15:40
当たり判定、面倒くさいからね
図形同士のインターセクトだと使い勝手微妙っていう
Asato Imanishi
@c-plus-c
Mar 15 2015 15:42
作りこんでもSiv3Dの類似になっちゃいますね
swd
@durswd
Mar 15 2015 15:42
類似でもいいよそれは
Asato Imanishi
@c-plus-c
Mar 15 2015 15:42
ソレすらもサポートしてないエンジンが多いですしね
汎化の限界を感じる()
相手のどの当たり判定Shapeに当たったかは
予めTagでも指定しときゃ判別できますね
swd
@durswd
Mar 15 2015 15:45
ええ
とりあえず、GetHits 衝突してるオブジェクト取得 IsHit そのオブジェクトに衝突しているか取得の
この2つの関数はあると嬉しい人多そう
NumAniCloud
@NumAniCloud
Mar 15 2015 15:48
object.IsHit(object2); というふうに使うのですか?
swd
@durswd
Mar 15 2015 15:49
いや Object.IsHit( x, y , radius ) とか考えてた
NumAniCloud
@NumAniCloud
Mar 15 2015 15:51
なるほど
GetHitsがいまだにしっくりこない・・・
どんな時に使うのでしょうか
swd
@durswd
Mar 15 2015 15:54
範囲攻撃した時に、範囲にいるオブジェクトを全て取得とか
NumAniCloud
@NumAniCloud
Mar 15 2015 15:57
確かに使いそうですね
青のオブジェクトが当たり判定処理呼び出した時にこの情報取得するってのは
あ すいませんPartnerHits={"Hand"}です
修正版に差し替えました。リロードするとリンク先の内容更新されるみたいっすね
swd
@durswd
Mar 15 2015 16:04
格闘ゲームだとこうなるか
NumAniCloud
@NumAniCloud
Mar 15 2015 16:07
なんだか頭がごちゃごちゃしますし、どうすると嬉しいかを知るには研究を要する感がある気がします
サンプルコードを書いて見るなりして
swd
@durswd
Mar 15 2015 16:07
とりあえず、どういう実装にするかは別としてIsHitGetHitはあると嬉しいケースが多い(STG)
ああ、あとコールバック限定にすると
範囲攻撃ってそのたびにオブジェクト生成する必要あるんですよね
Asato Imanishi
@c-plus-c
Mar 15 2015 16:08
そうですね
だから重いなとは思いました
swd
@durswd
Mar 15 2015 16:08
コールバックを実装するか否かですね
NumAniCloud
@NumAniCloud
Mar 15 2015 16:08
どういうことですか?
Asato Imanishi
@c-plus-c
Mar 15 2015 16:08
この当たり判定情報を
そのコールバック呼び出しのために作らなきゃいけないということですよね?
swd
@durswd
Mar 15 2015 16:09
コールバック限定だと、範囲を取得するには、見えない円形のオブジェクトを生成しして、それのコールバックで衝突したオブジェクト一覧を取得してーという
Asato Imanishi
@c-plus-c
Mar 15 2015 16:09
これ以上の仕組みは普通は使い手が用途にそぐうように実装するもんですからなあ…
swd
@durswd
Mar 15 2015 16:10
まあ、そうねえ
コールバックって使い勝手結構難しいなあ
NumAniCloud
@NumAniCloud
Mar 15 2015 16:10
全然話についていけない
Asato Imanishi
@c-plus-c
Mar 15 2015 16:11
この場合エンジン側でシンプル化すると機能を限定してしまうという…
トレードオフだ(
NumAniCloud
@NumAniCloud
Mar 15 2015 16:12
「範囲攻撃ってそのたびにオブジェクト生成する必要あるんですよね」の「そのたび」というのは「毎フレームのたびに」ですか?
Asato Imanishi
@c-plus-c
Mar 15 2015 16:13
コールバックだったら まああたっている間毎フレームだろうねえ
NumAniCloud
@NumAniCloud
Mar 15 2015 16:13
当たっている間?当たっていなくても判定はするんじゃないですか?
swd
@durswd
Mar 15 2015 16:14
判定はしますが
コールバックだと
かならず見えない当たり判定でも当たり判定のためにオブジェクトを生成する必要があります
NumAniCloud
@NumAniCloud
Mar 15 2015 16:15
そうですね
swd
@durswd
Mar 15 2015 16:15
それって気持ち悪いなあ、と
あと重そう
NumAniCloud
@NumAniCloud
Mar 15 2015 16:15
なるほど。
GetHitsはどんな引数を渡して使うんでしょうか
Asato Imanishi
@c-plus-c
Mar 15 2015 16:17
>>かならず見えない当たり判定でも当たり判定のためにオブジェクトを生成する必要があります
このオブジェクトというのは?
swd
@durswd
Mar 15 2015 16:17
見えない何か
別にそれは範囲攻撃でもいいし、索敵でもいいし
NumAniCloud
@NumAniCloud
Mar 15 2015 16:18
確かに索敵範囲とかは見えないですね
swd
@durswd
Mar 15 2015 16:18
ただそのためにオブジェクト作る必要があるよね、という
GetHitsの引数は円とか□とか
NumAniCloud
@NumAniCloud
Mar 15 2015 16:18
索敵範囲オブジェクト・・・とかは確かに気持ち悪いですね
swd
@durswd
Mar 15 2015 16:18
はい・・・
NumAniCloud
@NumAniCloud
Mar 15 2015 16:19
GetHits(objects, shape)、objectsは判定対象オブジェクト群、shapeは索敵範囲など、という感じかしら
swd
@durswd
Mar 15 2015 16:20
範囲対象は取らなくてもいいと思います。そのレイヤー対象で
NumAniCloud
@NumAniCloud
Mar 15 2015 16:21
ふむ
swd
@durswd
Mar 15 2015 16:21
判定対象群自体が1万個とかあると辛そう(なさそうですが
レイヤーに4分木でオブジェクトもってそこにshpeで検索したほうが早そうなイメージです
Asato Imanishi
@c-plus-c
Mar 15 2015 16:23
Box2Dに投げるんじゃないんでしたっけ?
あっちもSetUserData使えますし
そっから逆引きすれば
swd
@durswd
Mar 15 2015 16:25
ええ
でも投げるために結局、範囲対象オブジェクト群は持てないでしょう
Layer.GetHitsWithCircle とか GetHitsWithSquare
とかそんな感じじゃないでしょうか
引数は形状データ
Asato Imanishi
@c-plus-c
Mar 15 2015 16:28
GetHitsWithCircle で指定した円と当たったオブジェクト一覧を取得するということです?
swd
@durswd
Mar 15 2015 16:29
はい
Asato Imanishi
@c-plus-c
Mar 15 2015 16:29
UserDataはその範囲オブジェクトを保持してるオブジェクトへの参照とソレ自身のタグ名ということになります?
swd
@durswd
Mar 15 2015 16:29
というのはとりあえずあったほうが便利だと思います
うーん
そのへんは要議論
userDataどうこうよりなんの情報が欲しいか
GetHitsWithCircleで
Asato Imanishi
@c-plus-c
Mar 15 2015 16:30
いろんな人からオピニオンを募るべきですかなあ
swd
@durswd
Mar 15 2015 16:30
いやーまとまらないね
NumAniCloud
@NumAniCloud
Mar 15 2015 16:31
私は長いこと当たり判定のあるゲームを作らなかったのでさっぱり・・・
Asato Imanishi
@c-plus-c
Mar 15 2015 16:31
でもこのさじ加減で当たり判定の機能の程度が決まってしまうんですよね…
RPGとか?
swd
@durswd
Mar 15 2015 16:32
とりあえずGetHitsで返すのはオブジェクトの一覧でいいのでは?
NumAniCloud
@NumAniCloud
Mar 15 2015 16:32
そうですね
そうですね
Asato Imanishi
@c-plus-c
Mar 15 2015 16:32
自分と相手がそれぞれどの部分に当たったかというのは持たないです?
swd
@durswd
Mar 15 2015 16:32
基本的に持たないかなあ
あまりあの手の情報当てにならなくて
GetHitsの場合
自分と相手じゃなくて相手だけですね
Asato Imanishi
@c-plus-c
Mar 15 2015 16:34
ああ 主に自分の当たり判定Shapeを引数にするからですか
swd
@durswd
Mar 15 2015 16:34
自分というか任意ですね
とりあえず寝ます
続きは明日・・・
NumAniCloud
@NumAniCloud
Mar 15 2015 16:35
おやすみなさい
Asato Imanishi
@c-plus-c
Mar 15 2015 16:35
おつかれさまですー
非コールバック式だったらGetHitsWithCircle(Rect)とかで普通に良さそうだな…
Asato Imanishi
@c-plus-c
Mar 15 2015 16:41
Box2D側で衝突したオブジェクトの一覧とか取れるのかね…
できるのか
てか考えてみたら当然だった