« 2013年12月 | トップページ | 2014年2月 »

2014.01.30

今更だけど、Cppcheckを使って初音ミク冒険記のソースを静的テストしてみた

| |コメント (2)|トラックバック (0)

 このエントリーをはてなブックマークに追加

Astlibraの作者のKEIZOさんが
BBSでメモリアクセスエラーに関する書き込みをしていたので
いまどきだとオープンソースでメモリアクセスエラーとか検出するような
ツールって無いんだろうかと思い、調べてみました。

有償のVisual Studioだとできたと思うんだけど
無償のExpressではできないと思っていた静的テストが
無料でできるツールCppcheckを見つけたので、今更だけど
初音ミク冒険記のソースで実行してみた。

※注1
無料のVisual Studio 2012 ExpressでC++の静的コード解析ができるよ。
という記事によると、Visual Studio 2012だとExpressでも静的テストができるようになったらしいです。

※注2
VC2012 Expressで静的コード分析」の
最後の方によるとVC++2010でもSDKと連動させると使うことができたらしいです。

参考にしたのは
大人になったら肺呼吸」の記事
Visual Studio + CppcheckでC++コードの静的解析ができる」です。

以下の環境で動作させてみました。
・Windows 7
・Visual Studio 2008 Express Edition SP1
・Cppcheck 1.63.1

CppCheckはコチラからダウンロードしました。

その後、Visual Studioのメニュー「ツール-「外部ツール」を設定します。

外部ツールの画面が出たら「追加」ボタンをクリック。

最初は、上記のサイトの通りに

タイトル:Cppcheck
コマンド:cppcheck.exe
引数:--enable=all --template vs $(ItemPath)

と設定したんですが
これだとソース単位でのチェックになってしまい
初音ミク冒険記みたいにソースの数が多いとツライことが分かりました。

--enable=allは全部のチェックをを有効にする、
--template vsというのはVisual Studioスタイルで出力するって意味で
$(ItemPath)は、現在開いているソースって意味らしいです。
cppcheck 日本語マニュアル

そこで、ちょっと設定をいじって以下のようにしてみました。

タイトル:Cppcheck本体
コマンド:cppcheck.exe
引数:--enable=all --suppress=syntaxError --template vs $(SolutionDir)

対象ソースを$(SolutionDir)ということでソリューションファイル(.sln)のフォルダとし
さらに--suppress=syntaxError(文法エラーをはじく)をつけます。

なんで文法エラーを弾くかというと
Visual Studioでコンパイルできたら文法エラーは無いはずというのと
もっと早くに調べたらVC++のコーディングが楽になったのに・・・に書いた

#pragma region リージョン名
#pragma endregion

を使っていたため、リージョン名に日本語を使うと

error: The code contains characters that are unhandled. Neither unicode nor extended ASCII are supported. (line=30, character code=83)

みたいに、しこたま怒られるためです。
(まぁ、もともと海外のソフトだしね)

実際、日本語の関数名や変数名を使っているAstlibraのソースで試した所
このエラーが大量に出ていて、何が本当の警告なのか分からないくらいでした。

で、この設定にして動かしてみたところ
Astlibraは、警告メッセージも少なく良い感じなのに
うちのは、いっぱい出てくるねぇ・・・

Cppcheckでは主に以下のチェックを実施してくれます。

・範囲外例外のチェック
・クラス毎のコードチェック
・例外のチェック
・メモリリークのチェック
・推奨されない関数の警告
・不正な使い方のSTLに対するチェック
・初期化されていない変数、未使用変数のチェック

初音ミク冒険記で多いものを列挙すると

■style: The scope of the variable 'idx' can be reduced.
(変数idxのスコープは、局所化できます)

