オブジェクトの明滅
投稿者 : mmm(softbank219055097076.bbtec.net)
- 2011/04/30(Sat) 23:51
No.12990
|
|
|
|
|
12990.zip
お久しぶりです。毎度のことながら問題が発生し、自分の手に負えないので解決していただきに参りました。
DXキャラで、弾を発射する奴(青い丸い奴)を作ったのですが、 上まで行って弾を発射し終わった後、何回か明滅します。 ポーズをかけて取れるような長さの明滅ではなく、 オブジェクトインスペクタにも表示されないので、 何が原因なのか分かりません。
また、明滅しているときは当たり判定も消えているようです。 $syuの撃った弾が当たってもそのまま貫通してしまいます。 なのでダメージあたり判定が取れずとても困っています。 お願いします。
|
Re:オブジェクトの明滅
投稿者 : リセッタ(em1-112-128-65.pool.e-mobile.ne.jp)
- 2011/05/01(Sun) 00:43
No.12992
|
|
|
|
Re:オブジェクトの明滅
投稿者 : リセッタ(em114-48-41-155.pool.e-mobile.ne.jp)
- 2011/05/02(Mon) 15:14
No.12994
|
|
|
|
zipファイルが空なので、ソース見ていないけれど、
>ポーズをかけて取れるような長さの明滅ではなく、オブジェクトインスペクタにも表示されないので
時間が短すぎるなら、伸ばして確認しましょう。
while(1) { //いろいろ処理 //------ 追加 ------ if(getkey(17)) updateEx(30); // getkey(17):[ctrl]キー押下で、0.5SecWait //---- ここまで ---- update(); }
上の様にデバッグ用に修正、現象が起きる少し前に[Ctrl]キー(修正例の場合)を押して waitを掛けてインスペクタで調べるなりなんなりしてみてください。 もしくは、全てのクラスの'update()'メソッドを'updateEx($dbgWait);'に変更して、 管理(自機)クラスで変数'$dbgWait'を通常は'1'、現象前に'30'にする仕掛けにしたり、'$System.setFrameRate()'でフレーム数を弄ったりして時間を延ばしてデバッグしてみてください。
|
Re: オブジェクトの明滅
投稿者 : Percentage(p39206-ipngn1002souka.saitama.ocn.ne.jp)
- 2011/05/07(Sat) 14:34
No.13017
|
|
|
|
中身入ってましたけど…当方Lhaplus1.58で解凍しました。
ただ、弾を発射するやつ(青い●?)が見つかりません。 赤い●ならありましたがw
ちょっと関係ないけど、一応バグみたいなものを修正しておきます。 [syu.tonyuの最後のほう] if(x > 360){ $map.scrollTo(360,54); // ここ }
$map.scrollTo(360.54);になっていました。 多分これで狙い通りスクロールするはずです。
青い●が点滅する理由はわかりません。_visibleをいじっていたり、setVisibleを使っている個所がないか調べてください。
あがっているやつは多分別のプロジェクトだと思います。
|
Re:オブジェクトの明滅
投稿者 : リセッタ(em114-48-47-117.pool.e-mobile.ne.jp)
- 2011/05/07(Sat) 18:18
No.13018
|
|
|
|
# WinRARで見たら中身あったよ
◎オブジェクトに未定義キャラクタ番号を指定すると? 'DxChar.p'や'SpriteChar.p'に未定義キャラクタパターンの番号をしていすると以下の現象になります。 ・表示が消える ・パターンのサイズが'0*0'になる。 ・当り判定('crashTo()'等)が効かない(いつも偽) ・画面上のオブジェクトをクリックしても、インスペクタが無反応。
◎アニメーション('newAnimation()'メソッド使用)時の注意 ループ('loop()'等)パターン中に、未定義パターンがないようにする。 未定義パターンがあると、未定義パターン表示時に上記現象が起こり点滅や消滅が起こる。 ($pat_XXX+2迄しかパターン定義していないのに、 Animation.swing($pat_XXX+0,$pat_XXX+7,10); // $pat_XXX+7迄パターンが無いと (x x や Animation.play($pat_XXX+0,$pat_XYX+7,10); // $pat_XYXって無いじゃん (w の様にしては駄目)
現象を考えるとこれが可能性が高いと思います。
# 追加キーワード ブリンク 当たり判定
|
Re: オブジェクトの明滅
投稿者 : mmm(softbank219055097076.bbtec.net)
- 2011/05/09(Mon) 20:04
No.13024
|
|
|
|
13024.txt
返信が遅れてすみません。 みなさんの案を試してみましたが、とりあえず自分に理解できている範囲では治りませんでした。(まったく理解していない様なちんぷんかんぷんな事を言っていたらすみません)
>>未定義パターンがあると、未定義パターン表示時に上記現象が起こり点滅や消滅が起こる 確認しましたがあっていると思います。 設定のし忘れもありません。
>>時間が短すぎるなら、伸ばして確認しましょう。 不定期に現象が起こっているので、現象が起きる直前に何か処理をやる、というのは難しいです。
>>中身入ってましたけど――弾を発射するやつ(青い●?)が見つかりません。 たぶん複数のファイルを同時に圧縮してしまったからだと思います。今度はプログラムだけ載せたので、少しは分かりやすくなっていると思います。
>># 追加キーワード ブリンク 当たり判定 ありがとうございます。調べてみます。
どうしようもなくなったらこのボスキャラはとりあえず諦めようと思っています。
あと、updateEx($dbgWait)の$dbgWaitについて教えていただけるとありがたいです。
|
Re: オブジェクトの明滅
投稿者 : mmm(softbank219055097076.bbtec.net)
- 2011/05/09(Mon) 20:11
No.13025
|
|
|
|
追記: >>$map.scrollTo(360.54);になっていました。 すみませんそれも昔のプログラムです。
>>_visibleをいじっていたり、setVisibleを使っている個所がないか調べてください。 調べましたが、setVisibleを使っているのは$syuだけなのでそれが原因ではないようです。
いま思ったのですが、もしかして$dbgWaitはwaitする長さですか?
|
Re:オブジェクトの明滅
投稿者 : リセッタ(em114-48-85-140.pool.e-mobile.ne.jp)
- 2011/05/09(Mon) 21:11
No.13026
|
|
|
|
>今度はプログラムだけ載せたので… いや、状況が確認できる状態(プロジェクトのファイル全て)を圧縮して添付してもらわないと無理。
>いま思ったのですが、もしかして$dbgWaitはwaitする長さですか? デバッグ用のWait時間(ms)です。
>不定期に現象が起こっているので、現象が起きる直前に何か処理をやる、というのは難しいです。 不定期?もしかして一発で現象を捉える方法でもあると思ってるの?捉えられるまでやるんだよ。 (大体、一発で捉えられる=現象発生場所は判っているはず) >上まで行って弾を発射し終わった後… 状況はこうじゃないの?弾を発射し終わった時ってのは不定期なの? こういう状況になったらWait入れるように罠かければいいじゃん。罠に掛かって、現象が発生するまで何回も(罠を入れない不具合発生頻度の2倍くらいまではがんばれ)繰り返すんだ。
=================================
ものが全然ないので、推察ですが
if(koudou==2){ for(i=0;i<11;i++){ appear(new b2tama2(x,y,$pat_boss2+16)); wait(2); } for(b in $chars){ if(b is bullet && crashTo(b)){ alpha=255; $B2.hp--; b.die(); $syu.wepon--; print($B2.hp); anim.loop($pat_boss2+21,$pat_boss2+20,10); } } wait(40); koudou=3; } ここが 問題の発生している場所かな? ・アニメループが変 anim.loop($pat_boss2+21,$pat_boss2+20,10); // fromがtoより大きい ・wait(40)で待っている。 自分なら // wait(40); // koudou=3; koudou=2.5; i=40; } if(koudou==2.5) { if(i) i=i-1; else koudou=3; } にする。 ※ wait()メソッドが ちょこちょこ入ってるけどデバッグ用じゃないと仮定すると wait()の時点でスレッドは指定分フレーム待ちになります。 当然、その間は下の方にある当たり判定は実行されません。 "wait(3);"は"update(); update(); update();"に相当(厳密には違う)って判っています?
ん〜そのちょい上で弾発射かな?同一座標からzOrder指定無しでオブジェクト作成・実行してるけど… for(i=0;i<11;i++){ appear(new b2tama2(x,y,$pat_boss2+16)); // ここね zOrderがボス?と弾が同じ(共にnull)だから、TonyuSystemの 描画タイミングで[ボス?]描画→[弾]描画でボスの画が消えてるんじゃないの?で明滅しちゃうとか?
|
Re: オブジェクトの明滅
投稿者 : mmm(softbank219055097076.bbtec.net)
- 2011/05/10(Tue) 20:45
No.13029
|
|
|
|
>>wait()の時点でスレッドは指定分フレーム待ちになります。 >>当然、その間は下の方にある当たり判定は実行されません。 なるほど。wait()はそこでいったんプログラムを進ませないようにしているから、当たり判定も消えていたんですね。
>>zOrderがボス?と弾が同じ(共にnull)だから、――描画タイミングで[ボス?]描画→[弾]描画でボスの画が消えてる zOrderを設定してみましたが、変わりませんでした。
|
Re: オブジェクトの明滅
投稿者 : mmm(softbank219055097076.bbtec.net)
- 2011/05/10(Tue) 23:12
No.13033
|
|
|
|
追記: 結局wait()の代わりにupdateEx()を使い、onUpdate()で当たり判定を取りました。 とても面倒な方法ですが(if(i) i=i-1; else koudou=3;のほうが楽)、個人的な理由もあってこちらを使うことにしました。 明滅は当たり判定がなくなる原因かと思って載せたのですが、関係ないようなのでいいです。 気にしなければ気にならない程度の明滅なので。
|
Re: オブジェクトの明滅
投稿者 : Percentage(p39206-ipngn1002souka.saitama.ocn.ne.jp)
- 2011/05/12(Thu) 01:56
No.13034
|
|
|
|
なんか解決したように見えますが、一応完成プログラムのデバッグ方法として一つ。 ・まず、ブロック({から})の先頭にprintを入れて、適当な値を書き出してみる。 mmmさんのような場合、waitはなるべく避けてください(waitしか跡を残す方法がないならしょうがない)。私の経験則から言って、この場合はprintの方がいいです。 ・次に、実行して、エラーが起きた時のステータスバーの文字列を確認、その文字列を出力している場所を特定。 検索かけたほうが早いです。 ・エラーメッセージやエラー時の情報、対応文を書き出し(どこでもおk)、前者2つで問題を提起、全部を通して解決策を提起してプログラムを修正。 この最後の部分はデバッグに於いて重要です。という風にこないだ高校で習いましたwwww
まぁこれはどんな言語でも通じますし、実際「1回目は起きないのに2回目以降起きる不思議現象」の時はwaitはむしろ邪魔な存在になります。
余談ですが、フレームレートを弄るのはエフェクトの確認以外使いません(私はね)。
解決したのに横レス失礼。 フォルダの圧縮にはLhaplusがオススメです(
|
Re: オブジェクトの明滅
投稿者 : mmm(softbank219055097076.bbtec.net)
- 2011/05/20(Fri) 22:27
No.13042
|
|
|
|
>>Percentageさん >mmmさんのような場合、waitはなるべく避けてください(waitしか跡を残す方法がないならしょうがない)。
wait()しか跡を残す方法が無いからではなく、ゲームの便宜上、2,3発目の発射するまでの間隔 を空けたいからです。個人的にはprint()のほうがデバッグに使う頻度は高いです。(今回ばかりはそうでもないようですが)。
明滅の件ですが、 あのあとよく目を凝らしてみると、うっすらとですが見えるような気がするので、alpha値の影響だと思います。 余計なところでalpha値の代入がなされているとか、alpha値の変動が自分が予期していたものと違うものだったとか(alpha値をプログラムの中で変えているので)、 そういうのが原因っぽいです。
|
Re: オブジェクトの明滅
投稿者 : mmm(softbank219055097076.bbtec.net)
- 2011/05/20(Fri) 22:39
No.13043
|
|
|
|
追記:改行が変なところで入ってしまい、読みづらくなってしまいました。すみません。
Percentageさん、一応とはいえ解決したのにもかかわらず御助力くださったことに感謝します。
>>エラーが起きた時のステータスバーの文字列を確認、その文字列を出力している場所を特定。 「ステータスバー」というのは画面下のバーですよね。 printの数値ぐらいしか表示されたことが無いのですが、 「ステータスバー」というのは、コンソールウィンドウのことですか? ちなみにエラーではありません。(文法エラーとかのエラーなどのことを指している場合ですが)
|
Re: オブジェクトの明滅
投稿者 : mmm(softbank219055097076.bbtec.net)
- 2011/05/20(Fri) 22:48
No.13044
|
|
|
|
>>リセッタさん >上まで行って弾を発射し終わった後… 状況はこうじゃないの?弾を発射し終わった時ってのは不定期なの? 勘違いされているようなので一応言っておきますが、上に行き発射した後も、しばらくwaitが入ります。 自分のプログラムを見られたのなら分かったと思うのですが。 そのwaitの時にチカッ,チカッと何回か点滅するんです。 状況説明が不十分ですみませんでした。 点滅に関してはまとまったのでいいです。ありがとうございました。 返信が遅くなり申し訳ありませんでした。
|
Re: オブジェクトの明滅
投稿者 : リセッタ(em114-48-44-172.pool.e-mobile.ne.jp)
- 2011/05/21(Sat) 11:40
No.13046
|
|
|
|
>勘違いされているようなので…… してないよ? プログラムの最初からupdateEx()等で間隔を伸ばすと現象が起きるまで時間がかかるよね? その少し手前でフレームレイトを伸ばす罠をかけて、print()メソッド等で必要な値やトレースをすれば? って趣旨なんだけど?そんなに分かりづらい? >「ステータスバー」というのは…… >printの数値ぐらいしか表示されたこと…… コンソールウィンドウにも出るけど、ステータスバーにも出ます。 数値ぐらいしかじゃなくて、必要な情報を自分でださないと
print("p1:x="+x"/y="+y); // debug if(!a) { b.die(); print("p2:x="+x"/y="+y); // debug } else { x+=3; y-=2; print("p3:x="+x"/y="+y); // debug } print("p4:x="+x"/y="+y); // debug
上記例)オブジェクトの動き(move)が変。動きに関係する変数はまずはx,yなので監視すると共にトレースを行う。 p1→p2→p4ならtrueルート、p1→p3→p4ならfalseルート 本来予想されるルートと変数値の違いから原因を探ります。 ※上記例でp2,p3を挿入する意味があるのか?と疑問に思うかも知れませんが、 1.あくまで例として記述している 2.変数aを調べればトレース(ルート調査)は要らないでは、バグは潰せません。(デバッグは忍耐です) 思い込みバグは本来'if(a)'や'if(b)'ならばプログラムが'if(!a)'なのに気づくことが困難です。 >点滅に関しては…… α値までは気がついたのね。 自分は未確認だけどα値を監視してみて、多分255超えているんじゃない? 予想ではα値の実効値は'amod(alpha,256)'(signed char)か、範囲外は0だと思う。 (気になるならインスペクタで確認してみて)
|
Re: オブジェクトの明滅
投稿者 : Percentage(p39206-ipngn1002souka.saitama.ocn.ne.jp)
- 2011/05/21(Sat) 13:30
No.13047
|
|
|
|
うっすらと見えるんですか…。 やっぱalphaがどっかで変わってるんですね。
ちなみに、alpha値は255を超えても不透明のままですよ(経験済み)。 Tonyu Systemは型無し言語、整数型は全部signed intみたく管理されてますから。
>wait()しか跡を残す方法が無いからではなく... あ、あくまでデバッグ時の話ね。 完成に必要なwaitまで避けろと言ったのではありません。 printはステータスバーでもコンソールでもどっちにも表示するのでどっちを参考にしてもいいのですが。
なかなかスレがでっかくなってきましたな…。
|
Re: オブジェクトの明滅
投稿者 : mmm(softbank219055097076.bbtec.net)
- 2011/06/06(Mon) 22:39
No.13056
|
|
|
|
お久しぶりです。しばらくBBSには足を伸ばしていなかったので、 返信してくださったとも気づかず、すみませんでした。 >>リセッタさん >予想ではα値の実効値は'amod(alpha,256)'(signed char)か、範囲外は0だと思う。 言われてみると確かに、明滅というよりは、徐々に濃くなっていって急に薄くなる、という風にも見えます。 しかし、Percentageさん曰く 「alpha値は255を超えても不透明のままですよ。」 とのこと。
その前のalpha+=10が正常に動いていないのでは、とも思いましたが、 一応、if(alpha>250) alpha=200 を入れてみると、周期的に明滅が起きます。 ということは、おそらく正常に働いていると思うのですが。
さらに、もう一度点滅(?)をよーく観察すると、 濃い状態と薄い状態が交互に現れるような点滅と、 薄い状態がしばらく(といっても0.5秒ほどですが)続くような点滅があるようだ、ということに気づきました。 あと、ダメージを与えたとき(要するに点滅する奴がダメージを受けたとき)は点滅しないようです。
毎度々々情報量が少なくてすみません。こんなですがお願いします。 一応もう一度添付に挑戦してみます。(添付方法がいまだによく分からないんです)
|
|