2009/05/07(木)ブロック崩し
そういえば5月に入ってから日記を書いていないじゃないか。
ブロック崩しを作っている。
作っているといっても、まだ、1文字もコードは書いてないので
作ろうかなぁと考えていると言った方が正しいか。
簡単だと思っていたけど1つわからないことがでてきてしまった。
ボールが長方形であるブロックにぶつかったときに、
X軸速度成分を反転するのか、Y軸速度成分を反転するのか。
これを判定するスマートなアルゴリズムとはなんだろか。
ブロックの縦横の辺の長さの比とatanを使う?
ボールの半径分太らせた長方形を用意して、ボ線分と円の交差ール中心が今どの矩形内に収まっているかを判定する?
ブロックの4辺に対して、線分と円の交差判定を適用する?
いずれの方法でもやればできそうなのだけど、なにぶん面倒くさがりなもので。
それに、ボールは離散時間上を動くわけでブロックや壁にめり込む。
単に衝突を矩形判定してると、2つのブロックに同時にぶつかりうる。
よくよく考えないと2回反射して貫通弾になってしまうだろう。
現フレームで移動するはずのブロックの軌道を線分で表して、
衝突面での反射をシミュレーションするとか。
ブロックを円にするという誰もが思いつきそうなアイディアを採用すると、
当たり判定は円判定になって、反射方向はベクトルを射影して計算するーとか。
でも、よりうまく反射させるには、同じように軌道を線分化、
ボール半径分太らせたブロック円との交差判定、
めり込むはずだった分の距離を、その交点で反射、か……。
とまぁ、改めていろいろ考えてみると、
アクションゲーム作りを学ぶにはブロック崩しはなかなかいい題材なのかも。
そのうちプロジェクト自体放り出しそうだなぁω
2009/02/25(水)反マニュアル主義
「一般の人」にとっては、もうそういう時代、ね。
理解に2秒を要したらその時点でその機能は使ってもらえない。
FAQ、ヘルプが必要なシステムは設計からして間違ってる。
でも、最後に勝つのはマニュアルを事細かに読んだ人間。
昔は、パソコンのマニュアルとか周辺機器のマニュアルとか分厚いのがついてきて、
私はそのほとんどに目を通したもの。だから、所謂普通の人よりはパソコンに詳しかった。
最近、普通の人と自分を差別化するのが難しいと感じるようになってきたのは、
C#とかインテリセンスとか使ってるせいであり、
すっかり「マニュアル」というものを読まなくなってしまったせいであり、
世の中のソフトウェアが親切になってきたせい、なのかもしれない、なぁ。
そんな私は、未だにマニュアルが必要なプログラムを書き続けている、気がする、が。
2009/02/12(木)高速差分コピーツール
指定した文字列を含むパスを持つファイルを除いて、更新されたファイルだけをコピーします。
EeePCは16GBのSSDがありますが、ちょっと狭いです。なので16GBのSDHCを刺して使ってるのですが、読み書きが遅いのです。この上でプロジェクトを編集して「ビルド」する気にはあまりなれません。なので、一時的にSSDにコピーして仕事して、作業が終わったらこれを使ってSDHCに書き戻そうかという試み。
もともと、FileSystemWatcherでも使うかと思ってたんですが、監視までする必要ないかなぁとかなんとか。xcopyのオプションでなんとかならんかなぁと思って組んだのが、以下。
コピー先に存在しないか、コピー先よりも日時の新しいファイルだけコピーしてくれるバッチファイルです。
ビルド一時ファイルディレクトリ (\\bin\\~と\\obj\\~)はコピー対象にしないとかいった設定ができるので便利かなぁ。どうかなぁ。ちょっとまだ使ってみないとわかりませんが。
xcopyfast.bat
setlocal set srcPath=. set dstPath=D:\\backup echo %~n0>>%~n0.$ echo %~n0.$>>%~n0.$ xcopy %srcPath%\\*.* %dstPath%\\ /D /EXCLUDE:%~s0+%~sp0%~n0.$ /E /C /H /Y del %~n0.$ endlocal exit rem -- コピーしたくないファイルのパスに含まれる文字列を以下に指定のこと -- \\bin\\ \\obj\\
2009/01/29(木)ネトラジもどき
今日は音を録音して、UDPパケットで、LAN内の他のマシンに送りつけるプログラムを書いた。
これによりLAN内の他のマシンが再生している音が別のマシンで拾えるようになった。
ここに、TCPリスナとICY 200 OK、MP3エンコーダつけたら、
簡易ネトラジ放送ソフトができる。音ゲの中継もなんのその
netmidiの機能縮小版とでも言うか。なんか昔からこんなことばっかやってるなぁ。
using System; using System.Windows.Forms; using System.Net.Sockets; using Tsukikage.WinMM.WaveIO; namespace WinMMTest { public partial class Form1 : Form { WaveIn wi = new WaveIn(0, 44100, 16, 2); UdpClient udp = new UdpClient(29999); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { wi.OnData = delegate(byte[] d) { udp.Send(d, d.Length, "192.168.24.95", 29999); }; wi.Start(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { wi.Close(); udp.Close(); } } }
それにしても、言語が高級になりすぎて、俺にはこれをプログラムと呼んでいいのかわからなくなりつつある。それがC#という言語の恐ろしいところだ。
2009/01/12(月).NET から mixer だぁ?
題名の通り。あんまり突っ込んでやるつもりはなかったものの
2008/12/18(木)[QoF] Quest of Feena REFINE(仮)
画面は開発中のものです。
冬コミはアクションRPGを出します。
去年の夏に出したやつの焼き直しと言えばそうなのだけども。
この画面に写り混んでいるものの中に、私の著作物なんか一切ないのだけど、
無断で載せてみる実験。
2008/11/19(水)続・動的コンパイル
動的コンパイルした先のコードで例外が発生すると、スタックトレースの行番号が取れない。
場所 にはメソッド名しか表示されない。コンパイル元がファイルでもダメ。
デバッグ情報を残し、かつ一時ファイルを残す設定にして、後からpdbの読み込みを試みる。
えー。
デバッグ出力コンソールくらいしか用意できないのかしら。printfデバッグω
スクリプトととして使うならデバッグ情報が足りねーのは致命的な気がするなぁ。
ある程度、どんなところでバグることが多いかの経験があればまだしも……。
それでもInvalidOperationException とか InvalidCastException だったら目も当てられない。
えーーーー どこーーー???? になること請け合い。
未解決。
関係ないけど。今日、西条に初雪が降りました。明日はもっと冷えるそうです。正直……
2008/11/11(火)yieldが使いたい
RPGのシナリオスクリプトを、
C#のあるソースファイルのメソッドとして定義し、
C#コンパイラに食わせることを考える。
スクリプトなのだから、スクリプタさんが書く。
文法こそC#だがスクリプトっぽい感覚で書けるように留意する。
RPGなのだから「メッセージを表示してボタン待ち」のような高レベルAPIを用意したい。
スクリプトの実行はそこでブロッキングして、一見処理が止まってるように見せたい。
しかし実際にスレッドまで止めてしまうとゲームが止まってしまう。どうする?