ページ 1 / 1
iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月26日(火) 13:08
by レイ
iPhoneアプリでどうしてもとれないバグが3点あります。
共同でアプリ開発をしている人が逃亡wしてしまったのでこちらにて質問させて頂きました。
10/30に文化祭がある為、どうしても間に合わせたいです。
8月からコチラで色々と質問して何とかオリジナルライブラリを作るところまでたどり着いたので
今回の機会だけは見逃したくありません・・・。
皆様のお力添えを頂けないでしょうか。
私のプログラムレベルとしましてはゲームを作ったことは少しあり
今回のソースのやってることは大体理解できます。
このゲームのルールとしましては
メダルの向きを揃えて同じ色のゴールに入れると行ったものです。
通常モードとフィーバーモードがあり
通所モードではメダルが1つしかなく向きを合わせないといけませんが
フィーバーモードでは向きを合わせなくてもどのゴールに入れてもOKの仕様になっております。
今回はそのフィーバーモードで問題が起こってしまっております。
現在のソースでは一回正しいゴールを決めれるとフィーバーモードに入るように設定してあります。
問題点は下記の3点です。
1点目
フィーバーモードの時にタッチをすると周りの4つがピクっと動いてしまう
2点目
フィーバーモード時に周りの4つのメダルをタッチして飛ばした時のメダル同士の判定がない
又、連続であたり判定が行われることがありメダルが動かなくなってしまう。
3点目
フィーバーモード時にゴールした後に所定の位置にメダルが戻すのですが
このとき所定の位置にメダルがない時のみ復帰させたいです。
宜しければで構いませんので修正案的なことを頂けないでしょうか。
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月26日(火) 13:15
by レイ
Macがある人しか見れませんがプロジェクトを置かせて頂きます。
http://www1.axfc.net/uploader/O/so/141252
PASS:yakata
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月27日(水) 01:18
by レイ
色々と修正してみたのですがやはり謎が解けません・・・。
やはりMAC環境で開発している方はあまりいないのでしょうか?
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月27日(水) 08:42
by レイ
何度もすみません・・・
2点目の判定がないのは自分以外のメダルとのHitMedal関数を呼んでいないことでした
ただしこれらをよんでしまうと当たると2回当たり判定がカウントされ変な処理になってしまいます。
30日までにどうしても解決したいんです・・・
皆さんには知ったことかと思われてしまうかもしれませんが
30日の為に時間を掛けてきたので修正点のアドバイスを頂けないでしょうか?
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月27日(水) 11:06
by 一般的な名前
仕事仲間で解決すべき
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月27日(水) 11:14
by レイ
>>一般的な名前様
そうですよね・・・ただどうしても間に合わせたいんです。
逃げてしまったのはしょうがないので私が何とか形にしたいのです。
自分勝手なのはわかっております・・・。
色々と修正してみてはいるのですがこの3点だけ不具合がどうしてもとれません><
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月27日(水) 16:04
by NNN
回答ではありませんが、コンパイル実行できないなら
せめて画像を貼るなどすると見る側もイメージしやすいのではないかと。
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月27日(水) 17:06
by レイ
NNNさん
ご回答ありがとうございます。
現在はフィーバーモードは添付した画像の感じです。
文字は実際には表示されてません。これが何の変数なのかです。
各メダルをフリックしてゴールに入れるとまた画面の位置にもどりいれられる状態になります。
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月27日(水) 23:54
by Justy
>1点目
MEDAL::HitMedal で [color=sans-serif]if( !System.touch.Flag )[/font] で通常はここは真になるので
通過しスピード・移動ベクトルが変更されますが、タッチした時は偽となりこのルーチンを通過しないので
ずれが発生しています。
また、微妙に絡んでいますが、 MEDAL::MedalMove も少しおかしいです。
スピードが0以下になって Speed を 0にするのはいいのですが、 Vx や [color=sans-serif]Vy[/font] の再初期化が行われていません。
>3点目
「所定の位置にメダルがない時のみ復帰」というのは所定の位置にあった場合は
二度と復帰しないということでいいでしょうか?
MEDAL::MedalGoal の2つ目の if文が偽だった場合の処理がそのリセットしているところですが、
ここで [this->initX, this->initY] 付近にメダルがあったら非表示にし無効にする
(以後の移動処理やコリジョンチェックなどを行わない)処理を入れてください。
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月28日(木) 12:36
by レイ
Justy様
ご回答ありがとうございます!!
文化祭が30日なのでなんとか間に合わせたいのですが
回答を頂けなかったので正直諦めかけておりました。
なんとか色々弄ってみたのですが解決策には至りませんでした。
Justy様のアドバイスを元に修正しました所
1点目と3点目は改善できてそうです!!
本当にありがとう御座います。
3点目はメダル同士の当たり判定が無限になるのを避けるため
当たり判定がない時のみ生み出す様な感じにしようかと思っております。
Flagがtrueの時のみに移動処理等をするようにして改善できました。
残るは2点目のメダル同士の当たり判定なのですが
これはこのソースでの実装は難しいのでしょうか?
宜しければで構いませんのでもう一度アドバイスを頂けないでしょうか?
現在のソースを添付させて頂きます。
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月28日(木) 14:11
by レイ
皆様のアドバイスのお陰で惜しい所まで来ました!!
Medalを動かした時の当たり判定は問題ありません。
Fever~を動かすと同じ場所に重なってしまい当たり判定がspeedが0になるまで続いてしまうことがあります。
Loop関数内の下記のコメントを外さないと判定が出来ないのですが
判定をすると上記の現象が起こってしまいます。
何とか回避したいです。
皆様のお時間を頂戴して申し訳ないと思うのですがもう一度ソースを見ては頂けないでしょうか?
// あたり判定
// if( Fever.Speed != 0 ) Fever.HitMedal( Medal );
// for(int j=0; j<4; j++) if( i!=j && Fever.Speed != 0 ) Fever[j].HitMedal( Fever );
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月28日(木) 17:37
by ISLe
メダルが近付いていくときだけ当たり判定するようにしないといけないのでは?
対象メダルと被対象メダルの移動ベクトルの内積の符号を見るとか、角度を比較するとか。
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月29日(金) 06:14
by ゆーずぃ
ISLeさんと同感です。
if(対象メダルの座標 != 比較対象メダルの座標)
当たり判定
って感じでしょうか。
数式がちょっと…というのならどこかを基準にした移動量をそれぞれのメダルに持たせてはどうでしょう。
x,y共に真ん中が基準なら右、左でx +1,-1 上下でy -1,+1などです。
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月29日(金) 18:46
by レイ
皆様ご回答本当にありがとうございます・・・。
iPhoneアプリを作っているのは僕のチームだけなので
後、一つのバグを何とか明日までにとりたいです。
>>ISLe様
すみません・・・ベクトルがよくわかりません・・・。
貴重な意見を頂いているのに本当にすみません。
>>ゆーずぃ様
if文まで書いて頂きありがとうございます。
当たり判定(HitMedal関数)は今のままのでいいのでしょうか?
そのように書いては見たのですがやはり同じように当たり判定がバグり繰り返されて
メダルの移動量が無くなるまで動けなくなってしまいます。
>>x,y共に真ん中が基準なら右、左でx +1,-1 上下でy -1,+1などです。
これはどのような意味でしょうか?
描画は中心原点で描画しております。
Medal.item.xの位置が中心点となっております。
説明がなくてすみません。
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月29日(金) 19:46
by ゆーずぃ
HitMedal関数の中身はまだあまり詳しく見ていませんが、それでその回の判定以外におかしな判定をするところが無いのなら大丈夫だと思います。
x,yの話は単純に座標情報の話です。
>Medal.item.xの位置が中心点となっております。
とあるので、~.item.x又はyが座標情報なのでしょう。
とりあえず何とも言えないので、改善版のソースを引用してもらってもいいですか?あと、Fever.Flagは何のフラグとして使ってます?デバッグしていて数値がマイナスになったり気になることとかはありませんか?
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月29日(金) 20:35
by レン
ご回答ありがとう御座います。
お忙しい中、何度も何度もご回答非常に感謝しております。
現行のソースを添付させて頂きます。
ご指摘いただいた座標から見るif文を書くと現在と似た様なバグが出るので消してあります。
中央メダルからフィーバーメダルへの当たり判定
フィーバーメダルから中央メダルの当たり判定はうまくいきます。
しかしフィーバーメダル同士の当たり判定だけうまくいきません。
同じ位置で重なって無限に判定されてしまったりします。
Loop関数内の下記のコメントを外せばフィバーメダル同士の当たり判定を行うのですがこれがうまくいきません。
//for(int j=0; j<4; j++) if( i!=j && Fever.Speed != 0 ) Fever.HitMedal( Fever[j] );
Fever.Flagは画面に表示するか、及びタッチした時の移動処理の判定をするかといった関数です。
Justy様から頂いたコリジョンチェックを行わないと言った様に使っております。
-1等はなっていないと思うのですがまずい処理をしておりますでしょうか?
ソースが汚いので変な処理をしていたら本当にすみません><
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月29日(金) 20:55
by レン
すみません・・・実機テストしてみたところ
if( Fever.Speed != 0 ) Fever.HitMedal( Medal );
のコメントを外していると同じ位置で判定されることがあるみたいです。
もしかしたらメダル同士の当たり判定をするとき
MedalとFeverの当たり判定をした後にFeverとMedalの当たり判定を行っているので
tx,ty(移動方向の反転 これがtrueなら移動方向*-1されます)が2回しているので可笑しくなっているのかもしれません・・・。
ただもしそうだったとしてもこれの修正方法が思いつきません。
全く見当違いだったらすみません・・・。
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月29日(金) 20:56
by レイ
すみません。
Macからの書き込みでなれていなノートパソコンからの
打ち込みだったのでHNを間違えてしまいました。
私はレンではなく質問者のレイです。
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月29日(金) 21:31
by ゆーずぃ
ずばりそれな気がします。
1回目if( Fever.Speed != 0 ) Fever.HitMedal( Medal );
2回目if( !HitCircleCircle( Medal.item.x, Medal.item.y, Fever.initX, Fever.initY, 40) ){
if( !Fever.Flag && Medal.Speed == 0) Fever.Flag = true;
ですよね?
修正方法としては、適当な変数を用意して頭で一回FALSEを入れます。そして1回目のチェックの後にTRUEをいれます。そして2回目のチェックの時にFALSEなら判定処理を行い、TRUEなら判定処理を行わないようにします。
ところで、試しに2回目のループにコメントを入れて実行してみて下さい。正常(重ならないという点のみ)に動きます?
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年10月29日(金) 21:50
by ゆーずぃ
一つ気になったのですが、2回目の
if( !HitCircleCircle( Medal.item.x, Medal.item.y, Fever.initX, Fever.initY, 40) ){
if( !Fever.Flag && Medal.Speed == 0) Fever.Flag = true;
}
ではFever.initXとFever.initYを入れてるのは合ってます?Fever.item.xとFever.item.yではなく?
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年11月01日(月) 12:53
by レイ
文化祭が終ってしまいましたが何とか完成まで作りたいのでこのバグだけはとりたいです。
>>ゆーずぃ様
ご回答を頂いた中、返信が遅れてしまい申し訳ありませんでした。
これは多分あっております。
メダルのフラッグがfalseの時に初期位置にメダル同士の
当たり判定がなかったら表示されるようになっております。
if( !HitCircleCircle( Medal.item.x, Medal.item.y, Fever.initX, Fever.initY, 40) ){
if( !Fever.Flag && Medal.Speed == 0) Fever.Flag = true;
}
また、HitMedal関数に当たったらtrueの戻り値を吐き出すように修正してみたのですが
一回でもtrueなら以後の判定をしないように修正してみました。
しかし、どうやらHitMedal関数がおかししそうです。
当たっていたら座標を当たる前に戻し移動方向を反転させ当たったメダルにも移動量を与えております。
当たらなかったら座標をhitAfterという変数に入れております。
これがおかしいみたいなのですが何とか解決したいです・・・。
Re:iPhoneアプリ どうしてもとれない不具合
Posted: 2010年11月01日(月) 16:10
by ISLe
HitMedal関数の当たり判定に
if ((this->Vx * data.Vx + this->Vy * data.Vy) < 0) {
// 互いに近付く方向へ移動している
}
とか
if ((this->Vx * (this->item.x - data.item.x) + this->Vy * (this->item.y - data.item.y)) < 0) {
// 相手の座標に近付くように移動している
}
という内積を使った判定を適当に加えてみると良いかもしれません。
ただし一度に移動する量がメダルを飛び越えてしまうほど大きいと正しく判定できません。
その場合は細かく回すか他の判定方法を使ってください。