total:37108 t:16 y:19
2017-03 煉獄日記
煉獄日記
管理人:織田霧さくら(oda-x)
2017年03月
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
タイトル一覧
月別一覧
年度別一覧
検索
2017-03-31.Fri ベーコンのアスパラ巻
2017/03/31(Fri) 01:09:51
最近あんまし良い感じのベーコン安く売ってないんだよなぁ。
ってことで、4枚セットのが3~4連で298円ぐらいの使い切りパックのベーコンをつかって作ることに。

食べてる最中に気づきました。

ベーコンのアスパラ巻って何だ? アスパラのベーコン巻だろう……。
しばらく間違えに気づくのが遅かったりする今日この頃。アスパラじゃ巻けねー。
お味の方は、意外にも使い切りパックのベーコンでもそれなりに食べれるなと。


そんななか、意外に手間取ったツール作成。
d_138.jpg

flash@ActionScript3で簡単な脱出ゲームとか作ってみるべかーとか思ってたんですが、以前からゲーム画面とかのレイアウト作りつつ、各部分の座標とか簡単に取れるようなツール欲しいなと思っていたんですよね。メッセージウィンドウとか、たとえばRPGなんかでのHPとかのパラメータ表示位置とかそゆの。手打ちでコードに打ち込む時とかにちまちま座標調べるの面倒だったりで。

んで、さらに脱出ゲームとかって、クリップポイントとかいっぱい管理するじゃないですか。ますます座標まわり取得簡単に管理できる感じの欲しいなーと。

で、ぐぐってみたところ、時勢なのか、やたらとスマホ向けのオンラインツールでのアプリ開発者向けのレイアウト作成ツールがやたらとヒットする。

それでもめげずにぐぐってみると、いくつかは普通のデスクトップ向けソフト出てきたんですが、初めてツール作ってみました的な使い物にならないレベルのもしか出てこない。

うーむ。

古くは、まだweb系のお仕事とかやってた時分にちょっとつかってたAdobeのFireworksみたいな感じのツールがほしかったんですよね。Fireworksはwebページのレイアウトとか向けの奴ですけど。全体のレイアウトとかざっとコレでつくって、実際のページはhtml手打ちで。角丸デザインのボタンとかの部品はエクスポート。みたいな使い方できて便利だったりで。

でまあ、無いなら作るかと言う感じで。

見通し的には以前に似たようなレイアウト作成ツール(某ソフトのスキン作成ツール)を作りかけた事があって。アレはあとはもうひたすら作業だけって段階まで来たところで心が折れて制作放棄したのですが(commandパターンで作成必要なコマンドが100件以上とか……めんどくさくてやってられねぇ。そのうえそんな利用頻度の高いツールでもないし)

今回のはかなり規模も小さめのささやかなツールな感じなので、commandパターンでのアンドゥ&リドゥの実装経験にもちょうどいいかなと。

Fireworks使ってたときの記憶も呼び戻しつつ、選択範囲に画像設定から、レイアウト指定(align)付きで文字いれれて、文字と画像合成キャプチャしたものを画像としてエクスポート機能とか、角丸ボタン作成。
あとはフォーマット書式でのアイテムの座標コピー機能なんかも盛り込んでみたり。

drawRect(%x, %y, %w, %h)

なんて書式をプリセットで登録しておけば、アイテムの上で右クリック→フォーマット書式選択で%~の部分にそれぞれの値が入った物がクリップボードにコピーされる。みたいな。

と、この辺まではさして詰まるところもなく、前述の以前の作りかけの似たようなツールのコードを流用しつつさくさくつくっていったのですが。

嵌りポイントがいくつか。

まずQGraphicsSceneのQGraphicsItemってローカル座標とシーン座標の二つの座標系を持っていると言うところ。
んでもって、QGraphicsItemを選択状態にしてドラッグで移動した時にはローカル座標で移動になる。

どういう事かというと、ドラッグで移動した時、ローカル座標のposが(200,100)だとしてシーン座標が(100,100)だと、実際のシーン上の表示位置は(300,200)になっちゃうんですよね。

んでもってシーン上からアイテムを移動するとき(十字キーで移動とか)はシーン座標で移動してしまう。

そんな感じで、操作の場所と種類によって異なる座標系に適用されるのでしばらく混乱したり。
最終的には片方の座標系だけを基準として、異なる座標系の変化を基準の座標系に置き換える処理を必ず入れるみたいな感じで処理したんですけど……。
フラグ一つでローカル座標使わないと出来ない物なのか……。

