Category: xna game studio

Farseer

comments Farseer はコメントを受け付けていません。
By , 2010年4月30日 (金) 23:54:08

Farseerで車を作る。 左の車はAとDで、右の車は矢印キーで、タイヤにトルクかけて左右に動かす。

RevoluteJoint と PinJoint の使い方がいまいちまだ納得できてないが、 上の例では RevoluteJoint を使うべきだろう。

CollisionGroup を使って、車が自分自身とは衝突しないようにする。 しかし、他の車や床とは衝突しなくてはならない。

かなりめんどくさい。 これ、授業でやって学生ついてこれるか。

GraphicsDevice に Microsoft.Xna.Framework.Graphics.GraphicsDevice と Game.GraphicsDevice と GraphicsDeviceManager.GraphicsDeivce があるようなのだが。 紛らわしい。 というか、意味わからん。 ええっと。 Game.GraphicsDevice とは this.GraphicsDevice のことだわな。 GraphicsDeviceManager.GraphicsDeivce とは graphics.GameDevice のこと。 Microsoft.Xna.Framework.Graphics.GraphicsDevice はその型だわな。 たぶん this.GraphicsDevice と graphics.GameDevice は同じもので、 その型が Microsoft.Xna.Framework.Graphics.GraphicsDevice だということだろうな。 うーむ。

PhysicsSimulatorView.cs

comments PhysicsSimulatorView.cs はコメントを受け付けていません。
By , 2010年4月30日 (金) 17:47:25

Farseer の Demo を漁っててみつかる PhysicsSimulatorView.cs を使うと、 衝突した箇所とか外接矩形などを表示させることができる。 XNAは周知のように矩形や円や線分などを描画する関数がない(前身の Managed Direct X 1.1 にはあったのだが)。 XNAが描画できるのはスプライトか3Dのポリゴンだけだ。 ではどうやって矩形や円を描画しているかというと、 そういうスプライトを描画して(つまり new Texture2Dとかやって、Texture2Dクラスのコンストラクタで作るわけですね)、重ね描きしているのだ。 それは Farseer についてくる DrawingSystem というおまけのライブラリ (?) がやってくれる。 RectangleBrush.cs、LineBrush.cs、CircleBrush.cs、DrawingHelper.cs という四つのソースファイルで構成される (DrawingHelper.csのソースはなかなかのみものだ)。 ここで brush と言っているのは、おそらく Quake エンジンなどで言う brush と同じ意味だろう。 なぜこのような基本形状のことをブラシというのかについては、これまでもいろいろ調べてみたが、良くわからん。 PhysicsSimulatorView.cs も当然この DrawingSystem を利用しているので、 一緒に拾ってくる必要がある。 Drawing System や PhysicsSimulator は

using FarseerGames.GettingStarted;
using FarseerGames.GettingStarted.DrawingSystem;

などと書けば使うことができる。

FixedRevoluteJoint

comments FixedRevoluteJoint はコメントを受け付けていません。
By , 2010年4月30日 (金) 16:20:27

ただ単に一点でくるくる回る物体を作るには FixedRevoluteJoint を使えばよい。

CreateFixedRevoluteJoint(PhysicsSimulator physicsSimulator, Body body, Vector2 anchor)

たとえば

Body body = BodyFactory.Instance.CreateRectangleBody(texture.Width, texture.Height, 1);
body.Position = new Vector2(x, y);

FixedRevoluteJoint joint = JointFactory.Instance.CreateFixedRevoluteJoint(simulator, body, body.Position);

もう少し、ドキュメントが整理されていても良いのではないのか、と思うのは私だけだろうか。

Joint は変数に代入する必要もなければ、 PhysicsFactory に Add する必要もないようだ。

Faseer

comments Faseer はコメントを受け付けていません。
By , 2010年4月27日 (火) 18:26:41

5月のTechnical Workshop用にFaseerを勉強し始める。 ドキュメントがほとんどない割には、やってみると簡単。

簡単なサンプル。 やっぱ XNA は一度馴れてしまえば楽だよなあ。 Updateメソッドを書かなくて良いから楽なのかもしれん。 つまり、Ballを転がすにしても、コンストラクタとDrawメソッド書けば動くわけですよ。

メディアプログラミング演習IIでもやっても良いのだが、 今の2年生は来年3年生でテクニカルワークショップを受ける可能性があるわけで、 持ちネタとしては保留した方が良いかも。 その代わり、一年生のコンピュータリテラシーBには使えるわな。

