コミュニティアイコン プチコン 非公式コミュニティ プレイ日記

アバター
スケさん ◆YJjXHENp4drH
2018/6/6 12:45
デモプログラムを録画できるプログラムアップデートしました。VIDEO-SAISEIを起動してください。内容をとってあります。録画はVIDEO-ROKUGAでXでbgm再生、RでBEEP、十字上で録画中断で、キーボードで入力です。 VIDEO-SAISEIで見れます。 まだまだ改良の余地があります。改良してくれた人、公開キーくれると嬉しいです。
公開キー2JV4N3AJ

コメント

アバター
あきと 2018/6/9 14:52 ◆7TEpcjb/rk2E
改造はしませんが、ソースを見て思ったこと書きます。
・秒数を示す文字列と録画データのDATを別々にセーブしていますが、一つに出来るのでは?と思いました。
たまたまやってしまったんですが、最初の文字列のセーブをキャンセルして、次の録画データをセーブするという事をしてしまうと次に再生するときに秒数が違うと配列エラーになってしまいました。
・X[60*byou*l_c/60+2]のような配列参照の式が繰り返し出て来ますが、データの並びを変えたときに書き間違いをしやすいです。
NOWFRAME=60*byou*l_c/60
X[NOWFRAME+2]
のように書いて同じ式を複数回書かない方が間違いが少なくなると思います。

アクションゲームを作って、そのゲームのリプレイ再生をしたいのかなと思いました。もしくはデモシーンツールでしょうか。
アバター
スケさん 2018/6/9 22:23 ◆YJjXHENp4drH
出来ればひとつにしたいのですが、datをloadした時点でそれを受け入れる配列がないとなので先に秒を読み込ませ、それを元に配列を作ってます。
配列の自動拡張があればいいんですけどね…。
アバター
あきと 2018/6/9 23:20 ◆7TEpcjb/rk2E
配列は読み込むデータの大きさに合わせて変わります。
DIM X[0]
と定義してもLOAD後? LEN(X)で表示すると大きさがファイルの大きさになっていると思います
アバター
スケさん 2018/6/10 8:12 ◆YJjXHENp4drH
そうなんですか!
わかりました。最初の特殊変数に組み込んでおきます。
アバター
スケさん 2018/6/10 8:36 ◆YJjXHENp4drH
無理でした。X4もしくはXの前に+2しているのでフリーになったX4[2]、X[2]を使っているのですが、BGMPLAYで謎のエラーが起きています。
+2で他の変数には影響が当たらないようにしているのですが…。
公開キー4348E3GS
アバター
あきと 2018/6/10 15:42 ◆7TEpcjb/rk2E
VIDEO_SAISEIには配列はX[]一つしか無いのに範囲外エラーが出ると言うことはX[]を参照する計算が間違っているという事になります。

もう少し読んでみて一つ間違いを見つけました。VIDEO_ROKUGAの方ですが10行目でX4[2]に秒数を格納するように処理が追加されているのに9行目、126〜130行目の配列参照の際にX4[2+(60*L_C*BYOU…]と記述しているため格納位置がズレていますね。
X4[3+(60*L_C…]と書くのが正しいかなと。
アバター
あきと 2018/6/10 16:03 ◆7TEpcjb/rk2E
私の方ではVIDEO_ROKUGAの「2+」を「3+」に書き換えるのと、VIDEO_SAISEIの「2+」を「3+」に書き換えてもう少し配列参照の部分をいじって動作しました。

上のレスで書いた「複雑な式を何度も書くと変更したときに間違う」という罠にハマってしまっているので今のうちに書き方を修正したほうがいいですよ

私はX[3+(60*L_C*BYOU…]の長くなっているところを

DEF GETDATA(FRAME,NO)
’FRAMEは再生フレーム、NOはデータの種類
RETURN X[3+60*BYOU*NO+FRAME]
END

と書いてそれぞれの録画データを取り出すように関数化しました
アバター
あきと 2018/6/10 17:37 ◆7TEpcjb/rk2E
ソースコードにコメントを残した方が良いと思います。
もしかしたらこういうコメントを書いておけば自分で気付けたかもしれませんよ

’------------------
’ろくがデータこうぞう
’X[0]=データタイプ数(=5)
’X[1]=スプライトNO
’X[2]=録画秒数
’X[3〜]=録画データ(連続で格納
’  0-60*BYOU=スプライトのX座標
’  〜60*2*BYOU=スプライトのY座標
’  〜60*3*BYOU=SE
’  〜60*4*BYOU=BGM
’  〜60*5*BYOU=文字
アバター
スケさん 2018/6/11 10:27 ◆YJjXHENp4drH
コメントですか…。
DEFはまだ作ったことがないのですが
プログラムの文字を減らせますね。
試行錯誤してやってみます。
アバター
あきと 2018/6/11 22:36 ◆7TEpcjb/rk2E
関数化しなくても、最初に書いたように別に変数を作って代入して使い回すというのでもいいと思います。
文字数が少なくなるから便利なのでは無く間違えにくくなるからと言う方が重要かも。
アバター
あきと 2018/6/12 20:15 ◆Bz8zeG7wRHNQ
さらに追記。

今録画データはBYOU*60個分スプライトのX座標を格納して、次にBYOU*60個スプライトのY座標を格納。同じようにSE,BGM,文字と続いています。

データとして変では無いのですが、VIDEO_ROKUGAには最初に設定した秒数の最後まで行かなくても上キーで録画を終了する機能がありますよね。
ところが現状のデータ構造だと、最初に設定した秒数分のデータが必ず必要になります。30秒と設定して、10秒で録画をやめても60*30*5(+3)のデータが必ずセーブされます。

しかし、録画データを「X,Y,SE,BGM,文字」を配列に連続して配置して書き込むようにすれば録画をストップした所で録画データを終了させることができるようになります。

ここで、セーブデータの頭に入れるBYOUを考え直す必要がでてきます。BYOUでセーブデータに書き込んでいると60の倍数で録画データを書き込む必要がでてきます。ところが上キーで途中で止めることを考えると、1/60秒のどこで録画をとめるか分かりません。ということで、BYOUではなく最大60*BYOUとなるフレーム数で保存する必要がでてきます。
こうしてやれば止めた正確なフレームを記録する事ができる上、録画データもそのフレームとぴったり合わせたサイズで出力することもできるようになります。もちろん最後まで録画していた場合は60*BYOU*5(+3)のフルのサイズでSAVEすれば問題ありません。
多分、録画・再生でデータを描きだし・読み出すところも配列の頭出しをして+1,+2,+3,+4でデータ取り出せるのでソースコードもスッキリしますよ。

長くなってしまいましたが、今回この録画再生プログラムを解析してみて思ったことでした。たくさん指摘してしまって気を悪くしたらごめんなさい。この先拡張したりすることがあるのであれば考えるきっかけになれば。楽しんで作ってください。
アバター
スケさん 2018/6/12 21:14 ◆YJjXHENp4drH
おお、今ちょうど関数作りに苦戦していたところでした。
録画データーがちょうど秒数ぴったりにすることも考えていましたが、最初に記録用の配列を用意することを前提に作っていたので、なかなかできませんでした。
たくさんの指摘ありがとうございました。
また手におえなくなったときは、アドバイスを求めたりとか投げたりするかもしれません。(笑)
その時はよろしくお願いします。

コメントを書く

この投稿にはコメントできません。

- WEB PATIO -