‘開発ネタ’ カテゴリーのアーカイブ

冬コミお疲れ様でした の2

2012年1月18日

冬コミお疲れ様でした、
ということでこっちは業務連絡ような。

まずは業務連絡から、
冬コミで頒布した「AIに『ダブルスポイラー』をプレイさせる本」ですが、
余った分を大須マニアックス様にて委託して頂くことになりました。
これは有難い……。
相当にニッチな本ですが、もしご興味があればどうぞよろしくお願いします。

そして以下は、会場で頂いた幾つかの疑問や意見への現状での回答。
会場では結構リップサービスしてたと思うんですがそこら辺は勘弁して下さい(;´∀`)

> ソースコードの公開はしないの?

前向きに考えてはいるんですが、現状コードが汚すぎて無理っすという感じ。もし公開するにしても、もうちょい(?)コードクリーニングしてからでしょう。少なくとも特殊ライブラリを使ってる部分は平易に直さないなぁといったところ。マニュアル作るのもめどいし結構辛いなこれ……。

> 動画は公開しないの?

2011年12月30日時点で、東方Projectのプレイ動画のweb上での公開はまだアウトの状態なんでちょっと無理ですね。リプレイの配布なら可能なんですが、よほど特殊なリプレイでもない限りちょっと有難味がないような……。

> 未来予測とか学習とか

機械学習についてはSVM使って光学文字認識を軽く実装した程度の知識ですが、もしパターン構築の方向に進むならアプローチとしては王道ですね、といった感じ。
未来予測については、これから精度向上をするにあたって手を付けたい方向性の1つですね。オプティカルフローみたいなので、画面内の弾幕のベクトルを取得してー、みたいなことが出来れば色々と応用が効きそうですが果たして……。

Canvas を使ってなんか作ってみた

2011年2月21日

ここんとこですが、なにか作りたいぞ欲求がわりかし高まっていまして。クソゲーを産出するのは Flash が常道なんでしょうけど、Flash の開発環境用意するって実際問題面倒ですし、お手軽に出来そうなモノとして Canvas をさわってみました

Canvas ってのは HTML5 で策定された html 上で図やらを表現する技術でして、Javascript なんかと連動することでうまい具合に頑張れば Flash を使わずにリッチコンテンツが提供出来るってことで、流行っているような技術みたいなものです。そーいえば FIrefox の 4 はいつになったらリリースされるのでしょうか?

さて、そんなワケで Canvas ってどんなもんかな、ってところも含めて軽くさわってなんか作ってみました、いわゆるサンプルプログラム、というのもおこがましい……

http://trr.sakura.ne.jp/php-test/110221.php

こういったアクションっぽいゲームっぽい、のコードを書くのって実は今迄経験がなくて、若干悪戦苦闘しつつジャンプの処理やらマップチップとの当たり判定の処理なんかをサクサクっと書いてこんな感じです。意外にまともに動いてくれます。

さて、どうしようかなー

先日のちょっとした補足、キャラの名前間違ってたらごめんなさい

2011年2月18日

先日のアレですが、こんな感じで html が生成されます

http://trr.sakura.ne.jp/php-test/110217.php

ウンコなぺちぱーはこの世にソースコードを公開するなんて許されざる風潮を感じないでもないですが、まぁ大したことはやってないんで以下のような感じです。入力をなんとかして、配列をデータベースに格納すればもうちょい実用的ななにかになる可能性を感じないでもないけど、まぁ個人の道楽の為にコードなんて書いてなんぼなので(^o^)

よく分からない人に軽く補足しておくと、まぁ下記のコードの 49行目の $rank と、69行目の $rankNotes を追加していくだけで、以降は勝手に表を生成してくれるという話です。多少手間はかかってますが便利でしょ

// 表のタイトル
echo "<h2>【東方キャラソート 〜結果推移を php で可視化してみる〜】</h2>";
// 作品とキャラの対応を定義
function getTitleName($id) {
	$title = array(
		array(1,2,3,4,5,6,7,8,9), array(10,11,12,13,14,15,16,17,18,19,20), array(21,22,23,24,25,26,27,28,29),
		array(30,31,32,33,34,35), array(36,37,38,39,40,41,42,43), array(44,45,46,47,48,49,50,51),
		array(52,53,54,55,56,57,58), array(59), array(60,61), array(62), array(63,64), array(65,66,67),
		array(68,69), array(70), array(71,72), array(73), array(74,75,76));
	for($n=0;$n<count($title);$n++) {
		if(in_array($id,$title[$n])) break;
	}
	switch ($n) {
		case 0 : $col = "#A44"; $str = "東方紅魔郷"; break;
		case 1 : $col = "#88C"; $str = "東方妖々夢"; break;
		case 2 : $col = "#A4A"; $str = "東方永夜抄"; break;
		case 3 : $col = "#E88"; $str = "東方花映塚"; break;
		case 4 : $col = "#4A4"; $str = "東方風神録"; break;
		case 5 : $col = "#C60"; $str = "東方地霊殿"; break;
		case 6 : $col = "#28F"; $str = "東方星蓮船"; break;
		case 7 : $col = "#86F"; $str = "東方萃夢想"; break;
		case 8 : $col = "#C44"; $str = "東方緋想天"; break;
		case 9 : $col = "#888"; $str = "ダブルスポイラー"; break;
		case 11 : $col = "#CA4"; $str = "東方三月精"; break;
		case 12 : $col = "#888"; $str = "秘封倶楽部"; break;
		case 13 : $col = "#888"; $str = "東方求聞史紀"; break;
		case 14 : $col = "#888"; $str = "東方香霖堂"; break;
		case 15 : $col = "#C22"; $str = "東方茨歌仙"; break;
		case 16 : $col = "#888"; $str = "東方儚月抄"; break;
		default : $col = "#888"; $str = ""; break;
	}
	return "<span class='title' style='color:" . $col . ";'>" . $str ."</span>";
}
// キャラの名前を定義
$name = array( "ダミー",
	"ルーミア", "大妖精", "チルノ", "紅 美鈴", "小悪魔", "パチュリー・K", "十六夜 咲夜", "レミリア・S", "フランドール・S", "レティ・W",
	"橙", "アリス・M", "リリーホワイト", "リリカ・P", "メルラン・P", "ルナサ・P", "魂魄 妖夢", "西行寺 幽々子", "八雲 藍", "八雲 紫",
	"リグル・N", "ミスティア・L", "上白沢 慧音", "因幡 てゐ", "鈴仙・U・イナバ", "八意永琳", "蓬莱山 輝夜", "上白沢 慧音", "藤原 妹紅", "リリーブラック",
	"メディスン・M", "射命丸 文", "風見 幽香", "小野塚 小町", "四季 映姫・Y", "秋 静葉", "秋 穣子", "鍵山 雛", "河城 にとり", "犬走 椛",
	"守谷 早苗", "八坂 神奈子", "洩矢 諏訪子", "キスメ", "黒谷 ヤマメ", "水橋 パルスィ", "星熊 勇儀", "古明地 さとり", "火焔猫 燐", "霊烏路 空",
	"古明地 こいし", "ナズーリン", "多々良 小傘", "雲居 一輪", "村紗 水蜜", "寅丸 星", "聖 白蓮", "封獣 ぬえ", "伊吹 萃香", "永江 衣玖",
	"比那名居 天子", "姫海棠 はたて", "博麗 霊夢", "霧雨 魔理沙", "サニーミルク", "ルナチャイルド", "スターサファイア", "宇佐美 蓮子", "マエリベリー・H", "稗田 阿求",
	"森近 霖之助", "名無しの本読み妖怪", "茨木 華扇", "綿月 豊姫", "綿月 依姫", "レイセン2号");
// 画像が存在するキャラ
$imageExist = array(
	1,2,3,4,5,6,7,8,9,10,11,12,14,17,18,19,20,22,23,24,25,26,28,29,31,32,33,34,35,37,38,39,40,
	41,42,43,45,46,47,48,49,50,51,52,54,55,56,57,58,59,61,63,64,66,68,70,71,72,73,74);
// ランキング結果は取り敢えずここに格納
$rank = array(
	// 結果 1つ目
	array( 23,  8, 22, 48, 52, 59, 39, 33, 35, 19, 56, 46, 43, 51, 70, 41, 61, 20,  6,  4,
		   29,  1, 24, 12,  3,  2, 34, 45, 47, 49, 50, 71, 17,  7, 11,  9, 25, 26, 64, 63,
		   38, 40, 32, 18, 37, 42, 36, 31, 27,  5, 10, 14, 57, 58, 66, 65, 55, 44, 53, 54,
		   16, 21, 15, 13, 75, 74, 76, 60, 67, 69, 68 ),
	// 結果 2つ目
	array( 23, 56,  8, 22, 39, 19, 52, 48, 33, 46, 51, 20, 59, 35, 29, 70, 45, 24, 71, 47,
		   68,12,43,10,1,4,6,37,40,41,11,17,26,34,50,61,9,64,66,18,
		   7,3,63,2,49,32,72,69,36,25,38,58,53,57,31,5,55,54,14,16,
		   27,42,21,65,13,60,44,75,74,76,15,67 ),
	array( 56, 23, 22, 66, 45, 73, 58, 39,  8, 19, 46, 52, 48, 51, 43, 49, 55, 68, 72, 70,
		   50,1,31,59,24,35,32,9,33,4,41,6,29,10,12,11,20,25,26,47,
		   61,54,57,62,69,26,65,71,34,7,63,64,40,3,2,14,17,38,21,42,
		   18,16,15,13,74,30,60,5,44,53,67,75,76,36,37 )
);
// ランキングの個数をここで定義
define("RANKDATASIZE", count($rank));
define("CHARADATASIZE", count($rank[RANKDATASIZE-1]));
// ランキングの集計日時はここ
$rankNotes = array( "2009年11月08日", "2010年02月01日", "2011年02月14日" );
// キャラのランク上下によって出力される前回の結果との差分、を関数で定義して出力
function rankChangeText($rank,$i,$j) {
	if ($j!=0) {
		// $iは現在のランク位置、取得した$nは過去のランク位置、$rank[$j][$i]はキャラのID
		for($n=0;$n<count($rank[$j-1]);$n++) {
			if ( $rank[$j-1][$n] == $rank[$j][$i] ) break;
		}
		if ( $n-$i > 0 ) return "<span class='rankChange' style='color:#F44;'>(+" . ($n-$i) . ")</span>";
		if ( $n-$i < 0 ) return "<span class='rankChange' style='color:#44F;'>(" . ($n-$i) . ")</span>";
	} return "<span class='rankChange' style='color:#888;'>(0)</span>";
}
/*ここからテーブル要素*/
echo "<table border='0' cellspacing='0' cellpadding='0'><tbody>\n";
echo "<tr class='tr_head'><td class='td_head'>No.</td>";
for ( $i=0;$i<RANKDATASIZE;$i++ ) {
	echo "<td class='rank_notes' colspan='3'>" . $rankNotes[$i] . "</td>";
}
/* ↑ ヘッダ ↓ 要素 */
for ( $i=0; $i<CHARADATASIZE; $i++ ) {
	echo "<tr><td class='td_head td_head_element'>" . ($i+1) . "</td>";
	for ( $j=0; $j<RANKDATASIZE; $j++ ) {
		if ( $i < count($rank[$j]) ) {
			// 画像を表示、三項演算子で画像がないキャラは 00.png を表示
			echo "<td class='td_image'><img src='img2/" . (in_array($rank[$j][$i],$imageExist)?sprintf("%02d", $rank[$j][$i]):sprintf("00")) . ".png' style='float:left;' width='32px' height='32px'></td>";
			// ランキング上下、キャラクター名、作品名 を表示
			echo "<td class='td_change'>" . rankChangeText($rank,$i,$j) . "</td><td class='td_name'>" . $name[$rank[$j][$i]] . "<br />" . getTitleName($rank[$j][$i]) ."</td>\n";
		} else {
			// キャラが存在しない場合は空要素を挿入
			echo "<td class='td_none'colspan='3'></td>";
		}
	}
	echo "</tr>";
}
echo "</tbody></table>";

ついでにスタイルシートが以下、すごいどうでもいいね!!

table, tr, td, tbody, p, img {
	margin : 0px;
	padding : 0px;
}
table {
	font-size : 0.8em;
	border: 1px solid #DDF;
	border-width: 0px 2px;
}
td {
	border: 1px solid #EEF;
	border-width: 0px 0px 1px 0px;
	padding: 2px;
	vertical-align: middle;
}
tr {
	background-color: #FCFCFF;
}
.td_head {
	width: 1em;
	paddin-right : 0.5em;
}
.td_head_element {
	text-align: right;
}
.td_image {}
.td_change {
	width: 2em;
	text-align: center;
}
.td_name {
	width: 9em;
}
.td_none {}
.rank_notes {
	text-indent: 1em;
}
.tr_head {
	background-color: #DDF;
}
span.rankChange {
	font-size	: 0.8em;
}
span.title {
	font-size: 0.8em;
	font-weight: bold;
	margin-left: 1em;
}

趣味じゃなかったり趣味だったり

2010年10月22日

Windows マシンのあらかじめ区切ってあったパーティションに、デュアルブートをしようと xp を載せたら、メインの Windows7 のブートストラップが破壊されて、マシンを起動しても「Verifying DMI Pool Data…」からうんともすんとも言わなくなったでげそ、うごごご……

何が原因って Eclipse のバージョン 3.5 を 64bit の Win7 で動かそうとしたらエラー地獄だったんで、せっかく空けてあるパーティションもあるし xp 32bit でも入れるかな、って流れだったはずなんだけど、Windows でのパーティション分割でのマルチブートってデリケートなんですね。結局デュアルブートはひとまず保留してインストールディスクから修復かけて一件落着といったところで

以下さらに全く関係ないですが、ビットマップこと HBITMAP を DirectX な感じで描画するために、DirectX のテクスチャからサーフェスを取得して、サーフェスのデバイスコンテキストを取得して、BitBlt しようとしてるんだけどなんか上手くいかない。Win32 への理解も以前と比べれば大分マシになってきた気もするけど、まわらない頭の状態だとなかなか上手くいかないものである

いまいち SelectObject() 関数とか BitBlt() 関数がどういったもんなのか理解がおっついてないんで、ってその前にテクスチャまではある程度分かっているけどサーフェスってなんなんだろねって、おいおい (^^;

よーく考えて見れば自分のウィンドウのハンドルなんて当然ご存知なワケで、GDI 経由でふつーに書き込める気がしないでもないけど、折角なんでどっちも実装してしまって性能比較するのがモアベター、というかそうします

しかしまぁ、ようやっと長きに渡るサンプルコードの解読作業から解放されたけど、GDI と DirectX で思った以上に速度向上が望めないっぽくて、戦々恐々としている今日この頃なのでした C++ に WIN32API に DirectX と理解がおっついてない部分が多くて、にっちもさっちも

半人半霊の庭師 魂魄妖夢-六道剣Ver.-東方Project特別編レビュー

わーお、すっごい邪魔そうな台座はともかくとして、相変わらずのグリ顔だなぁ(‘A`) フランちゃんとはなんだったのか……。でもけーね先生は買うよ!

JR電気街口改札が工事完了、渋滞解消?

へー、そのうちメロンブックスに寄るついでにでも