なんかもう、気分は、html5よりはFaseerで行く感じです、テクニカルワークショップ。

XNA Platformer

By , 2010年4月19日 (月) 02:34:59

Platformer だが、

いずれも初心者にはかなり難易度が高い。 といって、ただ単にスプライトを差し替えるだけだとプログラミング演習にならない。 かなり七転八倒した結果、

と来て、 最終的に、

  • 踏むとプレイヤーの横方向の速度が遅くなるブロック (BlockS) を作る。
  • 拾うとプレイヤーの横方向の速度が速くなる宝石 (FastGem) を作る。

という課題を達成させようかと思うわけです。

さらに、スクロールとパワーアップを仕込み済みのコードを渡した状態で、 上記すべてを応用した自由制作。

このくらいならば Visual C# 初心者にもとりあえずいけるか。 html canvas などをいじりながら思ったのだが、 やはり、特に芸術系の学生の場合、基礎から順番にやっていくたいてい拒絶反応が出てうまくいかない。 XNA レベルの、比較的高度な(つまりダブルバッファリングも出来、クラス設計もでき、 また開発環境も完備しているという意味だが)言語を使って、いきなりソースに当たらせていじらせた方がよい。 それが体験授業で終わってしまうのであればそれはそれで仕方ない。 面白いと思って続けてくれるとうまくいくことが多い。 やはりもう、XNA より以前には戻れないのだ。 canvas とか webGL とか見ててそう思う。

C#でUDPで一対一でチャットのようなこと。

comments C#でUDPで一対一でチャットのようなこと。 はコメントを受け付けていません。
By , 2010年1月12日 (火) 18:38:50

学生と一緒にやったので、備忘録。

UDPによりデータの送受信を行う@dobon.net 参照。

PC 2つ使って送信受信するには送信と受信とそれぞれ別のループに入れないといけない。 つまりマルチスレッド。 なので【連載 】C#プログラミング入門 第7回:マルチスレッドプログラミングなど参考にややいじった。


using System;
using System.Threading; 

public class Class1
{
    static System.Net.Sockets.UdpClient udp;
    static System.Text.Encoding enc;

    static void Main()
    {
        //文字コードを指定する
        enc = System.Text.Encoding.UTF8;

        //データを送信するリモートホストとポート番号
        string remoteHost = "172.25.14.160";
        int remotePort = 2002;
        //バインドするローカルポート番号
        int localPort = 2002;

        //ローカルポート番号localPortにバインドする
        udp = new System.Net.Sockets.UdpClient(localPort);
        string sendMsg = "";

        Thread threadA = new Thread(new ThreadStart(ThreadMethod));
        threadA.Start(); 

        while(true)
        {

            //送信するデータを読み込む
            sendMsg = Console.ReadLine();
            if ("End" == sendMsg) break;
            byte[] sendBytes = enc.GetBytes(sendMsg);
            //リモートホストを指定してデータを送信する
            udp.Send(sendBytes, sendBytes.Length,
                remoteHost, remotePort);
        }

        //UDP接続を終了
        udp.Close();

        Console.ReadLine();
     }

         private static void ThreadMethod()
        {
             while(true)
            {
                //データを受信する
                System.Net.IPEndPoint remoteEP = null;
                 byte[] rcvBytes = udp.Receive(ref remoteEP);
                string rcvMsg = enc.GetString(rcvBytes);
                Console.WriteLine("受信したデータ:{0}", rcvMsg);
                Console.WriteLine("送信元アドレス:{0}/ポート番号:{1}",
                   remoteEP.Address, remoteEP.Port);
             }
         } 
}

ソースぐちゃぐちゃ。 清書してないけどだいたいわかるでしょう。

cyclerを町田版画美術館で展示します。

comments cyclerを町田版画美術館で展示します。 はコメントを受け付けていません。
By , 2009年11月12日 (木) 12:44:16

cyclerを町田版画美術館で開催される学生メディアアート展に出品します。 町田経済新聞の記事 がわかりやすいかも。

久しぶりにxna関係の話題でした。

cs4を買ったら indesign だけついてなかった。ていうか今まで全然気づかなかった。 仕方ないのでcs2 のやつを入れた。

いつもgimpやinkscapeばっか使っているので、 illustrator cs4 がいまいちよくわからん。

xbox360コントローラを分解してみた。

