2009/10/08(木)めも

はてブ数 2009/10/08 08:52 計算機な日記::ソフト作りつーさ
  • XNA の検索結果 約 3,420,000 件中 1 - 10 件目 (0.22 秒)
  • Managed DirectX の検索結果 約 297,000 件中 1 - 10 件目 (0.24 秒)
  • SlimDX の検索結果 約 14,800 件中 1 - 10 件目 (0.15 秒)
  • SlimDX に一致する日本語のページ 約 5,590 件中 1 - 10 件目 (0.23 秒)

うーん……

GSDKをSlimDX上に移植してます。
ちょこちょことブラッシュアップしつつ、だいたいはコピペっていう。
MDX1.1に比べて微妙に不親切だったりしてますが、書き換えること自体はあんまり難しくないみたいです。
ただ、これ何だろう? と思ったときに調べると↑なので、移植が終わってからが難航しそうだなぁ。

なんつーか、ライブラリばっか作ってないでゲーム作れって話なんですが。

2009/05/27(水)StaticResourceLoader.cs

はてブ数 2009/05/27 02:48 計算機な日記::ソフト作りつーさ

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(木)ブロック崩し

はてブ数 2009/05/07 05:32 計算機な日記::ソフト作りつーさ

そういえば5月に入ってから日記を書いていないじゃないか。

ブロック崩しを作っている。

作っているといっても、まだ、1文字もコードは書いてないので
作ろうかなぁと考えていると言った方が正しいか。

簡単だと思っていたけど1つわからないことがでてきてしまった。

ボールが長方形であるブロックにぶつかったときに、
X軸速度成分を反転するのか、Y軸速度成分を反転するのか。
これを判定するスマートなアルゴリズムとはなんだろか。

ブロックの縦横の辺の長さの比とatanを使う?
ボールの半径分太らせた長方形を用意して、ボ線分と円の交差ール中心が今どの矩形内に収まっているかを判定する?
ブロックの4辺に対して、線分と円の交差判定を適用する?
いずれの方法でもやればできそうなのだけど、なにぶん面倒くさがりなもので。

それに、ボールは離散時間上を動くわけでブロックや壁にめり込む。
単に衝突を矩形判定してると、2つのブロックに同時にぶつかりうる。
よくよく考えないと2回反射して貫通弾になってしまうだろう。

現フレームで移動するはずのブロックの軌道を線分で表して、
衝突面での反射をシミュレーションするとか。

ブロックを円にするという誰もが思いつきそうなアイディアを採用すると、
当たり判定は円判定になって、反射方向はベクトルを射影して計算するーとか。

でも、よりうまく反射させるには、同じように軌道を線分化、
ボール半径分太らせたブロック円との交差判定、
めり込むはずだった分の距離を、その交点で反射、か……。

とまぁ、改めていろいろ考えてみると、
アクションゲーム作りを学ぶにはブロック崩しはなかなかいい題材なのかも。
そのうちプロジェクト自体放り出しそうだなぁω

2009/02/25(水)反マニュアル主義

はてブ数 2009/02/25 06:30 計算機な日記::ソフト作りつーさ

「一般の人」にとっては、もうそういう時代、ね。
理解に2秒を要したらその時点でその機能は使ってもらえない。
FAQ、ヘルプが必要なシステムは設計からして間違ってる。
でも、最後に勝つのはマニュアルを事細かに読んだ人間。

昔は、パソコンのマニュアルとか周辺機器のマニュアルとか分厚いのがついてきて、
私はそのほとんどに目を通したもの。だから、所謂普通の人よりはパソコンに詳しかった。
最近、普通の人と自分を差別化するのが難しいと感じるようになってきたのは、
C#とかインテリセンスとか使ってるせいであり、
すっかり「マニュアル」というものを読まなくなってしまったせいであり、
世の中のソフトウェアが親切になってきたせい、なのかもしれない、なぁ。
そんな私は、未だにマニュアルが必要なプログラムを書き続けている、気がする、が。

2009/02/12(木)高速差分コピーツール

はてブ数 2009/02/12 08:13 計算機な日記::ボクと計算機つーさ

指定した文字列を含むパスを持つファイルを除いて、更新されたファイルだけをコピーします。

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(木)ネトラジもどき

はてブ数 2009/01/29 03:51 計算機な日記::ソフト作りつーさ

今日は音を録音して、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#という言語の恐ろしいところだ。