ほかにはQGraphicsViewとQGraphicsSceneとQGraphicsItemそれぞれのマウスイベントまわり。それぞれを順にイベントが送られてくるのですが、物によってはここで以降のイベントは起こさないようにここで止める。とか、先に下流にイベントを送って処理させてから処理する。とか、いろいろと入り組んでてとてもめんどくさい。
見えないところに隠蔽されてて勝手に処理されてる処理とかもあったりするし。

複数のアイテムを選択するってだけでなんでこんな面倒な事になってるのか……。選択状態だけなら良いんですが、複数選択状態で移動とかするとドラッグ開始位置の下にあるアイテム以外が選択外れちゃったりとか、イベントの流れをしっかりと把握して、そのイベントを受理するのかの細かい条件分けあたりがかなり面倒だったり……。

アンドゥ&リドゥ関係はわりと拍子抜けするぐらいあっさりと。
QUndoStackが普通に便利すぎ。
自前でこの辺のスタック管理のフレームワーク書いたこともあるんですが、かなり面倒だった記憶が。その辺さっくりとすでに実績のあるライブラリだと使うのも安心ですね。

十字キーでアイテム移動とかのとき、1pxずつ移動のたびにコマンド発行してると、アンドゥも1pxずつ巻き戻すのかというと、普通は十字キー移動以外のコマンドがくるまで移動位置を加算して保持して一回のコマンドで巻き戻せるようにするのは定石だとおもうのだけども、その辺はどうやるのか。
スタックで管理してるんだから、pop_backして同じコマンドだったら移動量を加算してまたpushする。みたいな感じなのかなーとおもったのだけども。
pushはあるけどpopが無ぇっ。

あるぇーじゃあどうやんの? とおもったら、スタックするコマンドはQUndoCommandというオブジェクトの派生クラスで実装するのですが、このなかにmergeWithという仮想メソッドがあって、ここで同一のコマンドの場合は値を結合するみたいな処理を書く専用のものがあるのかー。
こりゃまた便利。

んでもググってるときに同じところで悩んでる人のQUndoStackにpopは無いんですか? てきな記事が結構ヒットしたりw
そうだよなー普通にQUndoStack、スタックと来れば普通にpopで何とかするんだろうなってのは普通に浮かびますよね。

それからstd::functionはやっぱ便利だなーと。
単に値書き換えるだけのコマンド系はオブジェクトの値書き換えのsetterとgetterのメンバ関数をstd::functionで登録する形にすればあとはテンプレートつかうと、いくつもいくつもコマンド書かなくても済むようになったりで。


QT CreatorのUI作る画面のプロパティ設定するろところ。
あんな感じのコントロールが標準でほしいです。
ツリーウィジットの各項目にスピンボックスやらラインエディタやら付ける感じの。
同じ様なの作ろうとしたら、標準機能だけでは無理で結構ディープな茨道をすすまないと無理なところがアレだなぁ……。
この辺は前述の以前の作りかけツールの時点でクリアしてたので、今回はちょっとコード見直してちょこっと修正したぐらいで済んだんですけども。以前はこの部分が一番時間掛かってた気がするぽ。
QGraphicsSceneまわりでもそうだったけど、ちょっと違ったことやろうと思うと、膨大なイベント処理から必要な処理を取捨選択したりハックしたりと、なんだかんだでコーディングの時間よりもドキュメントを読む時間の方にばかり時間がとられていく……しかも全部英語だしぃ……。

そんな感じで一週間も掛からないかなと思ってたのが、一週間以上かかっちゃいましたね。
といいつつまだ途中ですけど。
あとはセーブ機能を付ければとりあえず使い物になりそうかなと言うところまでは出来たり。
あとは運用しながらちまちま煮詰めていく感じでしょうか。


しかし……軽めのflash@ActionScriptなゲームつくってみようとおもってはいるのですが。

こんなんどうだろう……とネタを思いつくも、ネタをもうすこし具体的に煮詰めだすと、どんどんとネタが膨らんできて、こりゃ軽く……じゃ済まないな。って感じになってお蔵入り。
みたいな事ばかりやってたりして。

普通にゲームネタ考えるのが楽しい~ってだけでいまいち具体性に欠けるネタばっかり~。

やっぱ明確な〆切りとかないとダメなのかねぇ……。
2017-03-12.Sun かふーん
2017/03/12(Sun) 06:00:56
この時期は花粉がきついー。鼻が-。
でもなんでかここ数年、目はあんまり痒くならなくなったのは何でだろう。体質の変化か。

そんな感じでVisualStudio2017きてたのでさっそくインスコ。なんか最初のアカウント登録んところでハングって応答無しになり、強制終了したあと再起動。したら認証のところのボタンがグレーでクリックできなく。
もっかい終了したら、なぜかVisualStudio終了した直後にまたアカウント登録の画面だけが表示されるw