comments xbox360コントローラを分解してみた。 はコメントを受け付けていません。
By , 2009年10月5日 (月) 08:21:15

7za x 走らせるとload averageがいきなり8になるのはどういう仕様なのかと。

ソニーのポータブルDVDプレイヤーは多少値が張るがいたれりつくせり。 ベッドで寝ながらみたり。 再生も安定している。多少傷がつくとDellのノートPCだと止まるところが、 ソニーだとみれる。

vineのanthyってけっこう使えるよな。 fedoraよりおりこうさんなきがするのは気のせい?

例のjawiki-meta解析はやはりも少しやってみて紀要くらいにはしようかと。

cyclerに声エフェクトつけて町田展に出したい。 できればxbox360コントローラ改造したデバイスもつけたいが、 まぁ、間に合わんな。 気長に。 トルクをアナログ入力(float値で0から1までとか、-1から1までとか) できるデバイスってなかなか無いよな。 しかしxbox360コントローラならわずか4000円で購入可能。 しかも、振動用のモータを2個内臓してるから、 モータもアナログ値(これまたfloatで0から1までとか)で制御可能。

モータの回転速度をアナログ制御する装置作ろうとしたらたいへんなんだよなあ。 0と1の2値なら簡単だけど、連続に制御するのは難しい。 でもxbox360コントローラならできそうな雰囲気。 しかも開発環境はXNA。 すばらしいじゃないか。 たまにはメディアアートみたいなことやってみるか(笑)。 モータは同じのが二個ついてて、 重りが軽いのと重いのがそれぞれついてる。 それで小さな振動と大きな振動が作れる。

xbox360コントローラを分解してみた写真も撮ったがうまく接写できなかったんで、 のせてない。というか、ネットで検索するとわらわら出てくる。 十字キーを改造するのがはやりらしい。 今のとこデバイスとして改良している人はいなさそうだな。 まぁ、メディアアートやってる人って基本MacかWiiだからな。 XNAでメディアアートやる人っていないだろ。ある意味盲点だ罠。 実はXNAってなんでも出来るんだよな。 さすがにシンセとかmidiとかは弱いだろうけど。 カメラ制御はすでにC#できるし。 C#でできることってけっこう多いよな。 Project NatalとかXNAでできるようになるとすごいんだけど。 ていうか仮にコンシューマ機がぽしゃっても(笑)、 XNAってそっちのほうで十分生き残れると思うんだがなあ。 コンシューマゲーム産業に比べてかなりニッチではあるがな。

ていうか、「わらわら」変換したら「゛笑笑」になった。 すげえじゃんanthy。 ふーむ、vine5でもfedora11でも変換できるな。 一部だけatokよりすごい。 かなり使えるようになってきたanthy。

linuxだと、スリープからの復帰がデスクトップだと電源ボタン、 ノートだとキーボード、が仕様か。 vistaだとデスクトップPCのUSBキーボードでもスリープから復帰できるが、 USBマウスはしばらく無反応。

okkyがピーターの法則について書いているが、 元の法則から「「自分がまだ知らない知識について、必要であることがわかった」と言うことは もう手遅れだ 」が導かれるかどうか、納得し難いが、 言っていることはあってると思う。 まず元のピーターの法則についてだが、組織は、勤労意欲を出世という報酬によって引き出そうとするから、 割と気前よく出世はさせたり、部下をもたせたりする。 その結果、平であれば有能であったかもしれない人材を、無能な管理職のポストにつかせたりするのかもしれない。 要するに出世とは単にモチベーションの与え方の一形態だということを言ってるだけだわな。 あとこれは、「高度に組織化され管理された能力主義社会」のことを言っているのであって、 例えば幕末に脱藩した志士、などには当てはまらないということだよな。

それはそうと、必要だと気づいたときにはもう手遅れ、ということはプロの研究者でもよくおかす間違い。 必要だかどうだかわからず手探りしている状態が、あとから考えると一番クリエイティブな時期だったりするが、 それはあとから自分を客観的に観測するからそう言えるわけで、 その当時で必要であるかどうか判断がつくことはない。 逆に、これは必要で重要だから夜も寝ないで頑張るぞ、というやり方は、 見た目かっこいいし自分にも酔えるが、多くの場合無意味だってことだな。 過去の自分を観察して出せる結論としては迷ってる自分は概ね正しく、 決断している自分はたいてい間違っている、ということくらいだ。

