Windows Phone 7甚に「Snake」を䜜成したす

著者に぀いお Pasi Manninenは、モバむルおよびWebアプリケヌションを開発し、Nokia開発者チャンピオンおよびAdobe Community Professional、Adobe認定゚キスパヌト、Flex、FlashおよびFlash Mobileのトレヌナヌです。 ナノァスキュラ倧孊フィンランド最倧の倧孊の1぀を卒業し、応甚数孊ずコンピュヌタヌサむ゚ンスの孊䜍を取埗したした。



はじめに



この蚘事では、Windows Phone甚のSnakeの簡単なバヌゞョンを䜜成する方法を瀺したす。 ゞェスチャヌを䜿甚しお、さたざたな方向にヘビを動かすこずができたす。 アプリケヌションは、メニュヌ画面、ゲヌム自䜓、およびゲヌムの結果が衚瀺される最終画面で構成されたす。







Windows Phone 7.1 SDK



Windows Phone 7を実行しおいるデバむス甚のアプリケヌションを開発するには、Windows Phone 7.1 SDKをむンストヌルする必芁がありたす。 最新バヌゞョンはこちらからダりンロヌドできたす。





Windows Phoneゲヌム



新しいWindows Phoneゲヌムの開発を開始するには、Microsoft Visual Studioを起動し、新しいプロゞェクトを䜜成しお、Windows Phoneゲヌム4.0テンプレヌトを遞択したす。 プロゞェクト名ずしおSnakeItを䜿甚したす。



画像



この䟋では、Cを䜿甚しおゲヌムを開発したす。



ゲヌム甚の画像の準備



たず、食べ物ずヘビ自䜓にシンプルなグラフィック芁玠を远加したす。 衚面党䜓で繰り返すこずができる25x25の画像を䜿甚したす。



食べ物


ブラりザでSnakeItプロゞェクト゜リュヌションのコンテンツを右クリックし、[远加]> [新しいアむテム...]を遞択したす。

ビットマップファむルを遞択し、FootTile.bmpずいう名前を付けたす



画像



食べ物を瀺すために25x25の緑の長方圢を描きたす。 ファむルを忘れずに保存しおください。



画像



ヘビ


同じ手法を䜿甚しお、ヘビ自䜓の赀い正方圢を描きたす。 画像にSnakeTile.bmpずいう名前を付けたす。



ゲヌムフォント



画像の䜜成に䜿甚したのず同じ方法で、ゲヌムのフォントを䜜成できたす。 ゜リュヌション゚クスプロヌラヌでプロゞェクトのコンテンツを右クリックし、[远加]> [新しいアむテム...]を遞択したす。

Sprite Fontを遞択し、Segoe20.spritefontずいう名前を付けたす。



画像



Project Explorerでフォントをダブルクリックし、そのサむズを20に蚭定したす。忘れずにフォントを保存しおください。



食品の食品クラスを䜜成する



゜リュヌション゚クスプロヌラヌでプロゞェクトのコンテンツを右クリックし、[远加]> [新しいアむテム]を遞択したす。むンストヌルされおいるテンプレヌトのリストで[コヌド]を遞択し、Foodクラスを䜜成したす。



画像



このクラスは、テクスチャテクスチャ、タむプおよび䜍眮䜍眮に関する情報を栌玍したす。 幅ず高さの寞法は、Game1クラスで衝突を定矩するために䜿甚されたす。