<言い訳>
本当はループ変数のidxとかは
for(int idx = 0; idx < MAX_YYYY; idx++){
みたいに書けるんですが、PSP版の頃は、この書き方をすると
コンパイルが通らなかったので、あえてやってません。

まぁ、ブロックを示す{~}の間でしか使わないものは
そっちに宣言しても良いんですがね。

■style: Variable 'idx' is assigned a value that is never used.
(変数idxに設定した値は、使われていません)

<言い訳>
C言語だと変数の初期化漏れが怖いので、とりあえず変数宣言と同時に0で初期化して
実際に使うとき直前で正式な初期化を行ってます。

他には戻り値の受け捨て(戻り値チェックをやることになった時に備えて)や
DrawFormatString( posX, posY, SKYBLUE, "防御属性"); posY = posY + 20;
と言った行を連続して書いて
後から行が増えた時にもコピペして使えるようにしたりといったことを
意識的にやっていたりします。

■performance: Variable 'posX' is reassigned a value before the old one has been used.
(変数posXは、前に設定した値を使っていません)

<言い訳>
前述のようにとりあえず0を設定していたりするので
正式に使う段階で、前に設定した値を使っていないってことがあります。

■使ってよかったなと思うこと
iいくつか無駄な条件分岐や未使用の関数が見つかったこと
それと書式文字列の微妙に誤った使い方をしていた箇所をみつけられたこと

さらに「ソースコードの静的解析ツール CppCheck と Jenkinsプラグイン」によると
CppcheckはJenkinsとも連動できるらしい。
Jenkinsは、Traclightningをインストールすると一緒にインストールされるので
連動することができるかもしれないなぁ。

実は、最近、仕事でやっかいな障害対応をしていたこともあって
こういう無償で使える品質強化ツールは、とてもありがたいと思うんですよ、これが。

 このエントリーをはてなブックマークに追加

| |コメント (2)|トラックバック (0)

2014.01.26

Windowsゲーム「初音ミク冒険記」、2014/01/25版公開

| |コメント (0)|トラックバック (0)

 このエントリーをはてなブックマークに追加

■2014/01/25版公開
Version20140125

2014年最初の公開になります。

この記事の投稿は2014/01/26になってしまってますが
2014/01/25版として公開します。

ダウンロードページとか他を2014/01/25版で作ってたのに
この記事を書いていたら日が変わっていたというワナ(笑)

今回もマップや敵は増えていません・・・

先に別の記事に書いたようにバグ修正と
デバッグメニューのオプション追加が中心になっています

マップは増えていないのですが
過去にななしあさんの指摘があった部分を直したりして
プログラムの内部的には、結構変更が入っているので
不具合とか気になる点が見つかった場合は、コメントもらえると嬉しいです。
もちろん「やってみたよ!」というコメントも大歓迎です!

ざっくりと前回公開からの差分をまとめると以下のようになります。

  1. 坂に落下したコインや音符がジワジワ落ちていき坂を突き抜ける不具合の修正
  2. マップ切り替えエフェクト中は、操作ができないように修正
  3. ブレイクオブジェクトを壊した時、ブレイクオブジェクトに与えたダメージが
    正しくない場所に描画されていた不具合の修正
  4. パーフェクトヒールでSPが回復しないように修正
  5. その他もろもろのバグ対応
  6. 新しいデバッグオプションの追加

ダウンロードはコチラから。

それでは、個別に見ていきましょう。
今回も、結構、長い記事です。

■坂に落下したコインや音符がジワジワ落ちていき坂を突き抜ける不具合の修正
実は、坂に落下した後にも重力をかけているのですが
その時に浮動小数点演算の誤差が累積してジワジワ落ちていってました。

初音ミク冒険記は2Dゲームなんですが
ゲーム内部ではDXライブラリの3D系の演算を使うため
3次元で座標を管理していて
座標が浮動小数点で管理されています。

浮動小数点演算の誤差というのは
floatやdouble型で0.1を10回ループで加算する処理をすると
すぐ分かるんですが、実は0.1を10回加算しても
コンピュータの内部では1.0にはなりません。

この1.0にはならない部分が「浮動小数点演算の誤差」なんですが
「浮動小数点演算の誤差」が累積すると
いつかは整数部の値が変わります。

つまりコインや音符の場合だと、整数部が増えると下に移動することになり
これが繰り返されることで坂を突き抜けてしまいます。

このため、今回は、坂に落下したら浮動小数点の値を一度整数型に格納して
小数部を切り捨ててから、もう一度浮動小数点の値に戻すことで
誤差を累積させないようにしました。

■マップ切り替えエフェクト中は、操作ができないように修正
ななしあさんの過去の指摘にあった
食わねーわよでの作戦会議(推理パート)後に暗転が始まった時ドアから出る
これの他にも現在開発中の「ワープの画面切り替えエフェクト中に動ける」
という問題もマップ切り替えエフェクト中は、操作ができなければ問題ないので。

もっとも、まだ必要アイテムを入手できないからワープできないけどね。

■ブレイクオブジェクトを壊した時、ブレイクオブジェクトに与えたダメージが
 正しくない場所に描画されていた不具合の修正
ダメージ表示をする場所をブレイクオブジェクトの位置を指定したつもりで
敵の位置に指定していたため、「試練の洞窟 エリア2」で
ブレイクオブジェクトを破壊した時に
ブレイクオブジェクトの番号と一致する敵の番号が画面内に存在したら
(既に死んだ敵の場合でも)そこにダメージ数字が出ていた。

これは、以前にも記事で書いていましたが
ある程度耐久力のあるものを壊してマップの仕掛けを動かす
ってのも面白いかなぁと考えているので
もともとブレイクオブジェクトにはHPが設定されています。

このため、ブレイクオブジェクトを攻撃した時は
ダメージ数字が出てくれないと困るのだが
実はこのバグ、全然気づいていなかった・・・

コインや音符が坂突き抜け落下するというのの
テストをやってて偶然見つけたのだ。

コインや音符の坂突き抜け問題は、かげさん自身も気づいてはいたんだけど
ななしあさんからも指摘されて、早めに直さなきゃと思ったのが良かった。

改めて、ななしあさん、指摘してくれてありがとうございます。

■パーフェクトヒールでSPが回復しないように修正
スキルのテストをする時にSPが回復するようにと思って
パーフェクトヒールではデバッグ用にSPも回復するようにしていたんだけど
以前SNS内でも話題にしたように
パーフェクトヒール使用時はSPを全消費するようにしました。

SPを一気に回復したい時は、
デバッグメニューから「HPやSPの設定」で回復できるし。

■デバッグメニューのオプション追加
Screenshot0117

パーフェクトヒールでSPが回復しなくなったことで
SPを消費するスキルのテストがしづらくなるので
新しくデバッグメニューに「スキルコストがある/ない」の区分を追加しました。

スキルコストなしにすると、SPを消費するスキルもSPを消費しなくなります。

また、ノックバックのテストをすることがあるので
「ダメージを受けない」というオプションも追加しています。

ついでに動画を作るときように
「マウスカーソルを表示する/しない」のオプションも付けました。

もっとも、後から気づいたけどキャプチャツール側にも
マウスカーソルの指定があったんだけどね・・・

■注意事項1
Windows版の古いバージョンの「初音ミク冒険記」で
セーブデータを作っている人は、セーブデータをコンバートしないと
初音ミク冒険記が起動できないことがあります。

■注意事項2
前回同様、過去の初音ミク冒険記が動かせる環境がない人は
「ミクやルカ」の画像が含め
全キャラが白いマスク画像で表示されます。

過去の初音ミク冒険記が動かせる環境がある人は
ダウンロードのページに簡単な作業手順をまとめたので
それに従って実行環境を構築して下さい。
不明な場合はコメント下さい。

また、過去の初音ミク冒険記が動かせる環境がある人も
「ミクやルカ」の画像は表示できても
「デフォ子」や「ネル」、「ハク」、
「レン」、「リン」、「MEIKO」、「KAITO」、
「モモ」、「テト」の画像が
真っ白で表示されますので、あしからず・・・。

■注意事項3
第2章のボカロタウンのマップ画像は、マップ間移動ができる部分や
調べることが出来る場所の目印程度しかありません。

少しずつマップチップも作っていこうと思いますが
気長にお待ちください。

画像関連は、今後もいろいろとネックになるような気がしています。

グラフィック出来る人いないだろうか・・・

■追加、修正した機能のリスト
・デバッグオプションにマウスカーソルの表示区分を追加

・デバッグオプションにダメージを受ける/受けないを追加
(ダメージを受けないにすると、ノックバックはするけど、ダメージを受けないようになる)

・デバッグオプションにスキルコストあり/なしの区分を追加
(スキルコストなしにすると、SPを消費するスキルもSPを消費しなくなる)

・パーフェクトヒールを使うとSPを全部消費するよう修正
(SPを一気に回復したい時は、デバッグメニューから「HPやSPの設定」で回復する)

・坂に落下したコインや音符がジワジワ下に落ちていき
 最終的に坂を突き抜けて落下する不具合の修正
(ななしあさんの指摘)

・内部処理修正やコメント整備(ゲームの動きには影響なし)

・マップ切り替えエフェクト中は、操作ができないように修正
(ななしあさんの指摘にあった
 食わねーわよでの作戦会議(推理パート)後に暗転が始まった時ドアから出る
 これの他にも現在開発中の「ワープの画面切り替えエフェクト中に動ける」
 という問題もマップ切り替えエフェクト中は、操作ができなければ問題ないため)

・ブレイクオブジェクトを壊した時、ブレイクオブジェクトに与えたダメージが
 正しくない場所に描画されていた不具合の修正

・第1章クリア後で最初にキャンプメニューを開いた時
 キャンプメニューの画面下中央に表示されるセーブデータアイコンとして
 使われる画像が表示されず黒い四角が表示される不具合の修正

・セーブデータのエリア名が14文字を超えると画面外にはみ出る
 不具合の修正
(1行で16文字まで出力可能にしたが、念のため2行表示も考慮し修正した)

 このエントリーをはてなブックマークに追加

| |コメント (0)|トラックバック (0)

2014.01.20

しばらく更新が滞ってしまいました

| |コメント (0)|トラックバック (0)

 このエントリーをはてなブックマークに追加

3連休の前から風邪っぽいとは思っていたのですが
先週は喉に来てしまい病院に行ったりして
体調が悪い日が続いてました。

今日の昼間は、妙に眠かったので
今夜は早めに寝ようと思う。

なお、次の初音ミク冒険記の公開は今週末までのどこかで行う予定。
主にバグ修正とデバッグオプションの追加になります。

 このエントリーをはてなブックマークに追加

| |コメント (0)|トラックバック (0)

2014.01.11

☆祝!ブログ開設9周年!☆

| |コメント (0)|トラックバック (2)

 このエントリーをはてなブックマークに追加

今年も1月11日がやってまいりました!

111ということで、このブログは本日で9周年です

おめでとクラッカー( ^-^)。∠※PON!。.:*:・'°☆。.:*:・'°★°'・:*

みなさん、コメントやトラックバック(*^-゚)v Thanks!!☆彡

今年も、この日に「初音ミク冒険記」の最新版公開を
考えたりしてました。

が、このまま2年連続で過去形になることが確定しました・・・。

今週前半のペースだと公開できるかも?と思ってたんだけど
水曜あたりから失速してしまいまして・・・

現時点では、Tracで管理しているチケット数は以下の通り。
チケット総数:69
消化チケット数:19
残チケット数:50

一応、1月4日から5件のチケットを消化しているんだが
総チケット数が増えているので、まだ50件残っている・・・

「初音ミク冒険記」に関しては、また別の記事を近いうちに書きますね。

PS
かげさんと同じ1月11日にからブログを始めた
のっちさんの「西訪旅游 ~タイ ピピ島・クラビ・プーケット 諸々アジア旅のブログ~」も9周年です!

 このエントリーをはてなブックマークに追加

| |コメント (0)|トラックバック (2)

2014.01.09

新年、衝動買い初め!? Kindle Fire HDX 8.9インチを購入!

| |コメント (0)|トラックバック (0)

 このエントリーをはてなブックマークに追加

1月5日まで5,000円Offだったので思わず購入してしまいました!

まだ、実際にこれを使ってamazonでは買い物をしていないのですが
買い物はしやすそうに感じました。

アプリがGoogle Playに比べて貧弱ではあるんですが
使うアプリってだんだん絞られてくると思うので
あまり気にしないことにしました。

また、Wifiが繋がらないなどの不具合があるというレビューがありましたが
うちではサクサクと動いてくれます。

mp3の再生とか、mp4の再生をテストしましたが中々良さげです。

何より、一番の用途として考えていた自炊したPDFが思ったより
読みやすくて買って良かったと思います。

本体があまりに軽くて、逆に同時購入したカバーの方がかなり重く感じます。

 このエントリーをはてなブックマークに追加

| |コメント (0)|トラックバック (0)

2014.01.07

プロになるための ゲームプランニングの教科書 《基礎》

| |コメント (0)|トラックバック (0)

 このエントリーをはてなブックマークに追加

かげさんは別に
ゲームプランニングのプロになろうと思っているわけではない。

が、こないだの日曜までBOOKOFFが本の20%Offをやっていたので
見に行った時に見つけて買ってきたのだ。

本当に読みたかったのは、一部だけ。
レベルデザイン関連のところだ。

レベルデザインというのは
簡単に言うとゲームのステージをデザインするってこと。

今の初音ミク冒険記だと
ウータウの森のレベルデザインが急務なわけで・・・

と言っても実は、レベルデザインについては

の方が詳しく載っているので
この本はあくまでサラッとなんだけどね。

初音ミク冒険記では、BGMやSE、グラフィック(3Dモデルを含む)関連は
かげさんが著作者様の提供している素材を利用させてもらっている。

それ以外の部分では、ゲームプランナー的な作業もあるわけで
全然役に立たないわけではなかったりする。

なるほど!
と思うこともいくつかあったしね。

もっとも、この本でページを割いているドキュメントの作成については
レベルアップのゲームデザインの方がサンプルも詳しくて分かりやすいと思う。

まぁ、初音ミク冒険記にはドキュメントらしいドキュメントはほとんどなく
公開しているイベントフラグの管理表とか
セーブデータコンバート用にセーブデータで使う構造体をまとめた資料を作ったくらい。

普段、仕様の確認は、
・ソースにあるコメント
・SVNのコミットログ
・このブログの記事
を使っている。

最近は、TracLightningを使っているのでそっちも見てるかな。

少しずつドキュメント整備をしていこうとは思っていますので
(最近、ソースを修正する都度、少しずつその周辺をドキュメント化している)
そのうちダウンロードできるようにするかもしれません。

 このエントリーをはてなブックマークに追加

| |コメント (0)|トラックバック (0)

2014.01.05

2台使って作業するときに便利なリンクケーブル

| |コメント (0)|トラックバック (0)

 このエントリーをはてなブックマークに追加

2台のパソコンのそれぞれのUSBポートに刺して
リンク用のアプリを起動すると
2台のマシンでキーボードとマウス、クリップボードを共有できます。

かげさんはVMWare Workstationなどを入れているため、
USBをCD代わりとしてアプリがブートするといったことができないので
アプリを手で起動しますが、
USBポートの特殊処理をするようなアプリが入っていない人は
USBを指すだけでアプリが起動します。

キーボードとマウスの切り替えは
片方のマシンでマウスカーソルを画面の端を
(かげさんの場合、デスクトップマシンの右側)超えるように
マウスカーソルを移動すると
もう一台の反対側の画面端
(かげさんの場合、ノートパソコンの左端)から
マウスカーソルが移動して
キーボードは、マウスカーソルがあるほうのマシンとして動作します。

クリップボードが使えるので
テキストのコピーとか、ファイルのコピー、画面のハードコピーも受け渡しできて便利です。

もっともキーボードとマウスだけなら
マイクロソフトが出している
複数PCでマウス・キーボードをLAN共有する無料ソフト
Mouse Without Borders」でもできるし、USBの切替器でもマウスとキーボードを共有できるんですが
クリップボードも共有できるのがおいしいです。

クリップボードを使わないと、ファイルを共有フォルダに置いてとかするから面倒なんです。

プログラムの開発やグラフィック系のソフトは、
デスクトップマシンの広いディスプレイを使いたいし
ブラウザでの検索やPDFを参照しながら作業する時に
アプリを切り替えるのは面倒なので
ノートパソコンと2台で作業することがあるんですが
この時にキーボードとマウスを使い間違ったり
せっかくブラウザやPDFでコピペできる箇所を見つけても
クリップボードを共有していないから面倒だったのです。

値段も2,000円台前半だし、あっても良いかなと思い買ったのですが
ほんとうに便利です。

良い買い物したなぁ

 このエントリーをはてなブックマークに追加

| |コメント (0)|トラックバック (0)

2014.01.04

TracLightningで担当チケット数を表示する

| |コメント (0)|トラックバック (0)

 このエントリーをはてなブックマークに追加

TracLightningの覚書

■TracLightningで担当チケット数を表示する手順
1.「チケットを見る」で表示したページの下の方にある
  「このページを編集する」ボタンをクリック。
2.以下の部分を修正する
  修正前

あなたが担当者として割り当てられているチケットを表示します。あなたの作業状況の確認にご利用ください。
[[TicketQuery(owner=$USER&status!=closed,table)]]

  修正後

あなたが担当者として割り当てられているチケットを表示します。あなたの作業状況の確認にご利用ください。
全体:[[TicketQuery(owner=$USER,count)]] 消化:[[TicketQuery(owner=$USER&status=closed,count)]] 残件:[[TicketQuery(owner=$USER&status!=closed,count)]]

これで、全体のチケット数、消化したチケット数、残りのチケット数が分かる。
現時点では、以下のようになっているのが分かった。
チケット総数:66
消化チケット数:14
残チケット数:52

件数が分かると、なんか張り合いも出てくるよね。

にしても今日3チケット消化したのに、残が52か・・・
チケットが増えるペースの方が速いのがツライところだな

 

 このエントリーをはてなブックマークに追加

| |コメント (0)|トラックバック (0)

2014.01.03

札幌に戻ってきた

| |コメント (0)|トラックバック (0)

 このエントリーをはてなブックマークに追加

仕事は月曜からだけど、今日、札幌に戻ってきた。

12月は、想定よりも忙しかったので
あまり部屋の掃除ができていないので・・・

JR北海道は怪しいので往復ともに都市間バスです。

バスの道中では「パズドラZ」をやってました。

前のプロジェクトの時に一緒だった人が
「パズドラ面白いよ」という話をされていたので
移動の間にやっていたんですが
確かに面白いですね。

コンボが9もつながると結構、いい感じにダメージがいきますねぇ。

 このエントリーをはてなブックマークに追加

| |コメント (0)|トラックバック (0)

2014.01.01

あけおめ、ことよろ2014

| |コメント (0)|トラックバック (0)

 このエントリーをはてなブックマークに追加

明けましておめでとうございます。

元旦恒例の初詣に行って来ました。

おみくじは中吉でした。

去年見つけたページ「引いたはいいけどどの順番?意外と知らない「おみくじ」の並び順
によると去年の小吉より上の順位だったようです。

▼おみくじの順位
大吉
中吉
小吉

半吉
末吉
末小吉

小凶
半凶
末凶
大凶

元日スペシャルの相棒も面白かったですね。

去年の元旦は何を書いていたか見てみると
情報処理技術者試験とPhotoShopについて書かれているけど
情報処理技術者試験は
結局、体調を考えて受験しないことにしたし
PhotoShopの使い方ももうちょっとの覚えたいところですねぇ。

PhotoShopは、シンパシーの教材と
「PhotoshopとProminenceで作るゲームエフェクト」のPDF3ファイルを
入手しているので、そこで覚えていくぞぉ!

皆さーん、今年もよろしくお願いしますね!

 このエントリーをはてなブックマークに追加

| |コメント (0)|トラックバック (0)

« 2013年12月 | トップページ | 2014年2月 »