プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
槍兵32方向アニメパターン(80×80)

統合した画像ファイル
画像解像度を調整して、槍兵の全アニメパターンを1枚の画像ファイルに統合した。読み込み速度と表示速度の向上が期待できる。



◎新規作成?機能追加?

前々回からの続きで、画像ファイルの統合を行います。
今回はA案に取り組みます。

A案:画像ファイルを結合するツールを作成する

以前はこのように書きましたが、よく考えると次の2通りの方法が考えられます。

A1案:既存のツールとは別に、画像統合ツールを作成する
A2案:既存のツールに、画像統合機能を追加する

A1案の場合、使用者は2つのツールにそれぞれパラメータを設定することになるので管理が面倒です。
連画出力ツールから画像統合ツールにテキストファイルでパラメータを渡す方法も考えられますが、XNAはシリアライズの問題があるので、プログラムがややこしくなりそうです。

A2案の場合、使用者は中間の連画ファイルを意識せずに画像統合ファイルを手軽に入手できます。

使い勝手が良いA2案を目指しましょう。



◎XNA使用不可

A2案は既存のXNAプログラムを改修するものですが、実装にあたり1つ厄介な問題があります。

「一度出力したPNG画像ファイルは、 XNAで再度読み込むことはできない(XNAが読み込めるのはXNBファイルのみ)」

既存の連画出力プログラムはXNAですが、今回追加する機能はXNAで実装できないので、C#で実装する必要がある、ということです。

XNAとC#(正確には.NET Framework クラス ライブラリ)が混在するプログラムは一度作ったことがありますが、注意事項がかなり多かったと記憶してます。

既存プログラムにいきなりC#のコードを追加するとハマりそうな気がするので、まず空のXNAプロジェクトを作成し、これに今回の機能を実装してから、最後に既存プログラムに移植しましょう。



◎混乱の要因

C#で画像を扱う場合、通常はSystem.Drawing.Bitmapクラスを利用します。

まずSystem.Drawingの参照設定を追加し、using System.Drawing;を追記すると…早くもエラーが出ました。

GraphicsDevice.Clear(Color.CornflowerBlue);

空のXNAプロジェクトは、Color.CornflowerBlueで画面を初期化しているので、Colorクラスがバッティングしたのです。

GraphicsDevice.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);

こんな感じで名前空間のパスを記述するとエラーは解消されますが、既存プログラムまたは新規プログラムでColorを使う度に記述する必要があります。プログラムが把握しにくくなる上に、引数や返却値も違うので、混乱しないよう注意しましょう。



◎表示状態の確認

System.Drawing.BitmapクラスのGetPixelとSetPixelを利用して、アニメパターン画像ファイルを作成しました。

槍兵3方向アニメパターン(256×256)

保存ファイル解像度:2048×2048
1枚あたりの画像解像度:256×256
方向数:3(←不足)
1方向あたりの動画枚数:20


全部で32方向分必要ですが、従来の条件では2048×2048に3方向分しか入りません。足りない場合はアニメパターン画像ファイルを複数化することも考えたのですが、それでは画面表示パフォーマンスを最大限に引き出せません。

全アニメを1枚にまとめようとする場合は、解像度を大幅に下げる必要があります。見た目が心配なので、試しに64×64に落として表示状態を確認しましょう。

槍兵画像解像度を下げる表示テスト(カメラバック)   槍兵画像解像度を下げる表示テスト(カメラズームアップ)

カメラをズームアップするとちょっと荒いようですが(右図)、ゲーム中にここまで近付けるのはまれなので、今後は解像度を落として画像ファイルを1枚に集約します。



◎調整

槍兵32方向アニメパターン(64×64)   槍兵32方向アニメパターン(80×80)

64×64だと効率が悪い(左図)ので、80×80(右図)に調整しました。

保存ファイル解像度:2048×2048
1枚あたりの画像解像度:80×80
方向数:32
1方向あたりの動画枚数:19


1枚あたりの画像解像度は2の累乗ではありませんが、保存ファイルの解像度は2の累乗なので、未対応グラボでもエラーになりません。



◎次回予告

ようやく1枚の画像ファイルにまとめることができましたが、これだけでは意味がありません。この画像ファイルで槍兵を表示するように、プログラムを改修する必要があります。

というわけで、次回はこの画像を表示するシェーダーを実装します。

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

あるある

クラス名のバッティングは結構キツイですね(汗)。私もよく悩まされます。一応、Fooというクラスが2つ別の名前空間にある場合、

using SystemFoo = System.Aaa.Foo;
using XnaFoo = Xna.Xxx.Foo;

などとソースの冒頭でエイリアス名を定義する方法があるにはあります。が、じつはバッティングの発生するソースファイルが複数の場合でも、ファイルごとに宣言する必要があるため、鬱陶しいです…。


あとまた薀蓄ですが(笑)、じつはintはSystem.Int32、stringはSystem.Stringのエイリアス名だったりします。ふだんXNAだけ使っているつもりでも、無意識に.NET Frameworkを使っているんですね(もちろんご存知のように参照設定が必要なものもありますし、360では機能の限定された.NET Compact Frameworkしか使えません)。

いまさらかもしれませんが、公式サイトにスプライトシートのコンテンツパイプラインサンプルがありますよ。
http://creators.xna.com/ja-JP/sample/spritesheet

大量のテクスチャファイルを1ファイルに結合してファイル名でアクセスできるようにしてくれます。自分もつい先日導入してみましたが結構便利でした。

>HOSSIEさん
おお、色々便利なのがあるんですね。

こんばんわ~

>ソースの冒頭でエイリアス名を定義する方法
そのような方法があるのですね。結構便利そうですが…?

>ファイルごとに宣言する必要がある
闇雲に多用するのは良くないようですね。状況によって使い分けるようにします(^^)

>無意識に.NET Frameworkを使っている
そうですね。XNAは.NET Frameworkを基盤に構築されているので、相性は良いはずです。ただ、XNAの中では整合が取れていたものが、.NET Frameworkを併用するとあいまいになったりするので注意が必要ですね。

>スプライトシートのコンテンツパイプラインサンプル
とても便利そうなサンプルですね。今回は3D連画取得から画像統合まで1つにまとめたかったので使用しませんが、今後画像を統合する際は積極的に活用したいと思います。

また、付属ドキュメントの中に、以前から悩んでいた問題の原因と回避策が記述されてました。現在サンプルプログラムを解析中です。この件に関しては次回ブログに記述します。

大変有益な情報をありがとうございました^^

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。