5月, 2015 のアーカイブ

えー、はい、タイトル通りPlayStation Mobile (Vita専用)にて “Life Born” と言うゲームを配信開始しました!

 

このゲームは元々PlayStation Mobile GameJam 2013 Winter にて作られたゲームで、この度作り直して配信開始しました!

 

動画です:

 

ゲームのページです:

 – http://www.jp.playstation.com/psn/psm/title/#!0517

 

良かったらやってみてください m_ _m

あと感想、意見等があればコメント頂けましたら嬉しいです。

 

あ、ちなみにこのゲームはFarmFury!等を配信している Max Neet Gamesとは別件です

 

近況報告: Psmで新作リジェクトされました! orz

 

 

・・・は置いといて、今回はxmlを読み込み、一つのクラスか構造体の配列を保存する時に使う処理を少し使い回す方法を紹介します。今回はXNAが関係無いので、C#メモ扱いにしています。

 

まずはxmlを読み込み、配列を保存するクラスの宣言をします。

 

 

using System;
using System.Collections.Generic;
using System.Xml.Serialization;

public class XmlTable<T> where T : class, new()
{
    // XMLファイルの拡張子
    public const string _FILE_EXTENSION = ".xml";

    protected T[] m_data;

    public XmlTable()
    {
        m_data = null;
    }

 

 

Generic(T)の部分に読み込むデータの型を指定し、変数としてその型の配列を保存しています。今回はxml前提で作成していますので、拡張子名も設定しています。

 

 

それでは次は読み込む処理です。やる事はファイルを読み込み、XmlSerializerを使用して上記で指定したデータ型の配列に変換するだけです。

 

 

    public virtual void Load(string filepath, string extention = _FILE_EXTENSION)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T[]));
        System.IO.FileStream fileStream = System.IO.File.OpenRead(filepath + extention);
        m_data = (serializer.Deserialize(fileStream) as T[]);
        fileStream.Close();
    }

 

 

読み込みが終わりましたので、読み込んだデータを獲得する処理を作ります。

 

 

    public T GetData(int index)
    {
        if (m_data == null)
        {
            return null;
        }

        int length = m_data.Length;
        if (index < 0 || index >= length)
        {
            return null;
        }

        return m_data[index];
    }

 

 

後は実際に使用するだけです。やる事はデータ型の宣言、XmlTableクラスのインスタンス化、Load()処理を呼び、データを獲得します。

 

 

    public class CharaData
    {
        public int ID = -1;
        public string Name = "";
        public float MoveSpeed = 0.0f;
        public int SheetSizeX = 1;
        public int SheetSizeY = 1;
        public float AnimationTime = 0.0f;
    }

XmlTable<CharaData> m_charaTable;

        public void Load()
        {
            // インスタンス生成
            m_charaTable = new XmlTable<CharaData>();

            // 読み込み
            m_charaTable.Load( GetTablePath() );

            // データ獲得
            CharaData data = m_charaTable.GetData(0);
        }

 

 