その画面閉じて、それからもういっかいVisualStudio起動したら今度はちゃんと認証までいったり。
時期的に認証用の鯖が混み合ってたんだろうか??

旧verの設定を引き継ぐ的なこともやってくれるようで、vc++ディレクトリとかの設定も引き継ぎで、そのままテストのDXライブラリのプロジェクトも普通に起動。

……あれ、これでようやくつかえるわーと、ネストしたネームスペース使ってみたら

error C2429: 言語機能 'nested-namespace-definition' にはコンパイラ フラグ '/std:c++latest' が必要です

うそーん。
なんかVisualStudio2017のc++17関係のMSの記事で、以前に追加したみたいなこと描いてあったのに、一番最近のc++の新機能的な記事のところでは無かったんだよな。あまりにもささやかな機能っぽいので書かれてないだけ? とかおもってたんだけども……。

いまだお試し版の扱いなのか……まあフラグ追加するだけで使えるのでいいか。

んでもそれほど大きな追加はないんですよね。実際、プロジェクトのツールセットの表記も2015の時が140で、2017では141となってたりして。メジャーverupって感じではないぽ。2015update4に近い感じのニュアンスのverっぽいですね。

それでもstring_view、それからoptionalが使える用になるのは大きいですね。optionalはほんとようやくと言った感じです。これで自前のoptionalもどきのものをstdの物に置き換えれる~。
variantはあんま使う機会ないかなぁ。QTのQVariantと比べると、QVariantのが便利で使い勝手良さそうなんだもの……(でもまああっちはQT環境の中での利便性の部分も大きいけど)そんでもってvariant型を使う場面って結構限定的だしね。
javaとかの変数varはc++ではautoで置き換わる感じだし。variant型を使う場面てと、QTのQSetting的なものを自前で作るときとかに使うかもぐらいしか今のところ思い当たらないぽ。

他には

>std::vector が刷新され、正確性とパフォーマンスが向上しました。
なんてのも。
もはやvector一強状態ですね。listとか涙目。


んでもって、もう来てるのかなとQTのメンテナンスツール立ち上げてみる。
……msvc2017版まだきてなーい。
2015んときはすぐに用意されてた気がするんですが、まだ来てないのか。
とはいえ、ネストしたネームスペースも結局スイッチ必要で、2017来てもoptional使える用になるぐらいで大した変化ないけど。

うーん。
思ったよりあんま状況変わってない……。

むしろc++17の追加予定や新しい機能提案で出てきてるのにそそられる物が結構多くて、それが実装されるのはどんだけ未来の話なのか……とそっちのがヤキモキ。

utf-8の文字型char8_tあたりもいまだ提案レベルで一向に話は進んでないっぽい。文字コードまわりはいまだにカオスだなぁ。

少し前までDXライブラリでは結局win32アプリになるので内部コードはutf16(wchar_t)で統一する方向で行こうかと思っていたのだけども、最近ではやはりutf8で統一する方向にしようかと迷ってたりして。
んでもそこでchar型にutf8入れるのがなぁと。やっぱchar8_t、u8stringとかほすぃ。んでもutf8だと単純に[]で文字数指定してアクセスできないのがなぁ。
QStringに慣れてしまうと、vc++に戻ったときに結構面倒に感じる事がおおい。QString便利すぎ。

2017-03-09.Thu やっぱついてないわ
2017/03/09(Thu) 01:36:58
先日売り切れてたHDDが入荷したというので購入。

CDブートのコピーツールで丸ごとコピー。2TBで7時間待ちか……。

しかしCDの音五月蠅いな。
このDVDドライブ、立て付けが悪いのか結構音大きいんですよね。
しかしそれがまさか……(後編につづく)


寝てる合間にコピー完了。リードもライトもエラー無し。ほっと一息。
ドライブ取り替えて起動。
とりあえず順調に動いてるぽ。

……ただ、うちのPC古いのでMBがGPTモードに対応してない~。
3TBのHDD買ったけど2.2TBまでしかつかえない~。

まあ、PC古いしね。
おいおいまたバックアップかねてHDD換装するときにこっちはデータドライブとして流用するときなんかにはGPTモードにフォーマット変換して使えばいいんだし。(GPTモードが問題になるのはブートドライブだけなので)
微妙に200GBぐらい容量増えるのでそれだけでもありがたい。

……そこではたと気づく。

なんか五月蠅くね?
CD(ディスクコピーツール)出したよね?

PCの方からぶぉーーーーーんという重低音がずっと鳴ってる。
あれ? 前からこんな音だったか??

……ケースに触ってみると音が止まる。
……なんかケース全体振動してね?

で、その振動の発生源は……換装したばかりのHDDでした。

