HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0820
魔龍止まる命令を入れてないのに時々止まる9解決


魔龍

リンク

2016/8/20(Sat) 18:31:55|NO.76664

こんにちは。
音ゲーを製作しているのですが、ノートが思っているのと若干違う動きをするのが気になったので質問させていただきます。
実際に動いている様子がこれなのですが、
https://twitter.com/maryu3652/status/766687092466262018
このようにノートが動いて止まってを繰り返しながら落ちて来るんです。

プログラムはこれなのですが、
https://www.dropbox.com/s/in8ncs934zdyhw7/%E8%B3%AA%E5%95%8F.txt?dl=0
どうして、止まって動いて、を繰り返して落下しているのか分かりません。

プログラムを上手く整理してまとめられなくて申し訳ないですが、どうか教えてください。よろしくお願いします。



この記事に返信する


KOMARI

リンク

2016/8/21(Sun) 10:39:41|NO.76678

こんにちはー。

*game                 ;ゲームのメインはここです flame=flame+1 zoom=5 gosub*keycheck2 gosub*paint await16 //元wait 1 goto*game
少なくともwaitではなく、awaitを使うべきじゃないかとは思いました。
これで直るかは知りませんが。

時に、Q〜Pのコピペがすごいことになってますが…配列変数をうまく使えばいいと思いますヨ(・ω・)



魔龍

リンク

2016/8/21(Sun) 11:30:34|NO.76679

KOMARIさん、ご回答ありがとうございます!
waitからawaitに変えてみましたが、やっぱり同じような動きでした。。。

>>qからpのコピペがすごいことに…
配列変数の枠をもう一次元増やせば行けるとは思ったのですが、頭がこんがらがりそうなのでこのままにしておくつもりなのですが・・・
やはり直したほうがいいですかね?



リンク

2016/8/21(Sun) 11:37:38|NO.76680

画像ファイルが無いのでテストするに苦労します。
それはともかく速度面に関してうちでは一時停止などの異常は見られませんでした。
pcのスペックによってはpaint部の無駄な処理が速度に影響しているかも知れないですね。



Fuku

リンク

2016/8/21(Sun) 11:48:14|NO.76681

試してはいませんが、mmplay系の命令が影響しているのではないかと思います。
参考になれればよいのですが・・・



MillkeyStars

リンク

2016/8/21(Sun) 12:54:12|NO.76682

{|} は画面処理で空白は、wait として見る。

本来の要求は下記の通りであるが |wait |wait |wait |wait |wait... 画面処理が指定したウェイトより時間かかってしまっている為 |wait |wait |wait |wait |wait... 上記になっちゃっている。

10ms (ミリ秒) を最初から待機することがわかっているなら
|(2)wait(8) |(4)wait(6) |(6)wait(4)
//処理に 2 ms かかってるから wait を 8 にする。
などに待機時間処理を可変に変えればいい。
それでも誤差は生じるので、ある一定でPCのタイマー情報を用いて、タイミング調整などの処理を入れればいい。



KOMARI

リンク

2016/8/21(Sun) 14:15:04|NO.76684

