堕天使の煉獄
2014-08
03
00:52:24
ちゃんと作ろうと思うと……
相変わらずPG三昧。
以前つくったゲーム用のライブラリをc++11で組み直しているのですが
その際に、わりといい加減に、とりあえず動けばいいや的な実装のところを
きちんと組み直してたりもするのですが
ちゃんときっちり組もうとおもうと、大変だなぁとか。
つい先日は、フレームレート周りの実装なんかを作り直してたり。
今までのは単純に60fps固定でウェイトかけてるだけだったのですが
割と最近では、安価なモニタや、モバイル系とか
省電力設計とかでリフレッシュレートが30hzの物も最近は多いとか。
んで3Dテレビ? なんかは120hzが普通だとかで。
なので60hzを想定して、60fps固定にしちゃうと
そういうモニタでプレイするとゲームスピードが変わってしまうわけで。
その辺の対応とかもちまちまと。
この辺の解法は大まかには二つあって
時間単位の移動量を算出して、フレームレートに依存しないゲームスピードにする方法と
描画をフレームスキップして調整する方法の二つ。
後者の方がゲームスピードをフレーム数で管理できるので楽ちんだったりするので
そちらを採用しました。
前者のは座標系の精度を上げる必要があるし
フレームレートが落ち込んだときに移動量がどっと加算されるので
あたり判定のすり抜け問題とかもあるし、いろいろと一筋縄ではいかなそうだったので。
あとは、エミュとかでは普通にある
ゲームスピードを変更(倍速とか)機能も欲しいよなーと。
世の中の市販ゲームは、なんでこんなもっさり動作なのかといらつく物が多い。
ミンサガとかミンサガとか、そうミンサガとか。(イクゾー)
もはやいまさらミンサガは実機ではプレイ出来ないレベルw
もともとアクションゲームとか興味ないかんじなので
RPGみたいなものつくったとして、
フィールドタイプなんかだと、移動時間を時には高速化したい。
とか思うことは多々あると思うし。
ADVなんかでは既読メッセージスキップとかあるんだから
歩行スピードもアップ機能あってもいいよね。みたいな感じで。
むしろゲームスピード自体あげちゃおうよ的な。
最近のPCなら、内容にもよるけど
ウェイト切ったら500fpsとか普通に出るしね。
んで試しに実装してみたら、微妙にずれるw
240fpsにしたら237fpsとか110fpsにしたら107fpsとかw
フレーム数は整数なので小数部の計算でどうしても
ズレが出てしまうので、なかなかきっちりと指定レートには
なってくれないのがちょっと気持ち悪いw
あと、やっぱフレームスキップ方式だと
1フレームに+1加算
++x;
DrawRect(x, 0, 100, 100, color);
みたいなのでテスト表示見てると
たまに動きがカクッとしてしまうのは仕様がないのだろうなぁ。
小数部の誤差がたまってそういう感じになるのだろうけど。
んがまあ、ゲームスピードを一時的に上げたり下げたりというのは
出来たので良しとするか。
で最近は、今回の組み直しの際に、新たに付け加えようと思っていた部分の
GUI機能を追加しようと言うところで、ちまちま設計を。
だいたいの構想は以前から練ってはいたのだけども。
ここでもQT触った経験が生きてきてるぽ。
とりあえず、GUIパーツはすべてwidgetクラスを基底として
widgetには自身のrect情報とかもってて
あとは派生でウィンドウとかボタンとか作り込んでいく感じでしょうか。
そういう感じで描画周りは、さほど難しくも無い感じぽ。
問題は駆動方式。
誰がGUIオブジェクトを保持して
たとえばボタンを押されたとして、その「押された」という情報は
どこの誰が受け取るのかとか。
イベントドリブンっぽい感じにしようと思うと
イベントを受け取る管理クラスがあって
ボタンにはIDが振られていて
「押された」というイベントをイベントクラスに登録する。
んで、ボタン押下後のアクションを起こすオブジェクトは
イベント保持クラスに毎フレーム指定のボタンIDのボタンは
「押されてる?」と問い合わせる感じでしょうか。
しかし、そういう感じのって、IDEのGUIデザイナなんかある環境だと
ボタンを画面に追加した時点でIDが自動で振られるし
ボタンにイベント追加とかすると
イベントに対応したメンバ関数やらが勝手に登録されて~
みたく自動化されてるから良い物の
その辺を全部手書きで追加していくのは骨です。
RPGツクール見たく、GUIな開発環境そのものを作っちゃう様な場合は
別なんでしょうけど。
んでc++11の仕様なんか眺めてると
std::functionってつかえね? とか思ったり。
メンバ関数を関数ポインタ(てか関数オブジェクトという方が正確?)
として簡単に扱える感じなので
ボタンクラスのボタンが押された時に実行するところで
std::functionで与えられたメンバ関数を実行するようなのができるっぽい。
Button button(&gameScene::buttonOn);
とか登録したらば
button.update();
でボタン押下のチェックを毎フレーム行って
ボタン押されたらそのまま
gameSceneクラスのbuttonOnメソッドが実行される、みたいな。
なにげにこの仕組みって、QTのシグナルとスロットのヒモ付けに近い感じぽですね
connect( &button, SIGNAL(buttonOn()), &gameScene, SLOT(buttonOn()));
こんな感じのイメージ。
って、あれ?
なにげにQTのドキュメントみたら5.3ではまた書き方かわったっぽい?
Button button;
connect( &button, &Button::buttonOn), &gameScene, &GameScenebuttonOn));
なんかこんな書き方が出来る様になったっぽい。
QTもstd::functionつかってるぽ?
より直接的な書き方が出来る用になった感じでわかりやすい。
ふむう、コレを見る感じGUIのイベント処理まわり
std::functionでの実装はいい感じな気がしてきた。
まあ、実際に実装してみたらいろいろと問題が出てくるんでしょうけどもw
んでもまあ、大まかに妄想的に設計を練るのは楽しいですね。
実際の実装は肉体労働でしんどいですがw
以前つくったゲーム用のライブラリをc++11で組み直しているのですが
その際に、わりといい加減に、とりあえず動けばいいや的な実装のところを
きちんと組み直してたりもするのですが
ちゃんときっちり組もうとおもうと、大変だなぁとか。
つい先日は、フレームレート周りの実装なんかを作り直してたり。
今までのは単純に60fps固定でウェイトかけてるだけだったのですが
割と最近では、安価なモニタや、モバイル系とか
省電力設計とかでリフレッシュレートが30hzの物も最近は多いとか。
んで3Dテレビ? なんかは120hzが普通だとかで。
なので60hzを想定して、60fps固定にしちゃうと
そういうモニタでプレイするとゲームスピードが変わってしまうわけで。
その辺の対応とかもちまちまと。
この辺の解法は大まかには二つあって
時間単位の移動量を算出して、フレームレートに依存しないゲームスピードにする方法と
描画をフレームスキップして調整する方法の二つ。
後者の方がゲームスピードをフレーム数で管理できるので楽ちんだったりするので
そちらを採用しました。
前者のは座標系の精度を上げる必要があるし
フレームレートが落ち込んだときに移動量がどっと加算されるので
あたり判定のすり抜け問題とかもあるし、いろいろと一筋縄ではいかなそうだったので。
あとは、エミュとかでは普通にある
ゲームスピードを変更(倍速とか)機能も欲しいよなーと。
世の中の市販ゲームは、なんでこんなもっさり動作なのかといらつく物が多い。
ミンサガとかミンサガとか、そうミンサガとか。(イクゾー)
もはやいまさらミンサガは実機ではプレイ出来ないレベルw
もともとアクションゲームとか興味ないかんじなので
RPGみたいなものつくったとして、
フィールドタイプなんかだと、移動時間を時には高速化したい。
とか思うことは多々あると思うし。
ADVなんかでは既読メッセージスキップとかあるんだから
歩行スピードもアップ機能あってもいいよね。みたいな感じで。
むしろゲームスピード自体あげちゃおうよ的な。
最近のPCなら、内容にもよるけど
ウェイト切ったら500fpsとか普通に出るしね。
んで試しに実装してみたら、微妙にずれるw
240fpsにしたら237fpsとか110fpsにしたら107fpsとかw
フレーム数は整数なので小数部の計算でどうしても
ズレが出てしまうので、なかなかきっちりと指定レートには
なってくれないのがちょっと気持ち悪いw
あと、やっぱフレームスキップ方式だと
1フレームに+1加算
++x;
DrawRect(x, 0, 100, 100, color);
みたいなのでテスト表示見てると
たまに動きがカクッとしてしまうのは仕様がないのだろうなぁ。
小数部の誤差がたまってそういう感じになるのだろうけど。
んがまあ、ゲームスピードを一時的に上げたり下げたりというのは
出来たので良しとするか。
で最近は、今回の組み直しの際に、新たに付け加えようと思っていた部分の
GUI機能を追加しようと言うところで、ちまちま設計を。
だいたいの構想は以前から練ってはいたのだけども。
ここでもQT触った経験が生きてきてるぽ。
とりあえず、GUIパーツはすべてwidgetクラスを基底として
widgetには自身のrect情報とかもってて
あとは派生でウィンドウとかボタンとか作り込んでいく感じでしょうか。
そういう感じで描画周りは、さほど難しくも無い感じぽ。
問題は駆動方式。
誰がGUIオブジェクトを保持して
たとえばボタンを押されたとして、その「押された」という情報は
どこの誰が受け取るのかとか。
イベントドリブンっぽい感じにしようと思うと
イベントを受け取る管理クラスがあって
ボタンにはIDが振られていて
「押された」というイベントをイベントクラスに登録する。
んで、ボタン押下後のアクションを起こすオブジェクトは
イベント保持クラスに毎フレーム指定のボタンIDのボタンは
「押されてる?」と問い合わせる感じでしょうか。
しかし、そういう感じのって、IDEのGUIデザイナなんかある環境だと
ボタンを画面に追加した時点でIDが自動で振られるし
ボタンにイベント追加とかすると
イベントに対応したメンバ関数やらが勝手に登録されて~
みたく自動化されてるから良い物の
その辺を全部手書きで追加していくのは骨です。
RPGツクール見たく、GUIな開発環境そのものを作っちゃう様な場合は
別なんでしょうけど。
んでc++11の仕様なんか眺めてると
std::functionってつかえね? とか思ったり。
メンバ関数を関数ポインタ(てか関数オブジェクトという方が正確?)
として簡単に扱える感じなので
ボタンクラスのボタンが押された時に実行するところで
std::functionで与えられたメンバ関数を実行するようなのができるっぽい。
Button button(&gameScene::buttonOn);
とか登録したらば
button.update();
でボタン押下のチェックを毎フレーム行って
ボタン押されたらそのまま
gameSceneクラスのbuttonOnメソッドが実行される、みたいな。
なにげにこの仕組みって、QTのシグナルとスロットのヒモ付けに近い感じぽですね
connect( &button, SIGNAL(buttonOn()), &gameScene, SLOT(buttonOn()));
こんな感じのイメージ。
って、あれ?
なにげにQTのドキュメントみたら5.3ではまた書き方かわったっぽい?
Button button;
connect( &button, &Button::buttonOn), &gameScene, &GameScenebuttonOn));
なんかこんな書き方が出来る様になったっぽい。
QTもstd::functionつかってるぽ?
より直接的な書き方が出来る用になった感じでわかりやすい。
ふむう、コレを見る感じGUIのイベント処理まわり
std::functionでの実装はいい感じな気がしてきた。
まあ、実際に実装してみたらいろいろと問題が出てくるんでしょうけどもw
んでもまあ、大まかに妄想的に設計を練るのは楽しいですね。
実際の実装は肉体労働でしんどいですがw
Sun
Mon
Tue
Wed
Thu
Fri
Sat
01
02
03
■
■
ちゃんと作ろうと思うと……
04
05
06
07
■
■
でんぐりがえり
08
09
10
■
■
やっぱいいなぁ
11
12
■
■
シンプルイズベストなんだよな
13
■
■
昨日の続き
14
15
16
■
■
いろいろ失敗
17
18
19
20
21
22
23
24
25
26
27
28
29
30
■
■
ぐにょぐにょ
31
total:2076230 t:138 y:119
■記事タイトル■
■年度別リスト■
2024年
2024年12月(0)2024年11月(0)
2024年10月(1)
2024年09月(2)
2024年08月(1)
2024年07月(1)
2024年06月(5)
2024年05月(2)
2024年04月(1)
2024年03月(6)
2024年02月(4)
2024年01月(3)
2023年
2023年12月(3)2023年11月(1)
2023年10月(2)
2023年09月(3)
2023年08月(3)
2023年07月(3)
2023年06月(7)
2023年05月(8)
2023年04月(2)
2023年03月(1)
2023年02月(2)
2023年01月(3)
2022年
2022年12月(4)2022年11月(3)
2022年10月(1)
2022年09月(3)
2022年08月(3)
2022年07月(2)
2022年06月(1)
2022年05月(3)
2022年04月(2)
2022年03月(2)
2022年02月(1)
2022年01月(6)
2021年
2021年12月(8)2021年11月(3)
2021年10月(4)
2021年09月(6)
2021年08月(2)
2021年07月(1)
2021年06月(3)
2021年05月(2)
2021年04月(2)
2021年03月(3)
2021年02月(1)
2021年01月(4)
2020年
2020年12月(3)2020年11月(7)
2020年10月(2)
2020年09月(3)
2020年08月(1)
2020年07月(3)
2020年06月(7)
2020年05月(5)
2020年04月(8)
2020年03月(4)
2020年02月(2)
2020年01月(4)
2019年
2019年12月(1)2019年11月(1)
2019年10月(2)
2019年09月(1)
2019年08月(3)
2019年07月(2)
2019年06月(2)
2019年05月(2)
2019年04月(4)
2019年03月(1)
2019年02月(7)
2019年01月(1)
2018年
2018年12月(1)2018年11月(1)
2018年10月(5)
2018年09月(1)
2018年08月(5)
2018年07月(1)
2018年06月(1)
2018年05月(1)
2018年04月(2)
2018年03月(2)
2018年02月(1)
2018年01月(1)
2017年
2017年12月(2)2017年11月(1)
2017年10月(2)
2017年09月(5)
2017年08月(8)
2017年07月(2)
2017年06月(1)
2017年05月(1)
2017年04月(3)
2017年03月(5)
2017年02月(7)
2017年01月(8)
2016年
2016年12月(7)2016年11月(2)
2016年10月(3)
2016年09月(7)
2016年08月(8)
2016年07月(10)
2016年06月(17)
2016年05月(6)
2016年04月(8)
2016年03月(10)
2016年02月(5)
2016年01月(10)
2015年
2015年12月(7)2015年11月(7)
2015年10月(13)
2015年09月(7)
2015年08月(7)
2015年07月(5)
2015年06月(4)
2015年05月(5)
2015年04月(2)
2015年03月(4)
2015年02月(1)
2015年01月(7)
2014年
2014年12月(12)2014年11月(8)
2014年10月(4)
2014年09月(6)
2014年08月(7)
2014年07月(4)
2014年06月(2)
2014年05月(5)
2014年04月(4)
2014年03月(8)
2014年02月(4)
2014年01月(8)
2013年
2013年12月(15)2013年11月(8)
2013年10月(3)
2013年09月(3)
2013年08月(8)
2013年07月(0)
2013年06月(0)
2013年05月(0)
2013年04月(0)
2013年03月(0)
2013年02月(0)
2013年01月(0)
■レス履歴■
■ファイル抽出■
■ワード検索■
堕天使の煉獄
https://rengoku.sakura.ne.jp
管理人
織田霧さくら(oda-x)
E-mail (■を@に)
oda-x■rengoku.sakura.ne.jp