どこかのだれかへ

職業ゲームプログラマ。気になったニュースのピックアップや開発日記などを書いています。

ListViewにContextMenuを表示する方法

WPFでListViewにContextMenuを表示する方法に関して、noteのほうに書きました。

ListViewにContextMenuを表示する

定数でdefine使ってる場所があって大変だった

とあるヘッダーファイルをインクルードしたら、Enumの定義の1つがエラーになった。
エラー内容的に、どうも定義が重複しているらしい。

でも名前空間結構深いし、名前空間の名前もユニークで、インクロードガードもある。重複することなんてあるのか? そんなことを思って調べたら、#defineで同じ名前の定数が定義されていました。

defineは、置き換え処理なので、名前空間なんて通用しません。
これで結構時間を無駄にしました。

C++ではdefineによる定数定義は非推奨なはずで、代わりにstatic const、C++11ならconstexprを使えばコンパイル時に適用されるのでこれを使うべき、これを実感しました。

せめてdefine使うなら絶対かぶらないような名前にしておいてくれていれば、こんなことにはならなかった。

イベントのNullチェックを省略する

毎回イベントのNullチェックするのって面倒ですよね。
空のdelegateを登録することで、省略することが出来ます。

EventのNullチェックを省略する

ブラックラグーンで寝不足、仕事の後はバカルディ

月曜日にAmazonプライムビデオでなんとなく見たブラックラグーンがどストライク!
今週は夜中までずっとアニメ見て、原作の漫画も買って読んでいました。
11巻はいつ発売なんでしょうか。

話の最初の方で主人公のロックとレヴィがバカルディラム酒)で飲みくらべをするシーンがあるのですが、影響を受けて今はバカルディを飲みながらこの記事を書いています。 (アルコール度数高くて辛かったので、結局ラムコークにしましたが)

そんな生活をしていたので昨日今日と案の定、寝不足でした。特に今日はなかなかひどかったです。

仕事中に眠くなるほど寝不足ではなかったものの、今日は1つ検討タスク(機能の実装が難しいと思われたため、どうやって実装するか調査・検討するタスク)があったんですが、まったくもって進まず。 ちょっとコードを書いては削除、書いては削除で全くもってうまくいきませんでした。

仕事効率を考えれば、少なくとも8時間は寝たいんですけど、そうすると24時には寝ないといけないんですが、なかなか難しい……

プログラマライクな画像ビューアがほしい

ゲーム開発をやっていると画像ビューアは当然ながら日常的に使うわけですが、今のところ自分の条件を網羅したビューアがありません。

ないものはしょうがないので、プログラマらしく作ろうと思うので、とりあえずほしい機能を整理します。

  • プラグインによる対応フォーマットの追加
  • 画像の比較
  • カーソル下のRGB値の表示
  • 各チャンネルごとに表示
  • コマンドラインオプションの充実
  • コンバート機能
  • ミップマップ表示
  • 各フォーマットの設定ビュー
  • ディレクトリ内サムネイルビュー
  • サイズ等の特定条件に一致する画像の検索

とりあえず今思ったものを挙げてみました。 特に必須なのは「プラグインによる対応フォーマットの追加」です。

ゲーム開発ではプラットフォーム、エンジン、プロジェクト単位で独自フォーマットを使う場合があり、これを表示するために拡張は容易にしたいです。Susieプラグインというのがありますが、C#で拡張したいので選択肢にはありません。

ゲーム開発進めるとこういうちょっとしたやつが欲しくなって作り始めるとメインのゲーム開発が進まないんですよね……(プロ生ちゃん時報がその例の1つ)

コメント最後のドットとダメ文字

同じチームにコメントの最後にドットを付ける人がいて気になったので調べたんですが、これはダメ文字対策らしいです。
ShiftJISにおいて文字の2バイト目が制御文字(バックスラッシュとか)とかぶっていると、コンパイラがミスって想定外の動作になってしまう場合があります。

たとえば、C++で「// ○○機能」というコメントがあったとします。
"能"はダメ文字で、2バイト目が0x5cでバックスラッシュと認識されてしまいます。
C++でバックスラッシュは次の行も同じ行として扱われるので、次の行もコメント化されてしまいます。

たまにネタになる、「コメントを消すとバグる」という元ネタはこれの事なのかな?
そしてこのダメ文字問題対策の1つとして最後に必ずドット(.)を付けることで、次の行がコメントにならないようにしている、ようです。

ただ今はそんな小手先のテクニックは使わずに、ソースコードUTF-8化しろ!の一言で済むと思います。 僕が関わっているプロジェクトはソースコードUTF-8なのでダメ文字問題が発生することはありません。

ちなみにVC++の場合は、ダメ文字問題は発生しません。コンパイラが良い感じに解釈してくれているようです (VC++はデフォルトShifJISなのでそれでこの問題発生したら辛いですね)
試していませんが、gccとかだと発生するんですかね。

STLコンテナで使えるアロケータ

独自アロケータを作って、それをstd::vector内でのメモリ確保に独自アロケータを使用する方法に関して、記事を書きました。

STLコンテナで使えるアロケータ

もうこれでstd::string怖くない! (うちのアロケータは貧弱で小さいサイズのアロケートに弱いですが……)