触ってみただけであきらかにブルブル振えてる。そりゃ中で回ってるものだし多少は振動するモンだけどこれはちょっとなんか異常っぽい。だってケース全体が振動するレベルだもの。
試しにHDDの止めてるビスちょっと緩めたら「ブブブブブブ……」と、携帯電話を机の上おいといてバイブで着信あったときみたいな派手な音が。

駄目だこりゃ……。

ググってみると、どうも軸ぶれしてる不良品っぽい。

てかシーゲートはもはや論外。WDはあんま良い噂きかない。日立はもう売ってない。日立の後継? の東芝がとりあえず一番まともだとおもわれたんですけど。ちょっとまえにWDにHDD部門買収だとかなんかそんな記事でてたなーとか。

したらいま東芝ってMaid in Chinaなのね…_| ̄|○

同じ様に異常振動するケースがレヴューでちらほら。
でも何年も持ってるっていう人もいるし。
どうも品質にかなり当たり外れが激しいらしい。

てな感じで、初期不良で交換交渉に。

ごねられたりしたらやだなーとおもってたけど、あっさりと交換してもらえたのはとりあえず良かったけど。

交換したHDD設置して電源オン。

……全然靜か。
CDは最初の数秒五月蠅いだけでその後は靜か。

なんかCDの回ってるときの音にそっくりだったので、その音だと思い込んだのが失敗だったなぁ……。
あんなブルブル振動してるHDDと元のHDDを7時間も並べて稼働させてしまったので、元のにもダメージ行ってしまったんじゃないだろうかと今更ながらに激しく後悔。ふぁっきんちゃいな!

で、また7時間待ちでコピー完了。

エラー無し。
起動問題なし……。

あとは長持ちするかは神のみぞ……。

てかもう、東芝もふぁっきんチャイナ製になってしまって、もはや何処のメーカーのHDDも信用出来ない状況になってね?

しかし……近所にPCのパーツショップなくって、車で30分ぐらいの所にしかないんですけど(通販でHDD買うのは勇気と運が一杯必要だし)
都合三回も往復するハメに。
1回目売り切れ表示ないのにやっぱり売り切れがっくり。
2回目入荷まちで一週間近く待たされてようやく購入。
3回目初期不良交換。