直りませんでしたか…('A`)
他の方が言ってるみたいに、どこか(描画?)で処理落ちが起きてる気もしますね。(PCの性能的に)

>>やはり直したほうがいいですかね?
他人に"丁寧に"読ませたいつもりならば、直すのもひとつですね。
まあこれに関してあれこれ言うのは筋違いなので、基本的には自分が読めるならいいとは思います。
ソースがすっきりするのはいいことですが、自分が読めなくなっては本末転倒ですしね(・ω・)



MillkeyStars

リンク

2016/8/21(Sun) 14:52:38|NO.76686

テスト用モジュールと、主のスクリプトの一部を修正したスクリプト

#module sampleWait #define _STIME_Hour gettime(4)*60*60*1000 #define _STIME_Min gettime(5)*60*1000 #define _STIME_Sec gettime(6)*1000 #define _STIME_Ms gettime(7) #define _STIME_ACTIVE _STIME_Hour+_STIME_Min+_STIME_Sec+_STIME_Ms /*----------------------------------------------------------------- 【命令】ウェイトシステムの初期化を行う。 swait_reset p1 p1 : 周期タイミング(0ms 〜) -----------------------------------------------------------------*/ #deffunc swait_reset int _CycleTime _STimeStart = _STIME_ACTIVE _STimeLoopCycle = _CycleTime _STimeCycleCounter = 0 _STimeCycleSkipCounter = 0 return /*----------------------------------------------------------------- 【関数】スクリプトを一時停止する。 p1 = swait() 引数はありません。 p1 : 戻り値に、ウェイトできなかった周期分の数が代入されます。 -----------------------------------------------------------------*/ #defcfunc swait //現在の時刻を取得 _ActiveTime = _STIME_ACTIVE //最初の時刻からどれだけ経過しているか計算する _CalcTime = _ActiveTime - _STimeStart _CalcCycle = _CalcTime / _STimeLoopCycle //周期カウンタと現在の周期位置を比較する if (_CalcCycle = _STimeCycleCounter){ //一致する場合は、そのまま余り時間を待機時間として待機させ関数を抜ける _CalcTimeLost = _STimeLoopCycle - (_CalcTime \ _STimeLoopCycle) _STimeCycleCounter++ //mes "Module aWait : "+_CalcTimeLost+" From : "+_ActiveTime+" / "+_CalcTime+" / "+(_CalcTimeLost + _CalcTime)//テスト用 await 0 await _CalcTimeLost return 0 } //一致しない場合は、遅延分の周期カウントを計算し関数の戻り値に設定し関数を抜ける //mes "Module Not aWait : "+_CalcTimeLost+" From : "+_ActiveTime+" / "+_CalcTime+" / "+(_CalcTimeLost + _CalcTime) //テスト用 _ReturnSkip = _CalcCycle - _STimeCycleCounter _STimeCycleCounter = _CalcCycle _STimeCycleSkipCounter+=_ReturnSkip return _ReturnSkip /*----------------------------------------------------------------- 【関数】sampleWait のウェイトできなかった総回数を取得します。 p1 = swait_end() 引数はありません。 p1 : 戻り値に、ウェイトできなかった周期分の総数が代入されます。 -----------------------------------------------------------------*/ #defcfunc swait_end return _STimeCycleSkipCounter #global

主の一部部分のスクリプトを変更

*gamestart mmstop flame=0 mmplay mn swait_reset 10 goto*game *game;ゲームのメインはここです // flame=flame+1 zoom = 5 gosub*keycheck2 gosub*paint SkipFlame = swait() flame += SkipFlame //ウェイト不能分のフレームをスキップさせる flame++ if flame >= 500 : dialog "フレームスキップされた回数 : "+swait_end() : stop goto*game



魔龍

リンク

2016/8/21(Sun) 19:20:04|NO.76690

ご回答くださった皆様、本当にありがとうございます

>>画像ファイルがないので
本当に申し訳ありません。以降気をつけます。

>>PCのスペックによってはpaint部の無駄な
確かに、テスト用なので余計な処理は多いです。
しかし、ノート以外の命令を全て消しても、特に変わりませんでした・・・。
やはり私のPCの問題なのだろうか。。。

>>mmplay系の命令が
使ってる曲がそれほど長くないし、まだ1曲しか入ってないので、mmplay系が関係しているとはちょっと考えがたいです


>>PCのタイマー情報を用いて
つまり、現実世界での実際の時間差に同期するようにすればよい、ということでしょうか?

>>テスト用モジュールと・・・
ありがとうございます!!試してみたところ、確かにかくつきはなくなりました。
スキップされたフレーム数が117、と出たのですが、それというほど違和感はなくていい感じでした。



魔龍

リンク

2016/8/21(Sun) 19:24:54|NO.76691

MillkeyStarsさんのテスト用モジュールを参考に改良することにしました。
皆様本当にありがとうございました!



ONION software Copyright 1997-2023(c) All rights reserved.