さらに余計なつけたしを書くと、 少なくともプログラミングに関しては 「必要だと判ってから学習して間に合う」は当てはまらない。 例えば学部四年生になって卒業制作の企画を考えていて自分の作品に高度なプログラミングが必要だと気づいたときにはもう間に合わない。 一年生のときにから意味もわからず勉強してきた人だけが、四年生でプログラミングを駆使した制作ができるだろう。 そういう意味では、プログラミングの学習には、英語や歴史の暗記とか、漢文の素読のような要素がある。 タンカーは図体がでかすぎて、10km手前から舵をきらないと曲がれないそうだ。 地球の重力圏を脱出するには三段ロケットが必要で、一段ロケットでは無理だ。 そういう、一見目的とは無関係なような手順を踏まないとプログラミングは身につかない。 それから、プログラミングにはどうしても適性というものがある。 この適性というものは、デザインや芸術の世界でいう感性に近いものかもしれない。 ある程度適性があれば直感で理解できるが、 直感に頼れない場合には、何百ページものマニュアルを読み何十時間もの授業を受けて、苦労して理解しなくてはならないが、 それだけの苦労をしてほんとうに理解出来る保証もない。 ほんとうのところを言えば、大学受験する前に一通り自分にプログラミングの適性があるかどうか、確かめておいてもらいたいのだが。

思うに、飛行機だと飛び越せるところも歩兵ならば土木工事で橋を架けないと渡れない。 プログラミングの教育というものは、 自分がかつて飛んで渡ってきたところに戻って順々に大規模な土木工事をやっているようなもので、 果てしない労力が必要になる。 直感とは空を飛ぶ能力のことであり、その能力無しでは、渓谷を越えるのは、不可能ではないかもしれんが、恐ろしく手間がかかる。

Cycler

comments Cycler はコメントを受け付けていません。
By , 2009年7月22日 (水) 14:20:14

cycler01

こないだのオープンキャンパスでCyclerという学生作品を展示したのだが、思いの外、好評だった。 Farseerという2D物理エンジンを使っているのだが、 物体にはforceとtorqueの二種類の力をかけることができる。 普通のゲームではforceが使われるがこのCyclerではtorqueしか使ってない。

というか、展示するに当たって入力デバイスをxbox 360 controllerにして、 左右のアナログスティックで操作するように作りかえたのだが、 そのときはいろいろforceやらtorqueやらが使われていたのをtorqueだけにしてみたわけです。 右スティックはペダルにtorqueを加える。つまりペダルをこぐ。 左スティックは体にtorqueを加える。つまり体重を前にかけたり後ろにかけたりする。 右スティックでペダルを前にこぐと体が前に傾いてくるので左スティックで後ろに体重をかける、 というのが基本なのだが、下の鎖の傾きとか体へのトルクのかけ具合によっては体が後ろに傾くこともある。 そのへんを左右のスティックで微妙にコントロールしないといけない。 コツがわかってくるとだんだんうまく安定して自転車を走らせることができるようになっていく。 逆に焦れば焦るほど体がコロコロ転がって前に進めない。

これが案外おもしろい。 というか今までこういう操作系のゲームというのはなかったよなあと思ったりした。

左右のスティックを使うゲームの始まりは「クレージークライマー」だと思う。 左右交互にスティックを動かすことで手足を操作してビルを登っていく。 もしかすると「Battle Zone」の方が早いかな。あれは戦車の左右のキャタピラを独立して操作してたよな。 この手のタイプのゲームは割と多い。

FPSでは、右スティックで視点移動、左スティックで位置移動というのが多い。 だから、FPSに慣れている人は割とこの左右アナログスティックを連携して使うというのに慣れている。 でも普通の人にはあまりなじみがない。 左右のスティックを絶妙にコントロールするというのはたぶん小脳とか延髄を働かせなくてはダメ。 ブルース・リー風に言えば「Don’t think. Feel!」というやつで、 そこが操作の気持ちよさと習熟による達成感につながるのだと思う。 などと考えてみた。

音ゲー風にアレンジするとおもしろいかもしれんな。 一定速度で走っているときには音楽も安定して流れる。 もたつくと音楽も乱れる、みたいな。

Platformer Junko その2

comments Platformer Junko その2 はコメントを受け付けていません。
By , 2009年7月22日 (水) 13:19:03

syoumen00

せっかくだからsource sdkで3D化してみる・・・? alyxいじればできそうな気がする。

