MASATOの開発日記


前の開発日記 次の開発日記 一覧

2003/01/13

最近は特に勉強もせず、Age of Mythologyという遊びっぱなしです。 いつかはこんな面白いゲームを作ってみたいものですねぇ・・・。

ゲームのフレームワーク試行錯誤1

さて、前回からの続きということで、まっとうなゲームのアーキテクチャを考えてみましょう。 しばらくは机上検討ということになります。今まではアーキテクチャと曖昧にぼかしてきましたが、 まずは、何を作るのかから決めます。

ゲームアプリケーション用のフレームワークを作ります。それは、最低でも今考えているゲーム(RPG。シングルプレイで育てたキャラを 使ってネットワーク対戦できる)に適用できなければなりません。 さらには、他のRPGにも適用できるべきです。さらには、他のジャンルのゲームにも適用できるても良いでしょう。

設計詳細及び実装については範囲外とします。再利用できるような実装等も考えてみたいとは 思いますが、ひたすら細かくなりそうなので、ここ(開発日記)では、設計概要だけを考えることにします。 どこまでを概要と考えるかについてですが、ここでは特定のゲームにしか使えないような部分を省いたものを概要とします。 設計のイメージを掴むために、一例の実装を記述するというのはあっても良いとします。

次に、このフレームワークが、もう少し具体的に、どのようなゲームアプリケーションを対象とするかを考えます。 もちろんどんなゲームも対象と出来ればよいのですが、それをするには私は経験不足なので、 今の私で作れそうな範囲のゲームに絞り、それを対象とすることにします。
私が今まで作ってきたゲームの特徴の論理積を取り、それを列挙してみます。

今回のフレームワークは、上記の特徴を持ったゲームアプリケーションを対象とします。

さらに、前回までの問題を全て解決したものとします。
構成が根本から変わるので、解決済みの問題も考慮しなければなりません。
以下に、今までの問題を全部列挙します。

どうやら問題は山積みのようです。先が大変そうです・・・。

(2003/04/05) 分かりやすいように書き直す。

バイト列のBASE64エンコード/デコードの方法

環境Visual C#.NET

もうちょっと実用的な話をしようということで、 C#においてバイト列(byte[])からBASE64形式のエンコード/デコードの方法を解説します。
目標は、任意のバイト列を、BASE64形式のバイト列に変換(エンコード)することと、その逆の変換(デコード)です。

変換には、こんなクラスを使います。

using System;
using System.Security.Cryptography;

// 中略

  public class Transformer {
    private ICryptoTransform transform;
    public Transformer(ICryptoTransform transform) {
      this.transform = transform;
    }

    public byte[] Transform(byte[] src) {
      if (src.Length == 0)return new byte[0];
      int inputSize = transform.InputBlockSize;
      int outputSize = transform.OutputBlockSize;
      int destSize = (src.Length / inputSize) * outputSize;
      byte[] dest = new byte[destSize];
      int i = 0, j = 0;
      for (; i < src.Length - inputSize; i += inputSize) {
        j += transform.TransformBlock(src, i, inputSize, dest, j);
      }
      byte[] last = transform.TransformFinalBlock(src, i, src.Length - i);
      byte[] newdest = new byte[j + last.Length];
      Array.Copy(dest, 0, newdest, 0, j);
      Array.Copy(last, 0, newdest, j, last.Length);
      dest = newdest;
      return dest;
    }
    public static Transformer ToBase64 {
      get {
        return new Transformer(new ToBase64Transform());
      }
    }
    public static Transformer FromBase64 {
      get {
        return new Transformer(new FromBase64Transform());
      }
    }
  }

このコードはそのままコピー&ペーストしてお使い下さい。

BASE64形式のエンコード/デコード用のクラスは、ToBase64TransformとFromBase64Transformというクラスです。 しかし、これらのクラスには、バイト列からバイト列への変換方法が無いので、 その部分をTransformメソッドに実装しました。 ついでにBASE64形式を扱うときに便利な二つのプロパティToBase64とFromBase64も追加しました。 バイト列からバイト列への変換用メソッドが、なんでクラスライブラリに無いんでしょうね? あってもおかしくないのですが。もしかしたら私が見落としているだけかもしれません。

さて、このクラスを使えば簡単にバイト列からBASE64形式へのエンコード/デコードができます。
エンコード用のコードは次のようになります。

byte[] base64code = Transformer.ToBase64.Transform(data);

デコード用のコードは次のようになります。

byte[] data = Transformer.FromBase64.Transform(base64code);

もう少し具体的な例を書いてみます。 文字列を、UTF8でエンコードして、それをBASE64にエンコードし、それをASCIIでデコードしてみます。 つまり、普通の文字列を、BASE64形式の文字列に変換するということです。

using System.Text;

// 中略

    string src = "ほげほげ";
    string dest = Encoding.ASCII.GetString(
      Transformer.ToBase64.Transform(
      Encoding.UTF8.GetBytes(src)));

最後に、この逆の変換をやってみます。

using System.Text;

// 中略

    string str = Encoding.UTF8.GetString(
      Transformer.FromBase64.Transform(
      Encoding.ASCII.GetBytes(dest)));

このTransformerクラスは、BASE64だけではなく、インターフェースICryptoTransformをサポートしたどんなクラスにも適用できます。 機会があったらこのクラスを応用したお話も書いてみたいと思います。

前の開発日記 次の開発日記 一覧