2012年6月9日土曜日

チュートリアル 4:60 分でゲームを作成する


このチュートリアルでは、ゲーム作成のプロセスについて学びながら、ほぼ完全なゲームを記述できるようにします。

このチュートリアルのコードは、このチュートリアルの本文で説明する手法を実際に示したものです。このチュートリアルの完全なサンプル コードをダウンロードできます。ダウンロード内容には、完全なソース コードと、このサンプルに必要な追加のサポート ファイルが含まれます。

初心者のゲーム プログラマーにとっては、ゲーム コーディングの基本を理解することが最も難しいステップになります。完成したゲームを示すサンプル、ヒント、特定のテクニックの使用方法を示すチュートリアルなどを見つけることは簡単ですが、そこにはゲーム作成のプロセスについての情報はほとんど示されていません。このチュートリアルの目的は、ゲーム作成のプロセスについて学びながら、ほぼ完全なゲームを記述できるようにすることです。さらに、このチュートリアルでは完全なサンプル ファイル (GoingBeyond4_Tutorial_Sample.zip) に収録されているアセットだけを使用するため、追加のコンテンツをインストールする必要がありません。ここでサンプル ファイルをダウンロードし、その内容をローカル ドライブのディレクトリに抽出してください。

これから作成するゲームは、よく知られている Atari® の Asteroids® ゲームの簡易版です。ビデオ ゲームの歴史における Asteroids の地位はよく知られています。ウィキペディア (Wikipedia) でこのゲームの興味深い歴史を読むことをお勧めします。このチュートリアルでは、Asteroids ゲームの動作について一般的な知識があることを前提としています。

このチュートリアルの初期作業の多くは、既に実行済みです。つまり、このチュートリアルは、「チュートリアル 3:XNA Game Studio によるサウンドの作成」チュートリアルの最後の仕上げとして収録されています。「新たなステップ : 3D の XNA Game Studio」の最初の 3 つのチュートリアルを完了した時点で、移動可能な宇宙船がサウンド付きで 3D 空間にレンダリングされていることになります。さらに 60 ~ 90 分のコーディング時間で、ほぼ完全な Asteroids 形式のゲームができあがります。

「新たなステップ : 3D の XNA Game Studio」の最初の 3 つのチュートリアルで、3D でレンダリングされる単一の操作可能オブジェクトの基本について説明しました。しかし、実際のゲームでは、2 つ以上のオブジェクトが必要です。このチュートリアルで実際のゲームを作成するための最初のステップは、ゲームで複数のオブジェクトの追跡とレンダリングを行う準備をすることです。

画面上の宇宙船について考えてみましょう。宇宙船は Model クラスを使用して描画され、Vector3 で位置が追跡され、もう 1 つの Vector3 で速度が追跡されます。さらに、float で回転角度が追跡されます。これらの各データ タイプは、コード パスに沿ってさまざまな場所で変更または確認されます。ユーザーに表示される最終結果は良好に見えますが、同類のデータを必要とする別のオブジェクトを含めるようにゲームプレイを拡張しようとする場合には難点があります。

たとえば、画面上に描画する 2 番目の宇宙船を追加し、移動や回転ができるようにする場合は、最初の宇宙船で使用していた各変数のコピーを作成する必要があります。各変数の確認および変更を行うために記述したコードも複製する必要があります。コピーした各行は、新しい変数に対して動作するという点を除いては、コピー元の行とほとんど同じです。

描画して動き回らせるオブジェクトの数が最終的には 1 ダースを超えるようなゲームの場合、この作業は実行不可能です。複製したコードは、わかりにくく、修正しづらいものになります。しかし、良い方法があります。3D オブジェクトの描画と移動を行うための共通変数を保持するコード オブジェクトを作成し、それらのオブジェクトのリストを維持すれば、同じコードを使用してすべてのオブジェクトを一緒に描画および移動することができます。このプロセスをカプセル化と呼びます。これはオブジェクト指向プログラミングの初歩ですが、作成するゲームが大きくなるほど、この手法は重要になります。

まず、ソリューション エクスプローラーでプロジェクトを右クリックし、[追加][クラス] の順に選択します。[名前] ボックスに「Ship.cs」と入力し、[追加] をクリックします。