Platformer Junko

comments Platformer Junko はコメントを受け付けていません。
By , 2009年7月21日 (火) 13:14:14

junko00

Platformer Yukoは諸般の事情で Platformer Junkoという名前になりました。 グラフィックもだいぶあがってきてます。

それはそうと昨日のオープンキャンパスのゲーム学科の特別講演に水口さんが来ていたので見にいきました。

それはそうと、 DellノートPCの設定で、 HDMIで音声出力はサウンドデバイスの設定で内蔵のデバイスを殺してHDMIだけにすればできました。 めでたい。 もうこれはこれからの必需品ですよ。

XNAでひらがなとカタカナ

comments XNAでひらがなとカタカナ はコメントを受け付けていません。
By , 2009年6月26日 (金) 02:23:55

XNA090629 に書いているように、spritefontファイルにちょっと追記するだけでひらがなカタカナは使えるようになる。 昔のドラクエみたいな字幕なら出せるというとこだな。 てわけでRPG starter kitを日本語化してみようと思うのだが。

いやしかしこの六月の終わり頃というのは毎年精神的に余裕がない。 ブログの更新も滞るくらい。

Texture is too big to work on all graphics cards

comments Texture is too big to work on all graphics cards はコメントを受け付けていません。
By , 2009年6月3日 (水) 11:36:03

SpriteBatch.Draw()でテクスチャのサイズが大きすぎるとランタイムエラーが起きたり警告が出たりする。

Warning Texture is too big to work on all graphics cards. This image is sized WWWWxHHHH, but many cards do not support sizes larger than 2048.

つまりXNAの問題というよりはグラフィックカードの制約で、テクスチャのサイズは2048以下にしなくてはならないということだ。 我が家のnvidia君は大丈夫だが、情報処理センター演習室PCの非力なグラフィックカードでは実行時にエラーが起きて動かない。 Platformer starter kit で画面より広い背景をスクロールするのに、 わざわざ背景のテクスチャを分割しているのはそのためらしい。

ゼミでは相変わらずPlatformerをいじっている。 Tile.csをいじってはしごはだいたい出来た。 Gem.csをいじって鍵も出来た。 次にドアやSpikeなどを作っている。 マップをレイヤー化したり起動画面やメニューやゲームオーバー画面も作らないといけない。 Platformerはあまりにもシンプルなプログラムなのでやらねばならないことが多い。

GiveDollar

comments GiveDollar はコメントを受け付けていません。
By , 2009年6月2日 (火) 13:20:41

Personをstructで作って、 次のようなメソッドを用意したのだが、

   struct Person
   {
    public int dollar;
       public string name;

       public Person(string name, int dollar)
       {
           this.name = name;
           this.dollar = dollar;
       }

        public void GiveDollar(int d, Person p)
        {
            p.dollar += d;
            dollar -= d;
        }
    ...
    }
    ...
     Person Alice = new Person("Alice", 100);
     Person Bob = new Person("Bob", 100);
     Alice.GiveDoller(30, Bob);

dollar -= d;は効くのだが、p.dollar += d;は効果がない。 上の例でいうと、Aliceの所持金は70ドルに減るが、 Bobは100ドルのままとなる。 つまり構造体のインスタンスを引数に渡すと、値渡しになるので、pはコピーが渡されているから、 GiveDollarを呼んだ側には影響しないのだった。 なので、Personをclassで定義すれば引数は参照渡しだから、こちらはOKなのである。 XNAはクラスよりも構造体を多用する傾向があるので、 (もとJavaユーザ的には)あまりなれてない構造体を使ってみたのだが、こんなところに陥し穴があるとは。 深いね。

構造体とクラス

comments 構造体とクラス はコメントを受け付けていません。
By , 2009年6月1日 (月) 13:43:28

学生たちにC#の構造体とクラスを理解してもらうにはどうしたら良いかとても悩んだわけです。 それで XNAプログラマのためのC♯入門XNAプログラマのためのC♯入門2 というものを書いてみた。 BMIはいつも使っているネタだ。 RPGは、もちろんXNA RPG starter kitがヒントになっている。 グラフィック抜きで、クラスの継承とかインスタンスどうしのメッセージのやりとりというものを説明するにはRPGはなかなか良いな、 と自画自賛してみる。 これでわかってもらえなきゃ、もうどうしようか。

Panorama Theme by Themocracy