以上です。今回は素のままの使用法を紹介しましたが、自分で使う場合はそのまま使う時と、これを継承して個別のデータ獲得方法を作ったりして使用しています。

 

 

    public class CharaDataTable
        : XmlTable<CharaData>
    {
        public CharaDataTable()
            : base()
        {
        }

        public CharaData FindData(int charaID)
        {
            int size = m_data.Length;
            for (int i = 0; i < size; ++i)
            {
                if (m_data[i].ID== charaID)
                {
                    return m_data[i];
                }
            }

            return null;
        }

 

 

今回はここまでです。一応ソース置いておきます:

そーす

前回に引き続き、iTween使えよ!って内容です。

 

今回は前回製作したTweenControlを拡張して処理が終わったら何かを行う方法を紹介します。

 

まずは、処理後に呼ぶメソッドを保存する為の変数を容易します。

 

public delegate void TweenEndFunc();
TweenEndFunc m_tweenEndFunction;

 

次に開始時の処理に終了時のメソッドを渡せるようにします。

 

        public void Start(T start, T end, float duration, TweenEndFunc onTweenEndFunc = null)
        {
            m_start = start;
            m_target = end;
            m_duration = duration;
            m_timer = 0.0f;
            CurrentValue = m_start;
            m_tweenEndFunction = onTweenEndFunc;

            if (duration == 0.0f)
            {
                IsActive = false;
            }
            else
            {
                IsActive = true;
            }
        }

 

用意が出来ましたので、更新処理の中に処理が終わった時(IsActiveがfalseになる時)にメソッドを呼ぶようにします。

 

        public void Update(float delta)
        {
            if (!IsActive)
            {
                return;
            }

            m_timer += delta;
            if (m_timer >= m_duration)
            {
                m_timer = m_duration;
                IsActive = false;

                // 処理が終わった時のメソッドが登録されていれば、呼ぶ
                if (m_tweenEndFunction != null)
                {
                    m_tweenEndFunction();
                }
            }

            float percentage = Math.Min(m_timer / m_duration, 1.0f);
            CurrentValue = m_lerpFunction(m_start, m_target, percentage);
        }

 

後は開始処理を呼ぶ時に実際にメソッドを渡す様にするだけです。

 

        public void StopBgm()
        {
            m_volumeTweener.Start(MediaPlayer.Volume, 0.0f, m_fadeDuration, _StopBgm);
        }

        protected void _StopBgm()
        {
            MediaPlayer.Stop();
        }

 

上記の例ではBgmのフェードが終わったら再生を止めています。

これを使えばフェードイン、アウトを繰り返して行う事も出来ます。

 

以上です。今回はソースコードへのリンクを置いておきます。

そーす

Vector2.Lerp()等を使用する際、開始、目標、現在の割合を変数を書く必要があり、使用頻度が増えると面倒なのである程度流用出来る方法を紹介します。

Unity使ってる人からすればiTween使えよ!って感じではありますが、まあそこはスルーで。

 

使用例の一例としてはこの動画のナイフを拾った所の演出です。

https://youtu.be/nYo9Cz80FwI

 

まずは、基本的なクラスと変数の宣言です。

現在値、開始値、目標値、掛かる時間、現在の時間、動いているかを保持しています。

   public class TweenControl<T>
   {

       public T CurrentValue { get; private set; }
       T m_start;
       T m_target;
       float m_duration;
       float m_timer;
       public bool IsActive { get; private set; }

 

Genericにしている部分に、floatやVector2等の使用するデータ型が入ります。

 

次に、Lerp()等を呼ぶ処理の準備をします。今回使用する方法は、インスタンス生成時にLerpの計算に使用するメソッドをコンストラクタで渡します。そのメソッドへの参照を使用し、毎フレーム更新していきます。

ですので、まずは渡すメソッドの定義と参照の保存を上記に追加します。

 

       public delegate T LerpFunc<T>(T start, T end, float amount);
       LerpFunc<T> m_lerpFunction;

       public TweenControl(LerpFunc<T> lerpFunction)
       {
           m_tweenEndFunction = null;
           m_lerpFunction = lerpFunction;
           CurrentValue = default(T);
           m_start = default(T);
           m_target = default(T);
           m_duration = 0.0f;
           m_timer = 0.0f;
           IsActive = false;
       }

 

ついでにコンストラクタも書いておきます。

必要な変数の定義が出来ましたので、実際に計算を行う為の処理に入ります。

まずは、開始させる為の処理です。

 

       public void Start(T start, T end, float duration)
       {
           m_start = start;
           m_target = end;
           m_duration = duration;
           m_timer = 0.0f;
           CurrentValue = m_start;

           if (duration == 0.0f)
           {
               IsActive = false;
           }
           else
           {
               IsActive = true;
           }
       }

 

やっている事は開始、目標、掛かる時間を渡し、各値を保存しているだけです。

一応0.0秒の場合はそこで終わらせるようにしています。

 

次は毎フレーム計算を実装します。

やる事は.Lerp()系メソッドを使う時に行う処理をやるだけです。

 

public void Update( float delta )
{
           if (!IsActive)
           {
               return;
           }

           m_timer += delta;
           if (m_timer >= m_duration)
           {
               m_timer = m_duration;
               IsActive = false;
           }

           float percentage = Math.Min(m_timer / m_duration, 1.0f);
           CurrentValue = m_lerpFunction(m_start, m_target, percentage);
}

 

今回は一時停止出来る様に動いていない時はそのままの値で止るようにしています。

 

後は実際に使ってみるだけです。

 

TweenControl<float> m_alphaTweener;
TweenControl<Vector2> m_moveTweener;
 
...

m_alphaTweener = new TweenControl<float>( MathHelper.Lerp );
m_moveTweener = new TweenControl<Vector2>( Vector2.Lerp);

...

public void Start()
{
              m_alphaTweener.Start( 0.0f, 1.0f, TWEEN_DURATION );
              m_moveTweener.Start(startPos, endpos, TWEEN_DURATION );
}

...

public override void Update (float delta)
{
             m_alphaTweener.Update( delta );
             m_moveTweener.Update( delta );
// ...その他の処理
}

...

protected override void DrawSelf (SpriteBatch sp)
{
              Vector2 pos = m_moveTweener.CurrentValue();
              sp.Draw( m_texture, pos, null, Colour * m_alphaTweener.CurrentValue, 0.0f, Origin, Scale, SpriteEffects.None, Layer );
}

 

以上ですー。多分次回はこれを拡張してTween処理が終わったら何かする処理をご紹介します。多分、きっと、もしかして・・・