新しいファイルを追加すると、そのファイルがコード ウィンドウに表示されます。この新しいファイルはクラス、つまりコード オブジェクトを表します。この特別なクラスは Ship という名前になります。この時点ではほとんど何も記述されていませんが、これを、次に示されているように変更します。

  using System;  using System.Collections.Generic;  using System.Text;  using Microsoft.Xna.Framework;  using Microsoft.Xna.Framework.Content;  using Microsoft.Xna.Framework.Graphics;  using Microsoft.Xna.Framework.Input;    namespace GoingBeyond4  {      class Ship      {          public Model Model;          public Matrix[] Transforms;            //Position of the model in world space          public Vector3 Position = Vector3.Zero;            //Velocity of the model, applied each frame to the model's position          public Vector3 Velocity = Vector3.Zero;            public Matrix RotationMatrix = Matrix.Identity;          private float rotation;          public float Rotation          {              get { return rotation; }              set              {                  float newVal = value;                  while (newVal >= MathHelper.TwoPi)                  {                      newVal -= MathHelper.TwoPi;                  }                  while (newVal < 0)                  {                      newVal += MathHelper.TwoPi;                  }                    if (rotation != newVal)                  {                      rotation = newVal;                      RotationMatrix = Matrix.CreateRotationY(rotation);                  }                }          }            public void Update(GamePadState controllerState)          {              // Rotate the model using the left thumbstick, and scale it down.              Rotation -= controllerState.ThumbSticks.Left.X * 0.10f;                // Finally, add this vector to our velocity.              Velocity += RotationMatrix.Forward * 1.0f *                   controllerState.Triggers.Right;          }      }  }  

これで、Ship クラスは多くの操作を行うようになりました。このクラスでは、宇宙船の位置、速度、回転、および 3D モデルを保持し、専用の Update メソッドで宇宙船を動かします。

Ship クラスを作成したら、次に、この新しくカプセル化したデータを利用するように Game1.cs コード ファイルのコードを変更する必要があります。ソリューション エクスプローラーで [Game1.cs] をダブルクリックします。

宇宙船のモデルの描画から始めます。元の描画コードは Draw メソッド内にありましたが、それでは複数のオブジェクトへの拡張はうまくいきません。Model オブジェクトを画面に描画するので、選択された Model を描画するメソッドを作成します。Draw メソッドの下に、次のように、DrawModel という新しいメソッドを追加します。

  public static void DrawModel(Model model, Matrix modelTransform,       Matrix[] absoluteBoneTransforms)  {      //Draw the model, a model can have multiple meshes, so loop      foreach (ModelMesh mesh in model.Meshes)      {          //This is where the mesh orientation is set          foreach (BasicEffect effect in mesh.Effects)          {              effect.World =                   absoluteBoneTransforms[mesh.ParentBone.Index] *                   modelTransform;          }          //Draw the mesh, will use the effects set above.          mesh.Draw();      }  }  

この DrawModel メソッドでは、モデル描画アルゴリズムを取得し、渡された Model オブジェクトにそのアルゴリズムを適用して、Model を画面に描画します。次に、Draw 呼び出しを変更して、この新しいメソッドを呼び出すようにします。

  protected override void Draw(GameTime gameTime)  {      graphics.GraphicsDevice.Clear(Color.CornflowerBlue);        Matrix shipTransformMatrix = ship.RotationMatrix              * Matrix.CreateTranslation(ship.Position);      DrawModel(ship.Model, shipTransformMatrix, ship.Transforms);      base.Draw(gameTime);  }  

前のチュートリアルからのコードには、Draw 呼び出しの前に modelPosition 値および modelRotation 値の宣言が含まれていました。これらの宣言は、今後は不要になるので削除します。cameraPosition 変数も削除します。これは後で作成し直します。

次に、Update メソッドと UpdateInput メソッドを変更して、次のように新しい Ship クラスの値を使用するようにします。

  protected override void Update(GameTime gameTime)  {      // Allows the game to exit      if (GamePad.GetState(PlayerIndex.One).Buttons.Back ==           ButtonState.Pressed)          this.Exit();        // Get some input.      UpdateInput();        // Add velocity to the current position.      ship.Position += ship.Velocity;        // Bleed off velocity over time.      ship.Velocity *= 0.95f;        base.Update(gameTime);  }    protected void UpdateInput()  {      // Get the game pad state.      GamePadState currentState = GamePad.GetState(PlayerIndex.One);      if (currentState.IsConnected)      {          ship.Update(currentState);            //Play engine sound only when the engine is on.          if (currentState.Triggers.Right > 0)          {                if (soundEngineInstance.State == SoundState.Stopped)              {                  soundEngineInstance.Volume = 0.75f;                  soundEngineInstance.IsLooped = true;                  soundEngineInstance.Play();              }              else                  soundEngineInstance.Resume();          }          else if (currentState.Triggers.Right == 0)          {              if (soundEngineInstance.State == SoundState.Playing)                  soundEngineInstance.Pause();          }              // In case you get lost, press A to warp back to the center.          if (currentState.Buttons.A == ButtonState.Pressed)          {              ship.Position = Vector3.Zero;              ship.Velocity = Vector3.Zero;              ship.Rotation = 0.0f;              soundHyperspaceActivation.Play();          }      }  }  

UpdateInput メソッドの上の、Update の上にある modelVelocity 変数を削除します。これはもう必要ありません。

最後に、初期化およびコンテンツ読み込みの処理方法に変更を加える必要があります。Game クラスの最上部から Update の呼び出しのすぐ上までのコードを次のように変更します。

  GraphicsDeviceManager graphics;    //Camera/View information  Vector3 cameraPosition = new Vector3(0.0f, 0.0f, -5000.0f);  Matrix projectionMatrix;  Matrix viewMatrix;    //Audio Components  SoundEffect soundEngine;  SoundEffectInstance soundEngineInstance;  SoundEffect soundHyperspaceActivation;    //Visual components  Ship ship = new Ship();    public Game1()  {      graphics = new GraphicsDeviceManager(this);      Content.RootDirectory = "Content";  }    ///   /// Allows the game to perform any initialization it needs to before   /// starting to run. This is where it can query for any required   /// services and load any non-graphic related content.    /// Calling base.Initialize will enumerate through any components  /// and initialize them as well.  ///   protected override void Initialize()  {      projectionMatrix = Matrix.CreatePerspectiveFieldOfView(          MathHelper.ToRadians(45.0f),          GraphicsDevice.DisplayMode.AspectRatio,           1.0f, 10000.0f);      viewMatrix = Matrix.CreateLookAt(cameraPosition,           Vector3.Zero, Vector3.Up);        base.Initialize();  }    private Matrix[] SetupEffectDefaults(Model myModel)  {      Matrix[] absoluteTransforms = new Matrix[myModel.Bones.Count];      myModel.CopyAbsoluteBoneTransformsTo(absoluteTransforms);        foreach (ModelMesh mesh in myModel.Meshes)      {          foreach (BasicEffect effect in mesh.Effects)          {              effect.EnableDefaultLighting();              effect.Projection = projectionMatrix;              effect.View = viewMatrix;          }      }      return absoluteTransforms;  }    protected override void LoadContent()  {      ship.Model = Content.Load("Models/p1_wedge");      ship.Transforms = SetupEffectDefaults(ship.Model);      soundEngine = Content.Load("Audio/Waves/engine_2");      soundEngineInstance = soundEngine.CreateInstance();      soundHyperspaceActivation =           Content.Load("Audio/Waves/hyperspace_activate");  }    ///   /// UnloadContent will be called once per game and is the place to unload  /// all content.  ///   protected override void UnloadContent()  {  }  

たいへんな作業のように思えるかもしれませんが、変更後のコードは、カプセル化の良い例として、ゲームの開発時に役に立ちます。

宇宙船のオブジェクトが準備できたので、次に、上から見下ろす視点で宇宙船が画面上を飛び回るようにします。これは、カメラのアングルと距離を変更するだけで実現できます。最後に、ユーザー入力に対する回転の方法を、必要な動作に合うように調整します。

z 軸に沿ってカメラの位置を逆転させるには、値を負の 5000 から正の 25000 に変更するだけです。cameraPosition メンバーは、Game1 クラスの先頭近くに宣言されています。cameraPosition 宣言は次のようになります。

2012年6月4日月曜日

デイヴィッド バラシュ, ジュディス リプトン, David P. Barash, Judith Eve Lipton, 松田 和也: 本


アダルト商品

アダルト商品につき18歳未満の方は購入できません。
--このテキストは、 ハードカバー 版に関連付けられています。

内容説明

In "The Myth of Monogamy", David Barash describes how new research investigating sex in the animal world concludes there is simply no question whether sexual desire for multiple partners is natural. It is. Similarly, there is no question of monogamy being natural. It isn't. Using DNA fingerprinting technology biologists have been able to trace the parenthood of animals and have found that even among those species previously thought to be monogamous, cheating on your mate is the rule for both sexes. The book explores why animals cheat, some prostitute themselves for food or protection, while others strive for genetically superior mates. "The Myth of Monogamy" also explores what the implications of these dramatic findings mean for humans, in terms of relationships, parenting, aggression and more. --このテキストは、 ハードカバー 版に関連付けられています。

内容(「BOOK」データベースより)

あらゆる生物は、「不倫」を指向する。哺乳類界の異端児=ヒトは、DNAに刻み込まれたこの指令と、如何に折り合いを付けてきたのか。また付けるべきなのか。気鋭の生物学者と精神科医が、人類最大の普遍的ディレンマに真正面から挑む、衝撃の問題作。

内容(「MARC」データベースより)

あらゆる生物は「不倫」を指向する。哺乳類界の異端児ヒトは、DNAに刻み込まれたこの指令と如何に折り合いを付けてきたのか。付けるべきなのか。気鋭の生物学者と精神科医が、人類最大の普遍的ディレンマに真正面から挑む。

Amazon.com

Shattering deeply held beliefs about sexual relationships in humans and other animals, The Myth of Monogamy is a much needed treatment of a sensitive issue. Written by the husband and wife team of behavioral scientist David P. Barash and psychiatrist Judith Eve Lipton, it glows with wit and warmth even as it explores decades of research undermining traditional precepts of mating rituals. Evidence from genetic testing has been devastating to those seeking monogamy in the animal kingdom; even many birds, long prized as examples of fidelity, turn out to have a high incidence of extra-pair couplings.

2012年6月2日土曜日

鍼灸師科 - 免疫アップ.com


1. 内部環境とは細胞の中か外か。

2. 内部環境という概念を作ったのはだれか。

3. 組織を4 ついえ。

4. ホメオスタシスを日本語で言うとなにか。

5. ホメオスタシスという言葉(概念)を作ったのはだれか。

6. 人体の細胞数はどのくらいか。

7. 多細胞生物の細胞は何細胞と何細胞に分けられるか。

8. 生後に分裂・増殖できない細胞の代表は何か。

9. 神経線維は長いものはどの位の長さか。

10. 骨格筋細胞は長くて何センチか。

11. 人の細胞は基本的に何と何と何から構成されるか。

12. 細胞膜の厚さはどのくらいか。

13. 細胞内小器官を言え。

14. 真核細胞と原核細胞の違いを言え。

15. 中心小体の働きは何か。

16. ミトコンドリアの働きは何か。

17. ミトコンドリアの中のヒダを何というか。

18. 核小体は何を合成するか。また何が多く含まれるか。

19. 有糸分裂前期にはなにが起こるか。

20. 中期にはなにが起こるか。

21. 後期にはなにが起こるか。

22. 生殖細胞は何分裂を行うか。

23. 染色体の内訳を言え。

24. 粗面小胞体の働きは何か。

25. リボソームの働きは何か。

26. ゴルジ装置の働きは何か。

27. リソソームの働きは何か。

28. 細胞内にはなにが多いか。

29. 細胞膜の構成要素をいえ。

30. 細胞膜の性質を2 ついえ。

31. 細胞膜の半透性とはなにか。

2012年5月31日木曜日

2010年12月23日のブログ|The Outer Space


 文章を書く事について、本当に、すごく悩んだ数日間でした。

 私、物事を考えた時、結論に達するまでにとても時間がかかります。
 あれこれ考え、悩んで、落ち込んで、今日思った事が、明日は違うように思えてくる。
 だから、とことんまで考えて、最後の結果を出すんです。

 スキっきりしたと思っても、違う角度から見たら、そうじゃないような気がして来る。
 そんな風に、書くという事を考えたのは、本当に久しぶりのような気がします。

 フェイスブックの方にも、少し記してみたのですが、自分にとって書く事は体の一部で、奪われたらバランスを崩してしまうくらいに、なくてはならないもの。
 特に、物語を空想して書いていく事が何より好きで、それが生きる糧にもなっているんですよね。
 だから、ひたすら書き続けた。
 これだけは、手放さず、投げ出さず、諦めず、ずっと。

 本来、物語を書く時、私は細かくプロット作り、綿密に組み立てていくタイプです。
 人物から始まって、その世界、背景、物語には出て来る予定のない特産物や、家庭環境、歴史、そんなものまで考えて、完全な世界を作ろうとしてしまうタイプです。

 そして物語を書いたら、何度も、何度も、読み直します。
 言葉の使い方や、流れや、動作にも気を使いながら、不自然な所や矛盾した場所をひつこく探して、それから完成させます。

 そんな私が、唯一感情だけで、そのまま書いてしまうのは、日記。
 若い頃は、日記をつけていました。
 でも、日記なのにその日の出来事など殆どなく、その時の感情をありのまま書いている。
 分かりにくい、難解な表現で、神経質に書きなぐっている。
 そんな日記。

 だから、日記って、ついついそういう書き方になってしまいます。
 これって、癖なのかもしれません。
 内なるものの、垂れ流し(笑)
 冷静な時は、絶対にないんですが、冷静じゃない時はそういう書き方。
 これは、まずい。

 そして、ふと気づく。

2012年5月19日土曜日

昭和シェル石油株式会社 - シェルについて - シェル経営基本原則


原則 1

経済
事業目標を達成し、成長を続けるためには長期的な収益性が不可欠である。それは顧客が、シェルの製品やサービスの効率および価値を判断する目安となる。また、それは、消費者ニーズに応じた将来のエネルギー供給の開発・生産をする上で、継続的投投資に必要な経営資源の供給を可能にする。収益と強固な財務基盤なくしては、シェルの責任を果たすことは不可能である。

投資の可否および事業の選択を決定する際の基準は、経済、社会、そして環境に配慮した持続可能な発展と投資リスクに対する評価である。

原則 2

競争
シェルは自由な企業活動を支持する。シェルは、独禁法および関連法令に則り公正で倫理にかなった競争を求め、他の企業がシェルと自由に競争することを妨げるものではない。

原則 3

2012年5月18日金曜日

惑星を見てみよう


惑星を見てみよう

※当ページの転載・複製は,一切お断り致します。
(c) 1999-2006 Mira House. All rights reserved.


惑星の種類

 地球みたいに自分で光らない星を,惑星と呼びます。惑星は,太陽の周りをまわり,太陽の光を反射して光る天体です。2006年8月に決められた定義では,次のような条件を満たす星が惑星であるとされました。

  1. 太陽の周りをまわっている
  2. 自分の重力でほぼ球形になっている
  3. 軌道の近くには衛星以外の星がない

 2006年8月24日以前は,太陽系には地球を含めて9個の惑星が知られ,太陽に近い順に,水星・金星・地球・火星・木星・土星・天王星・海王星・冥王星であるとされていましたが,この定義の出現により,(c)の条件を満たさない冥王星は,惑星から外れ,"小さい惑星"という意味の矮惑星(わいわくせい)という名で定義されることになりました。

 それでは,冥王星と8つの惑星について特徴を比べてみましょう。

 矮惑星の冥王星を含めた9個の惑星の覚え方は,太陽に近い順から"水 金 地 火 木 土 天 海 冥"(すい きん ち か もく ど てん かい めい)。これなら調子よく覚えられますので,暗記しておきましょう。

 太陽系の惑星は大きく二つの種類に分けられていて,太陽に近い4つの惑星(水星・金星・地球・火星)を地球型惑星,その外側にある4つの惑星(木星・土星・天王星・海王星)を木星型惑星と呼んでいます。冥王星は,もちろん,このどちらにも属していません。冥王星の外側には,冥王星に似た天体が多数存在していますが,この中で,冥王星よりも大きな 2003UB313 という天体は,冥王星と同じ矮惑星の仲間です。

 さて,地球型惑星と木星型惑星には,どんな違いがあるのでしょう? 簡単な特徴を,表にしてみました。

2012年5月16日水曜日

私の青空:ウディ・ガスリー


今日は、雨が降ったりやんだり、日が差したり…
勝手に忙しい空模様だった。

サッカーにかまけていたら、今年も、もう6月20日。
2010年は半分近く、経過した。
明日は、夏至でげし。
これからは、夕方の畑の…ぢい散歩の時間ががだんだん少なくなる…。

今夕、日が沈んだ
たそがれ時に
一瞬だけ…
お月さんが覗いた。
今宵は、お月さんまで半分。

ツキがない 「侍ジャパン」
それでも半分は
まだ、希望が残っているのだ。

今日は、父の日ということでなのだろう…。
娘二人から相次いで、メールや貢物、手紙が届いた。
息子の方は…いつものとおりじゃ。

ゆうパックで届いた貢物はこちら。
破…はあ?
昨日のワールドカップの、オランダとの結果1-0を予期していたか。
貢物は、エヴァンゲリヲンの
「破」の缶コーヒー。
届いたのは右側のマリちゃんのみ。

乳飲料…チチの
しゃれのつもりか?

ご存知の通り…(笑  おらの住んでる村には、コンビニが無い。
これは、5月ごろのローソン限定品らしいが…コンビニを選べる環境では無い。

最近のコンビニ商品を
こうして手にしているだけで
なんか偉くなった気がする。

おら、すっかり都会人じゃー。