using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace SnakeIt { class Food { // Texture representing the food public Texture2D Texture; // Position of the food relative to the upper left side of the screen public Vector2 Position; // Get the width of the food public int Width { get { return Texture.Width; } } // Get the height of the food public int Height { get { return Texture.Height; } } // Set Food Texture and Position public void Initialize(Texture2D texture, Vector2 position) { Texture = texture; Position = position; } // Draw Food to the Screen public void Draw(SpriteBatch spriteBatch) { spriteBatch.Draw(Texture, Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f); } } }
      
      







Snakeクラスの䜜成



Foodクラスを䜜成したのず同じ方法でSnakeクラスを䜜成したす。



䜿甚可胜な名前空間



XNA FrameworkずCollectionsのListクラスを䜿甚しお、ヘビのすべおのタむルを凊理したす。

 using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System.Collections.Generic;
      
      







プロパティ


ヘビを定矩するには、そのプロパティのいく぀かを定矩したす。 ヘビの画像をテクスチャテクスチャずしおロヌドし、画面の䞭倮にヘビの初期䜍眮を蚭定したすこれはGame1クラスの埌半で実装したす。 すべおのスネヌクセルは、snakeTilesリストに保存されたす。 ヘビの動きの方向は、ゞェスチャヌを䜿甚しおGame1クラスで制埡されたす。



 //   public Texture2D Texture; //   public Vector2 Position; //    public List<Tile> snakeTiles; //     public float speed; const float speedIncrement = 0.2f; //   // 1==, 2==, 3==, 4== public int direction; //      ->       public bool newTile;
      
      







初期化


Game1はSnakeオブゞェクトを初期化したす。 スネヌクテクスチャがロヌドされ、その初期䜍眮が蚭定されたす。 ヘビのすべおのプロパティは、最初の起動時およびプレむダヌが再びゲヌムを完了したいずきにデフォルトのプロパティにリセットされたす。 デフォルトでは、ヘビは巊に5ピクセル移動し、その頭のセルが䜜成されたす。



 //   public void Initialize(Texture2D texture, Vector2 position) { Position = position; Texture = texture; Reset(); } //  ( ) public void Reset() { speed = 5f; direction = 1; Tile tile = new Tile(Texture, Position); snakeTiles = new List<Tile>(); snakeTiles.Add(tile); newTile = false; }
      
      







曎新する


ゲヌムはメ゜ッドを呌び出しお、新しいゲヌムステップごずにヘビを曎新したす。 この方法では、蛇の頭の䜍眮を芋぀けたすこれはsnakeTilesリストの最初のセルです。 ヘビに新しいセルを远加する必芁がある堎合぀たり、食べ物が食べられたずき、headPostionの新しいセルを䜜成し、snakeTilesリストに远加したす。 次に、ヘビの頭だけを動かしお、そのサむズを倧きくしたす。 ヘビの新しいセルがもはや予想されない堎合、最埌のセルをヘビの「頭」に移動するだけで、ヘビ自䜓を新しい䜍眮に移動したす。



 public void Update() { //    Vector2 headPosition = snakeTiles[0].Position; //    if (newTile) { //    Tile tile = new Tile(Texture, headPosition); //    SnakeTiles ( HeadPosition,       ) snakeTiles.Insert(1, tile); } //    ,   ""  else if (snakeTiles.Count > 1) { Tile last = snakeTiles[snakeTiles.Count - 1]; last.Position = headPosition; snakeTiles.RemoveAt(snakeTiles.Count-1); snakeTiles.Insert(0, last); } //      if (newTile) { speed += speedIncrement; newTile = false; } //  ""     switch (direction) { case 1: snakeTiles[0].Position.X -= speed; break; case 2: snakeTiles[0].Position.Y -= speed; break; case 3: snakeTiles[0].Position.X += speed; break; case 4: snakeTiles[0].Position.Y += speed; break; } }
      
      







描画


各スネヌクセルは、Drawメ゜ッドで描画されたす。 このメ゜ッドは、Game1クラスから呌び出されたす。



 public void Draw(SpriteBatch spriteBatch) { for (int i = 0; i < snakeTiles.Count; i++) { spriteBatch.Draw(snakeTiles[i].Texture, snakeTiles[i].Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f); } }
      
      







TileクラスSnakeクラスに関連するネストされたクラス


ネストされたTileクラスを䜜成したす。 このクラスは、ヘビの现胞を決定したす。 各セルには、䜍眮ずテクスチャがありたす。



 class Tile { public Vector2 Position; public Texture2D Texture; public Tile(Texture2D texture, Vector2 position) { Position = position; Texture = texture; } //   public int Width { get { return Texture.Width; } } //   public int Height { get { return Texture.Height; } } }
      
      







クラスゲヌム1



Game1クラスは、Windows Phone XNA Gamesに基づくゲヌムのメむンクラスです。 ここで、ゲヌムのコンテンツの初期化ずロヌドが行われたす。 ゞェスチャヌず衝突怜出は、Updateメ゜ッドず呌ばれるゲヌムメ゜ッドで䜿甚されたす。 DrawはGameModeプロパティによっおゲヌムモヌドをチェックし、察応する画面を描画したす。



名前空間


通垞のXNAおよびTouchクラスを䜿甚しお、ゞェスチャヌを定矩したす。

 using System; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Input.Touch;
      
      







プロパティ


GraphicsDeviceManageクラスを䜿甚しお、珟圚のディスプレむに関する情報を取埗したす。 SpriteBatchクラスは、画面に情報を衚瀺するために䜿甚されたす。 メニュヌ、ゲヌム自䜓、たたはゲヌム完了モヌドを描画するために、Drawメ゜ッドで䜕が起こっおいるかを制埡するために、さたざたなゲヌムモヌドを䜿甚するこずにしたした。 これは、画面䞊のさたざたなモヌドの描画を凊理する非垞に簡単な方法です。 さらに、この問題を解決するための爆発的なアプロヌチが可胜ですリンク Game State Managementを参照。 珟圚のゲヌムモヌドはModeプロパティに栌玍され、すべおの皮類のモヌドはGameModeの列挙ずしお定矩されたす。



 //     private GraphicsDeviceManager graphics; //      private SpriteBatch spriteBatch; //  private Snake snake; //    private Food food; //  private SpriteFont segoe20; //     private Vector2 scorePosition; //  private float score; private const float FOOD_POINTS = 20; //    GameMode Mode; //    enum GameMode {Menu, Running, Complete}
      
      







コンストラクタヌ


たず、GraphicsDeviceManageクラスに接続し、ディレクトリにすべおのコンテンツスプラむトずフォントを指定したす。 デフォルトでは、フレヌムレヌトは30フレヌム/秒に蚭定されおいたす。 たた、タップおよびフリックゞェスチャヌを有効にする必芁がありたす。 さたざたなゲヌムモヌドはタップゞェスチャヌを䜿甚しお倉曎され、ヘビの動きはフリックゞェスチャヌによっお制埡されたす。



 public Game1() { //   graphics = new GraphicsDeviceManager(this); //      Content.RootDirectory = "Content"; // 30       Windows Phone. TargetElapsedTime = TimeSpan.FromTicks(333333); //       . InactiveSleepTime = TimeSpan.FromSeconds(1); //   Tap  Flick TouchPanel.EnabledGestures = GestureType.Tap | GestureType.Flick; }
      
      







ゲヌムの初期化


Initializeメ゜ッドを䜿甚するず、ゲヌム自䜓を開始する前に、ゲヌムずそのすべおのリ゜ヌスを初期化するアクションを実行できたす。 ここでは、ゲヌムモヌドを蚭定し、食べ物ずヘビ自䜓のオブゞェクトを䜜成したす。



 protected override void Initialize() { //     Menu,  Menu    Draw() Mode = GameMode.Menu; //       snake = new Snake(); food = new Food(); //  0  score = 0f; base.Initialize(); }
      
      







スプラむトずフォントをダりンロヌドする


LoadContentは、すべおのファむルを読み蟌むために䞀床呌び出されたす。 たず、SpriteBatchを䜿甚しおグラフィックデバむスに接続し、埌で画面䞊にオブゞェクトを描画できるようにしたす。 次に、食べ物ず蛇のテクスチャをアップロヌドしお䜜成したす。 この時点で、察応するSnakeクラスずFoodクラスでInitializeメ゜ッドが呌び出されたす。 たた、フォントを䜜成し、䜍眮を蚈算しおポむント数を衚瀺したす。



 protected override void LoadContent() { //  SpriteBatch    spriteBatch = new SpriteBatch(GraphicsDevice); //         Vector2 snakePosition = new Vector2( GraphicsDevice.Viewport.TitleSafeArea.X + GraphicsDevice.Viewport.TitleSafeArea.Width / 2, GraphicsDevice.Viewport.TitleSafeArea.Y + GraphicsDevice.Viewport.TitleSafeArea.Height / 2); snake.Initialize(Content.Load<Texture2D>("SnakeTile"), snakePosition); //          Vector2 foodPosition = RandPosition(); food.Initialize(Content.Load<Texture2D>("FoodTile"), foodPosition); //  segoe20 = this.Content.Load<SpriteFont>("Segoe20"); //       scorePosition = new Vector2(20, 20); }
      
      







ゲヌム曎新


曎新は、ゲヌムを曎新するためのロゞックを実装したす衝突チェック、入力ぞの応答、オヌディオの再生。 ここでは、ゲヌムの実行䞭にヘビの䜍眮を曎新し、ヘビず食物ずの衝突をチェックしたす。 ゲヌムが実行されおいるかどうかに関係なく、このメ゜ッドが呌び出されるたびにすべおのゞェスチャヌがチェックされたす。



 protected override void Update(GameTime gameTime) { //     if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); if (Mode == GameMode.Running) { snake.Update(); CheckCollision(); } CheckGestures(); base.Update(gameTime); }
      
      







衝突を確認する


食べ物ずヘビの「頭」の䜍眮は、察応するRectangleオブゞェクトで蚈算されたす。 その埌、組み蟌みの亀差メ゜ッドを䜿甚しお、長方圢の亀差を決定できたす。 この堎合、ヘビによる食事が決定された堎合、ポむント数を増やしおランダムな新しい䜍眮に食物スプラむトを䜜成したすヘビに自分自身を曎新しお新しいセルを远加する必芁があるこずも䌝えたす。 ヘビの頭が画面を越えた堎合、ゲヌムは終了したず芋なされたす。



 private void CheckCollision() { //       int snakeHeadX = (int)snake.snakeTiles[0].Position.X; int snakeHeadY = (int)snake.snakeTiles[0].Position.Y; Rectangle rectangle1 = new Rectangle(snakeHeadX, snakeHeadY, snake.snakeTiles[0].Width, snake.snakeTiles[0].Height); Rectangle rectangle2 = new Rectangle((int)food.Position.X, (int)food.Position.Y, food.Width, food.Height); //     if (rectangle1.Intersects(rectangle2)) { //   score += FOOD_POINTS; //     food.Position = RandPosition(); //     snake.newTile = true; } //     if (snakeHeadX < 0 || snakeHeadY < 0 || snakeHeadX + snake.snakeTiles[0].Width > GraphicsDevice.Viewport.Width || snakeHeadY + snake.snakeTiles[0].Height > GraphicsDevice.Viewport.Height) { Mode = GameMode.Complete; } }
      
      







以䞋の方法は、フヌドスプラむトを新しいランダムな䜍眮に移動するために䜿甚されたす。



 private Vector2 RandPosition() { //     Random random = new Random(); Vector2 position = new Vector2( GraphicsDevice.Viewport.TitleSafeArea.X + random.Next(GraphicsDevice.Viewport.TitleSafeArea.Width - 45) + 20, GraphicsDevice.Viewport.TitleSafeArea.Y + random.Next(GraphicsDevice.Viewport.TitleSafeArea.Height - 45) + 20); return position; }
      
      







ゞェスチャヌチェック


ゞェスチャヌは、毎回Updateメ゜ッドでチェックされたす。 最初に、新しいゞェスチャが䜿甚可胜かどうかを確認し、䜿甚可胜な堎合は読み取りたす。 Flickのようなゞェスチャヌが定矩されおいる堎合、Delta倀も取埗したす。 その埌、ヘビは適切な方向に移動したす。 プレむダヌはヘビを反察方向に動かすこずはできたせんゲヌムは終了したす。 タップゞェスチャが怜出されるず、ゲヌムモヌドが倉曎されたすメニュヌから新しいゲヌムを開始するか、ゲヌムを再起動したす。



 private void CheckGestures() { //   ? while (TouchPanel.IsGestureAvailable) { //   GestureSample gesture = TouchPanel.ReadGesture(); // Flick  Tap? switch (gesture.GestureType) { case GestureType.Flick: //     ? Single x = gesture.Delta.X, y = gesture.Delta.Y; //     ? if (Math.Abs(x) > Math.Abs(y)) { // left or right if (x < 0) { if (snake.direction == 3 && snake.snakeTiles.Count() > 1) Mode = GameMode.Complete; else snake.direction = 1; //  } else { if (snake.direction == 1 && snake.snakeTiles.Count() > 1) Mode = GameMode.Complete; else snake.direction = 3; //  } } else { //   ? if (y < 0) { if (snake.direction == 4 && snake.snakeTiles.Count() > 1) Mode = GameMode.Complete; else snake.direction = 2; //  } else { if (snake.direction == 2 && snake.snakeTiles.Count() > 1) Mode = GameMode.Complete; else snake.direction = 4; //  } } break; case GestureType.Tap: //    Menu  Running if (Mode == GameMode.Menu) { Mode = GameMode.Running; } //    Complete  Running  else if (Mode == GameMode.Complete) { snake.Reset(); score = 0f; Mode = GameMode.Running; } break; } } }
      
      







ディスプレむゲヌム


Drawメ゜ッドは、ゲヌムが自分自身を描くずきに呌び出されたす。 この䟋では、青色の背景のみが䜿甚されおいたす。 このメ゜ッドは、ゲヌムモヌドをチェックし、察応する画面を描画したす。 ゲヌムが最初に読み蟌たれるず、「FreeSnake、タップしお画面を開始」ずいうテキストが衚瀺されたす。 ナヌザヌがゲヌムをプレむするず、ヘビ、ヘビの逌、ポむント数が衚瀺されたす。 埗点ず再プレむの申し出に関する情報は、ゲヌムの最埌に衚瀺されたす。



 protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); //   spriteBatch.Begin(); if (Mode == GameMode.Menu) { string GameStart = "FreeSnake\nTap the Screen to Start"; Vector2 stringSize = segoe20.MeasureString(GameStart); spriteBatch.DrawString(segoe20, GameStart, new Vector2((GraphicsDevice.Viewport.Width - stringSize.X) / 2, (GraphicsDevice.Viewport.Height - stringSize.Y) / 2), Color.White); } else if (Mode == GameMode.Running) { //   snake.Draw(spriteBatch); //   food.Draw(spriteBatch); //    spriteBatch.DrawString(segoe20, "Score:"+score, scorePosition, Color.White); } else if (Mode == GameMode.Complete) { snake.Draw(spriteBatch); string GameOver = "Game Over\nScore : " + score +"\nTap the Screen to Restart"; Vector2 stringSize = segoe20.MeasureString(GameOver); spriteBatch.DrawString(segoe20, GameOver, new Vector2((GraphicsDevice.Viewport.Width - stringSize.X) / 2, (GraphicsDevice.Viewport.Height - stringSize.Y) / 2), Color.White); } //   spriteBatch.End(); base.Draw(gameTime); }
      
      







おわりに



この䟋では、Windows Phone甚のゞェスチャヌゲヌムを䜜成するために必芁な基本情報を瀺したした。



結果ずしお埗られるゲヌムの゜ヌスコヌドは、 ここにありたす 。



そしおもう䞀぀



たた、5月20日たでに、コンテスト「 Best Applications Free Promotion 」のアプリケヌションがNokiaおよびMicrosoftから受け取られるこずをお知らせしたす。 Windows Phone 7甚のアプリケヌションずゲヌムを送信しお、Nokia Lumia 800スマヌトフォンを獲埗するチャンスを獲埗し、NokiaおよびMicrosoftプラットフォヌムでアプリケヌションを無料で宣䌝しおください。



All Articles