……だれか100年ぐらい壊れないHDD開発してください……(ぉ


あと……なにげに初期不良交換となったんだけども、不良HDDがっつりデータはいってるんだよね。なんだかんだでコピー自体は成功しちゃったので。
で、店員曰く、0フィルして初期化したあと処分すると行ってるんだけど。
こんなん疑ったらキリ無いけど、バイトレベルとかだとなんかのぞかれてそうでやだなーとか。
なんか年取ると、そういうお店の店員とかのモラルとか素直に信用出来なくなっちゃうよね……。
歳をそれなりに食うと、ろくでもないことする人間がいかに多いかを見聞きする機会が増えるからなのかね。

でも自分でフォーマットとかめんどくさいのでそこはまともな人にあたってくれと運頼み~。
サブのPCとかあればフォーマットとか放置でできるんだけどねぇ。

やっぱ頑張って稼いで、もうちょっと環境まともに整えないとなぁ。
2017-03-05.Sun これってやっぱ嫌がらせ的なものなのかな
2017/03/05(Sun) 23:55:01
古い形式のswfがActionScript3.0ではいろいろ問題ありの件。
あれからもちょっと調べてたらば。

どうも元のswfの中身の問題も影響大きいみたい。
基本的には古い形式のスクリプトは使えない、古い形式のswfの中でファイルを外部から開くのはoutっぽい? などなど。
単純な動画の再生とフレーム指定ジャンプだけなら割と動く。
ただし、「現在何フレーム目か」、「○フレーム目に移動」といった操作や情報のアクセスはActionScript3.0からは出来ない。
これはもう仕様らしい。
なのでたとえばswfの中で箱があって、開いたアニメ表示したら「○○を手に入れた」みたいな事したくても、そのswf内で現在どのフレームを再生中なのか。再生が終わったのかも知る手段がないので、このままだとせいぜい、ずっと自動でアニメーションしてる背景オブジェ(置物)ぐらいにしか使えないぽ。

で、古い形式=ver8以前=avm1形式から、ver9以降=avm2形式に変換すればフレームカウントとActionScript3.0からのフレーム指定移動は出来る用になるっぽい。
ただし元のタイムラインで作った再生制御が一切無効になって、フレーム0からラストまでだらーっと再生する感じになる。
なのでENTER_FRAMEイベントで自前でフレームの進行をスクリプトで記述する感じになるぽ。
詰まるところ素材とアニメーションセットをparaflaで埋め込んで、何フレーム目から再生して何フレーム目で止めて待機、とか○フレーム目から○フレーム目までをループ再生。的なのをENTER_FRAMEイベントでしこしこ書いていけば良い感じにadobeの有料ソフトなしでもいろいろ出来る様になるっぽい。
んでもまあ素材のパッケージ的な使い方になるのかな。

箱の例で言えば、swfファイル内の箱開いて「○○を手に入れた」でアイテムidを発行して受け取る。みたいな事は結局の所無理っぽいけど、スクリプト側から箱を閉じてる絵のフレームでループさせといて、moveclip(または表示位置のうえに透明ボタンとか?)をクリックしたら箱が空いてる絵のフレームに移動。
みたいな事は出来るようになる。

まあコレはコレで便利かなと。
キャラクタのアニメーションセット(歩いてるのとか飛んでるのとか)つくって、開始フレームだけメモっといて、ENTER_FRAMEイベント内で自前で現在再生すべきフレームを監視設定的な使い方できるし。
やっぱアニメーションの設定はタイムラインでやった方が楽ですしね。キーフレームだけメモしておいて使うってのはなんかローテクだけどw


でまあ次の問題は……avm1→avm2変換の方法がloaderスクリプトがいくつかでてきて、ローカルでswfファイル自体を書き換えるのがなんか上手く動かないのばかり。

loaderスクリプトだとロード完了確認とか、最初の画面で一括ロードとかするときになんか面倒そうだなーてのがあって。
swfファイル自体先にコンバートしておいてEmbedタグで自動読み込み(大元のswfに埋め込み)にしてしまいたい。

で、結局自前でコンバータ書くことにしたんだけども。
参考にしたActionScript3.0で記述されてるloaderスクリプトの中身のコンバート部分で、どうもよくわからないところが。

var rectNBits:uint = bytes[result] >>> 3;
result += (5 + rectNBits * 4) / 8; // stage(rect)

なんかのデータ分スキップするためにサイズを調べてるところっぽいのですが。
swfをバイナリエディタで値見ながらこの計算式当てはめてみると、なんか小数部が出てくるですよ。バイト数計算してるのになんで小数?? なんか間違えてる??

bytes[result] >>> 3
で1バイト分のデータの上位5ビットを取得。たとえば「12」と言う値が入っているとして。
result += (5 + 12 * 4) / 8; // stage(rect)

result=6.625ですよ。

あるぇー?
端数はどうするの? てかなんでこんな中途半端な数値出てくんの
そもそもこのstage(rect)てなに? (rectなので座標位置とサイズが入ってるんだろうけど、何のrectなのかさぱーり)

……結局、本家adobeのamv1フォーマットのpdf資料があるので見てみることに……pdf見づらくて嫌いなんで避けてたけど結局見る事になるのか……。

で見てみると、上位5バイトにデータサイズが入っていて、その次にx,y,width.heightの4つのデータが各データサイズ分並んでいるんだとか。

上の例だと5bitの中身が12だったら、残りの下位3bitの頭から、12bit*4個データが並んでるぽ。 そんでそれを8(bit)で割って、半端は切り上げでstage(rect)全体のバイト数が出る……と。

これってあれですよね……普通にバイナリ解析してフォーマット調べるなんてことする人向けの、フォーマットの資料無しじゃ普通に読めない用にするための迷彩部分っぽい?
いちいちビット演算しないと値が取れないし、そこまでしても得するのはせいぜい数bit~数バイト。しかも端数の残りのbitは無駄。
使い勝手優先ならデータ長フィールドなしにx,y,width.heightそれぞれ4バイト(uint32)も取っておけば問題無いわけですし。
と思ったけど、smf(スタンダードmidi)フォーマットと同じで、これまたswfの初期の古いverがあった頃ってまだ、モデムとかでインターネットやってた時代だから、やっぱその数バイトとかケチるためにこんなフォーマットになってるのだろうか……。

あとなにげにこのrectの後にフレームレートと総フレーム数のデータが続くんですけど、loaderスクリプトでもswfバイナリみた感じでも、フレームレートは1バイト(=unsignedで255まで)のようなのですが。まあ十分なデータサイズですよね。
でもadobeの資料だとフレームレートは2byteになってるぽ……記載ミス?? またも迷彩?(疑り深すぎw)

そんなかんじでヘッダ部のなかのver番号を書き換え、FileAttributesなるデータフィールドが存在しなければ追加、あればそのなかのあるビットフラグを立てておけばこのファイルはavm2でっせと偽装? 出来る様になるぽ。


そんな感じでQTでぺぺいとコンバータ書いて実際に試してみる。

うーん。
やっぱただの画像のアニメーションしてるだけのものは普通に使えるようになったけど、音声とか入ってるとなんか読み込み自体失敗するな。

どうせ再生フレームの位置変更以外最初からしないつもりであれば、それようのswf作れば良いだけの話なのでまあいいか。


でも次にはまったのが、loader経由で読み込むと普通につかえたのに、Embedで読み込むと現在のフレームとか取得できなく……。なんでー?

まだ昨日今日触り始めたばかりなのでこの辺あんまよくわかってないんですが、loader経由とEmbedで読み込むときの内部のプロセスがかなり違うっぽい。

結論としては

[Embed(source = '/sample04_new.swf')]private const EmbedClass: Class;
private var move1:MovieClip = new MovieClip();

var mcla: MovieClipLoaderAsset = new EmbedClass();
Loader(mcla.getChildAt(0)).contentLoaderInfo.addEventListener(Event.INIT, function callee(e:Event) :void{
   var info: LoaderInfo = LoaderInfo(e.target);
   info.removeEventListener(Event.INIT, callee);
   move1 = info.content as MovieClip;
   addChild(move1);
});

これでEmbed使ってのavm1→avm2形式変換後のswfをMovieClipとして使える用に。
Embedで読み込んだものの中からloaderオブジェクトを呼び出してそこから読み込んだデータを複製してるってな流れらしい。
なんでそうしないで

[Embed(source = '/sample04_new.swf')]private const moveClip: Class;
var move1:MovieClip = new moveClip() as MovieClip;

だとダメなのか良くわからんです。(これだと表示は出来るけどフレーム制御関係まったくさわれない状態になる。totalFrames=0とか返ってくるし)

でもまあ、MovieClipLoaderAsset使った方法だとEmbedで一旦ロードしたものを複製してる感じとのとこなので、普通にswf全体をロードするときの読み込みバイト数計算で一括してローディング画面実装はそのままこれでいけるのかな。
やっぱ鯖にうpするのも単体のswf一本のがいいので。(swcでパッケージングとかいう手法もあるらしいけどまだ未検証)

んでもこのへん不便だなとおもうのが……ローディング画面の検証がやりづらい。
まあローカルはしょうがないにしても、鯖に上げた場合でも今日日、回線は光とか普通の現在では数百kbぐらいじゃロード一瞬で終わるのでほんとにちゃんとローディング画面意図したとおりに動いてるのかいまいちよくわかんねー。
便利になった(高速回線が一般化した)反面、逆に不便が生まれるのもなんだかなという気分に。


そんでもってちょこちょこと組んでみて思ったのは、C#風なオブジェクト指向っぽい感じになってるのだけども、データ構造と切り分けて組む感じではなくわりとスクリプトファイル(.as)単位で画像やらなにやら詰め込んだイベントを作りこんでいく感じのほうがいいかんじっぽいのですね。

どしてもリソース部分とコード部分切り分けてやる方法論がしみついてるので。

まあこのへんはなんか一本とりあえず作ってみないと実感的にどうなのかわからないところですが。

いまところ、弱そうなレイアウト回りの機能をライブラリ的な感じでちまちま作ってたりしてるだけで、実際のゲームっぽいのはどん何作ろう的なのもあんま固まってないぽ。

しかし、ActionScript、rect(Rectangle)はあってsize(width,height)はないのがちょっとめんどくさい。(point(x,y)はある)
しかもRectangleは組み込み型じゃないので毎度import必要だったりするのでちょっとうっとうしい。
それからお作法的にイベント登録したらremoveEventListenerでイベント登録を自前で削除しなきゃいけないところもちとめんどい。実際の所GCでオブジェクト自体が開放されれば登録したイベントも消えるらしいのですが、しばらく残り続ける状態になるので、場合によってはパフォーマンスに影響が出るとかで。
とはいえ、段幕シューティングとかやって全部のタマにイベントとか付けたりしたりとか、極端な事をしなければremoveEventListenerし忘れてもそれほど大変なことにはならないっぽいですけど。

そんな感じでまだまだいろいろと手探り状態ぽ。
2017-03-04.Sat おあずけ三昧
2017/03/04(Sat) 06:41:49
ぬううう。
なんかいろいろとストレス溜まる展開ばかりな最近。

まず先日のHDD売り切れ。

んで、麻雀PGやろうと思ったものの。
namespaceのネストがQTだと上手く動かない。QTでもVCビルドを使っているのですが、vc++2015のupdate3ではamespaceのネストは機能として入ったはずなんだけどなぁ。とおもったら/std:c++latestフラグ必要なのね。
で、.proにフラグ追加してみたけど、やっぱ使えない??
いやビルドは通るようになったんだけどQt creator上でインテリセンスきかなーい。赤下線もついてるし。

むーん。vc++2017来てからにするか……。

で、VisualStudio2017のc++1z対応を再確認。

optional, string_viewあたりはうれしい追加。てかoptonalも随分待たされたぽ。

以下は今のところまだRC版からなにか追加あるのかわからないのですけども。発売直前だというのにあんまし情報出て来てないですね。c++1zで注目の機能いくつか覚え書きも兼ねてちょっと書いてみる。

「basic_string::data()メンバ関数の非const版」
なにげに一寸前にガリガリやってたzip書庫の編集ツール作ってたときに、ByteArrayのバイナリ参照なんかを受け渡しするときなんかで、QByteArrayのdata()メソッドもそいやconstしか無かったなと。なので非constにするために助長なコード書く必要出てきたりで。stringも生データ使う時にはそういうのでちょっと遠回りするコードを何かで書いたような。なので非const版確かに欲しいなとおもた記憶が。

「インライン変数」
今ではすっかり.cppファイルを使わないでみんな.hに書く癖ついたのだけども、クラスの定数とかstaticメンバ変数なんか使う時にいちいちクラスの定義の外に__declspec(selectany)で書いたりするのが面倒っちゃ面倒だったのが、これでstaticメンバ変数もそのままヘッダのクラス内の定義の部分に一度書くだけで済む用になって便利~。

「if constexpr文」
お、ついに来たかとおもったら違ったの巻。
そのあとで別のc++関係のブログで

if(constexpr()){
// コンパイル時評価時
}else{
// 実行時
}

みたいなのが、まだ「提案」という形で上がってるのみて、なんかコレすごく欲しいけど、とっくにあるんだろうな。検索の仕方が悪くて、こういう機能の書き方が見つけられてないだけなんだと思ったら……まだ「提案」があがった所なのか……。
これが出来ると、constexpr化されてないmath関数なんかをconstexpr関数のなかで、コンパイル時は適当に自前で書いたコードにして(どうせコンパイル時に計算されるから実行コストは無視出来るので適当な実装でも問題無いぽ)、実行時は標準の関数を呼ぶみたいなのが出来るのですよね。
オレオレライブラリ的なものを作るのに、この辺も含めconstexpr関係の対応が遅れまくってた所為で一旦撤退した部分もあるので、この機能がまだ提案レベルてのはちょっとがっくり。
ちなみに元の「if constexpr文」はifの評価式がコンパイル時に行われるというもの。これはこれで便利そうだけど。

「if文とswitch文の条件式と初期化を分離 if (init; condition)」

if(int size=list.size(); size < 100){ ... }

みたいなの。
以前でも似たようなことできたけど、結構結果がたまに予期せぬバグの温床になりそうな無理くり感あるかんじだったので、こうしてきちんと初期化部と分かれてくれるのはよいですね。
これの何が良いと言えば、余計な変数をスコープの外で宣言しなくて良くなるのがよいですね。

int size = list.size();
if(sizeze < 100){ ... }

と以前なら書くけど、sizeがif文の後でも残り続けるのが気持ち悪い。

{
int size = list.size();
if(sizeze < 100){ ... }
}

なので仕方なくブロックでスコープを切り分ける感じに~とかは良くやるけど、これで一段下がるのでなんだかなーという所もあったりで。
そゆのが無くなるのはいいですね。
地味にうれしい機能です。

「emplace_frontとemplace_backで追加された要素を返す」
pop_frontとpop_backの返値voidじゃないやつが欲しいなぁ……。
削除じゃなくて取り出して除去てパターンの機能がほすぃ。
まあemplace_frontとemplace_backで追加された要素を返すってのもコレも冗長なコードが減って短く書けるってだけのアレだけど。


ttp://faithandbrave.hateblo.jp/entry/2016/08/23/181620
最大公約数と最小公倍数
std::gcd(m, n);
std::lcm(m, n);
範囲内に納める
std::clamp(value, min, max);

この辺はまあ、普通にみんな自前でフリー関数とかクラスとかで作ってたりする物だったりするので標準化ってもの今更感あるけど。

でもこれまだc++1z(c++17)なんだよなぁ。
vc++のc++17対応はなんかいまいち新しい情報入ってきてないのでほぼ白紙に近い感じなのでこれがvc++で使える用になるのはいつの日か……それともvc++2017で意外にどーんと追加……無いか……(遠い目)

んでもってまだ3/7発売予定なのでまだどうなるかもおあずけ。まあ多分現状と大して変わらずな感じで今後のupdateでまたちまちま対応していくパターンかなぁ。

しかし……
ttps://cpplover.blogspot.jp/2017/02/c-p0550r0-p0601r0.html
下の方にあるC++20の計画っていうネタっぽい奴。
コンセプトはまだまだ先か……SFINAEでやってるやつはなんかごてごてしてる感じになっちゃうので、はやくコンセプトですっきり書ける様になりたいなー。
そしてモジュール……ヘッダの依存関係に悩むのはもうとっとと終わりにして欲しい。
でもネタとはいえc++20て三年後かよと思うと、うわぁって感じだなぁ。
まだまだそんなにおあずけ続くのかとおもうとぐんにょり。



んで、ちょっとweb向けになにかミニゲームっぽい物をってのほうはというと。これもhtml5はVisualStudioでTypeScriptな感じで~とかおもうとこれまたVS2017待ちな状況。

んでもって、やっぱjavascriptはどうにも言語的に酷いのでやっぱ触りたくないなーって気持ちもむくむくと。
ちょっと界隈調べてみたけど、TypeScriptとかgoogleのなんとかとかにしても、結局アレですよね。

みんななんだかんだ言って、素のjavascriptなんかそのまま組んでられねぇ。

て本音というか、結局糞言語扱いしてんじゃねぇか。てのが良く現れてますよね。静的型付けしたスーパーセット的拡張言語を別で用意するあたり。なんでこんなの流行っちゃったのか……エディタでぺろっとかいたのがブラウザで即動く。ってのは確かに魅力的ではあるんですが。
あとはjavascript界隈は定番と呼ばれるものでさえいくつものライブラリがあって、なにがなんやらな状況になってるぽ。


で、unityも微妙に次の5.6に追加される2D関係の機能ほしいなーってのがあって、もうちょっと待つか……って気分になっちゃったし。

ここはレトロにflashか。
と久々にparaflaとかのぞいてみる。なんかサイト閉鎖してる? が、いまだに脱出ゲーム界隈ではまだまだ使われてるツールだったりして。

が、ちょっと作り方講座みたいなの見てみると、あ、やっぱコレ無理~って感じに。
フラグ管理とかデータ構造回りが見通し悪すぎてやってられない感じだなーと。

んで、FlashDevelop+ActionScript3.0なんかにも手を出してみる。
ActionScript3.0は、かなりC#に近い感じで、組みやすいですねこれ。
enumが無いのと、コンストラクタや関数の引数違いのオーバーライドが無いってところがちょっとキツイですけど。
あとは型や関数の返値を基本後ろに記述するのが未だに慣れない。(つーてもまださわりだして二日目だけど)

でもまあ、オブジェクト指向でもりもりデータ管理とかオブジェクト管理出来るのでparaflaよりは馴染むかなといったところ。そしてFlashDevelopが軽くていいですね。情報集めてるときにみた前評判高かったんですけど、実際に使ってみて確かにこれはいい開発環境だなと。

でもちょっと致命的というか、ガッカリなところが一つ。
FlashDevelopはタイムラインとかなくて、コードオンリーで作っていく感じなんですけど、時にはタイムライン制御なかんじのが作りやすい物もあったりするので、その辺はparaflaでつくったswfを読み込む感じでやっていけばいいかなーと思ってたのですが。
paraflaで出力できるswfの形式がAVM1形式までで、ActionScript3.0ではAVM1形式は再生制御が出来ず、ただ垂れ流しの動画としてしか利用できないとか……。
フレーム制御でたとえばボタン押したら何フレーム目にジャンプとかがActionScript3.0側から操作出来ないぽ。(AVM1形式swf内部のボタンでの自分自身のフレーム移動は出来るみたいだけど)

うへぇ。

で、AVM1からAVM2以降にコンバートする方法とかないのかなとググってみたところ、変換するツールに変換しながら読み込むloaderスクリプトまでいくつか出てきたけど、どれも全滅。酷いのはバイナリで見てみたらヘッダのバージョンの所の1バイト書き換えてるだけというこれってジョーク? みたいなしょーもないのまであったりw

で、結局どれもうまくいかない。
変換出来ても再生がおかしくなるうえ、結局フレーム制御は出来ないままってのが一番マシというかんじで。
どうも元のswfの出力オプションまわりの問題らしいのだけど、paraflaで書き出したswfではその問題は解決出来なさそう(そこで書かれてた出力オプションの項目がparaflaには存在しない)

結局、タイムラインでの編集したswfをActionScriptでフレーム制御しながら扱いたければ有料のAdobeのflash開発ソフト買えよというオチ。

まあ、タイムライン無いけどフレーム制御に近い感じのアニメーション動作とかできるTweenerライブラリとかでなんとかまあ埋め合わせ出来るかなぁ。
とりあえずそんな複雑なものを作るわけでもなく、とりあえず脱出ゲームあたりでも作ってみようかなとか、VisuarStudio2017待つ間のつなぎでちょっとやるだけなので。

でもここでも結局、思ったようにいかない感じぽ。
ほんと最近なんかどっちを向いても壁にぶち当たるかんじでいやん。