2009/05/27(水)StaticResourceLoader.cs
GSDK on C# で。
これで
namespace Tsukikage.GameSDK.Base { public interface IDXResourceLoader<ResourceType> { ResourceType LoadResource(ResourceType target); } }
こうして
namespace Tsukikage.GameSDK.Direct3D { public class D3DDevice : DXResource, IDXResourceLoader<D3DTexture>, IDXResourceLoader<D3DFont> { public D3DTexture LoadResource(D3DTexture target) { LoadTexture(target); return target; } } }
こうやって
using Ref = System.Reflection; namespace Tsukikage.GameSDK.Base { /// <summary> /// staticリソース読み込み支援クラス /// </summary> public class StaticResourceLoader { static Dictionary<Type, StaticResourceLoader> loaders = new Dictionary<Type, StaticResourceLoader>(); public static void Load<TypeToLoad>(Type target, IDXResourceLoader<TypeToLoad> loader) { lock (loaders) { if (loaders.ContainsKey(target) ) return; loaders[target] = new StaticResourceLoader(); foreach (Ref.FieldInfo fi in target.GetFields(Ref.BindingFlags.Public | Ref.BindingFlags.Static)) { if (fi.FieldType == typeof(TypeToLoad) && fi.GetValue(null) != null) loader.LoadResource((TypeToLoad)fi.GetValue(null)); } } } } }
で、こう。
namespace WindowsGame1.Scenes { public class Textures { public static D3DTexture Circle = new D3DTexture("circle.png"); } class Scene1 : Scene { public override void Initialize() { StaticResourceLoader.Load<D3DTexture>(typeof(Textures), GSDK.D3D); } } }
……。
まず口から出てくるのは「キメェ」の一言かもしれない。
ただ、大富豪的プログラミング時代においては、中規模程度のゲームまではこういうリソースの持ち方もありかなぁと思わないでもない。
(自分も含めて)ゲーム作り初心者が多いうちのサークルでは、この前もテクスチャリソースがリークして大変なことになってたけど。
ここを読んでくださっているみなさんはどう思われますか、なんつて。
ここを見てる人はきっとリソース管理なんて朝飯前で、こんなことしないのかもしれない……。
あー、ゲーム作りてぇなぁ……。
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 だったら目も当てられない。
えーーーー どこーーー???? になること請け合い。
未解決。
関係ないけど。今日、西条に初雪が降りました。明日はもっと冷えるそうです。正直……