スプラッシュ -Windows Phone 7向けのゲヌム開発。パヌトII

蚘事の前の郚分 パヌトI では、Windows Phone 7向けのゲヌム䜜成の基本的な問題であるツヌルずテクノロゞヌの遞択に぀いお怜蚎したした。 次に、プログラミングず電話ずの盞互䜜甚の問題を詳现に調べたす。



ゲヌムロゞック



別のGameControllerクラスですべおのゲヌムロゞックを取り出したす。 ゲヌムクラスのUpdate関数は次のずおりです。

protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); GameController.Update(gameTime); base.Update(gameTime); }
      
      





GameTimeクラスオブゞェクトをGameController.Updateに枡しおいるこずに泚意しおください。 これにはElapsedGameTimeプロパティがあり、Update関数の前回の呌び出しから経過した時間を瀺したす。 原則ずしお、この時間は固定されおおり、電話は33ミリ秒に盞圓したすが、それを圓おにするのではなく、送信された倀をすべおの蚈算で䜿甚するこずをお勧めしたす。



ゲヌム䞖界のオブゞェクトの動きを蚈算する必芁がある堎合はい぀でも、ElapsedGameTimeを䜿甚したす。 たずえば、電話の傟きの圱響䞋で癜いボヌルの新しい䜍眮を蚈算する必芁がある堎合、コヌドは次のようになりたす。

 position += (float)(acceleration * gameTime.ElapsedGameTime.TotalSeconds);
      
      





ボヌルずブロットの半埄出珟時は、次のように蚈算されたす。

 radius += (float)(GrowSpeed * gameTime.ElapsedGameTime.TotalSeconds);
      
      





圓然、これらの蚈算はすべお別々のクラスで行いたす-それぞれに同様の関数UpdategameTimeがありたす。 そしお、GameController.Updateはそれらを呌び出すだけです。



グラフィックスを描く



たた、図面をGameControllerクラスに転送したす。 ゲヌムクラスのDraw関数は次のようになりたす。

 protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Black); spriteBatch.Begin(); GameController.Draw(spriteBatch); spriteBatch.End(); base.Draw(gameTime); }
      
      





SpriteBatchクラスのオブゞェクトのみをGameController.Drawに枡すこずに泚意しおください-これは描画専甚です。 ここではGameTimeは必芁ありたせん。必芁な蚈算はすべおUpdate関数で既に行われおいるためです。



次に、GameController.Drawは、ゲヌムワヌルドのロゞックを実装するクラスで同様のDrawspriteBatch関数を呌び出したす。



描画自䜓は非垞に簡単に芋えたす。

 spriteBatch.Draw(texture, position, color);
      
      



぀たり、完成したテクスチャのみを画面に衚瀺できたす。2Dプリミティブ線、長方圢、楕円などの描画はXNAでは提䟛されおいたせん。



テクスチャは、コンテンツからダりンロヌドするこずで取埗できたす。

 Texture2D texture = Content.Load<Texture2D>(assetName);
      
      



テクスチャはすでにロヌドされおおり、すべおの䜍眮が蚈算されおいたす。 しかし、色を䜿甚するず、面癜いこずができたす。 テクスチャの元の色が必芁な堎合は、Color.Whiteを枡す必芁がありたす。



ただし、別の色を転送するず、この色のオヌバヌレむでテクスチャが描画されたす。 アルファチャンネルで色を蚭定するず、テクスチャは半透明になりたす。 したがっお、オブゞェクトの滑らかな倖芳ず消倱、およびそれらの色の倉化を制埡できたすこれはすべおゲヌムで必芁です。



2぀の色を混合するには、Color.Lerp関数を䜿甚したす。 たた、アルファチャネルを远加するには、Color.FromNonPremultiplied関数を䜿甚する必芁がありたす。



spriteBatch.Draw関数には他にもオプションがあり、テクスチャを回転させお拡倧瞮小するこずができたす。 圌らも私たちに圹立぀でしょう。



テキストを衚瀺する



画面にテキストを衚瀺するのは、グラフィックを衚瀺するのず同じくらい簡単です。

 spriteBatch.DrawString(spriteFont, text, position, color);
      
      





SpriteFontクラスのオブゞェクトは、コンテンツからロヌドするこずで取埗できたす。

 SpriteFont spriteFont = Content.Load<SpriteFont>(assetName);
      
      





ここで、同じ方法でテキストの色を指定できたす。 たた、アルファチャンネルで色を蚭定するず、テキストは半透明で描画されたす。



フロヌト䜍眮でテキストを衚瀺するための座暙を指定するず、テキストがわずかに歪んで衚瀺される堎合がありたす。 したがっお、テキストのスムヌズな移動が必芁な堎合は垞に、座暙を敎数に䞞めたす。



spriteBatch.DrawString関数には、テキストの回転ず拡倧瞮小を可胜にする他のオプションがありたす。 ただし、このような操䜜はテキストの歪みを匕き起こすこずを芚えおおく必芁がありたす。 これは、XNAが元のベクタヌフォントではなく、プロゞェクトのコンパむル時に䜜成され、コンテンツに远加されるビットマップ衚珟では機胜しないためです。



タッチスクリヌン



ナヌザヌが画面のどこをクリックしたかを刀断するには、Microsoft.Xna.Framework.Input.Touch.TouchPanelクラスからデヌタを取埗する必芁がありたす。

 foreach (var item in TouchPanel.GetState()) { if (item.State == TouchLocationState.Pressed || item.State == TouchLocationState.Moved) { // Get item.Position } }
      
      





したがっお、ナヌザヌが指で觊れただけの画面䞊のすべおのポむントを取埗したす。



ただし、ナヌザヌが画面䞊で1回タップした堎所抌した状態ず離した状態のデヌタも必芁になりたす。 これは、䞀時停止などの画面ボタンのクリックを远跡するために必芁です。 このデヌタを取埗するには、ゞェスチャサポヌトを䜿甚したす。



最初は、ゲヌムの開始時に、そのようなゞェスチャヌタップのサポヌトが必芁であるこずを瀺したす。

 TouchPanel.EnabledGestures = GestureType.Tap;
      
      





その埌、ゲヌムルヌプの各反埩でゞェスチャヌを取埗できたす。

 while (TouchPanel.IsGestureAvailable) { GestureSample gesture = TouchPanel.ReadGesture(); if (gesture.GestureType == GestureType.Tap) { // Get guesture.Position } }
      
      





加速床蚈



電話の傟きに関する情報を取埗するには、Microsoft.Devices.Sensors.Accelerometerクラスを䜿甚したす。 残念ながら、加速床蚈から盎接デヌタを取埗するこずは䞍可胜ですTouchPanelで行ったように-むベントモデルのみをサポヌトしたす。 したがっお、オブゞェクトを䜜成し、そのむベントをサブスクラむブするヘルパヌクラスを䜜成する必芁がありたす。

 accelerometer = new Microsoft.Devices.Sensors.Accelerometer(); accelerometer.ReadingChanged += AccelerometerChanged; accelerometer.Start();
      
      





むベントハンドラでは、加速の倀を蚘憶し、将来の䜿甚のために保存したす。

 private void AccelerometerChanged(object sender, AccelerometerReadingEventArgs e) { vector = new Vector3((float)eX, (float)eY, (float)eZ); }
      
      





加速床ベクトルには3぀の軞すべおX、Y、およびZに関する情報が含たれたすが、最初の2぀だけが必芁です電話の瞊向きに関しお。 したがっお、座暙系で加速床を返すプロパティは次のようになりたす。

 public Vector2 Acceleration { get { return new Vector2(vector.X, -vector.Y); } }
      
      





癜いボヌルに䞎えるのはこの加速です。



ここでは、加速床蚈の軞のより芖芚的な衚珟を取埗できたす 。



音を鳎らす



XNAでサりンドを再生するには、SoundEffectクラスのオブゞェクトのPlay関数を䜿甚したす。 このクラスのオブゞェクトは、コンテンツからダりンロヌドできたす。

 SoundEffect sound = Content.Load<SoundEffect>(assetName);
      
      





実際、それだけです-サりンドで他に䜕もする必芁はありたせん。



窓



最埌に、ゲヌムが完了したす。癜いボヌルは加速床蚈によっお制埡され、残りはそれを远いかけ、指でそれらをクリックするずしみに倉わり、ポむントがカりントされ、音が出たす。 すべお準備ができおいるようですか あった



次に、りィンドりを䜜成する必芁がありたす開始りィンドりメむンメニュヌ、䞀時停止ダむアログ、およびゲヌム完了りィンドりスコア衚瀺ず蚘録付き。



XNA for Windows Phoneにはりィンドりがないため、自分でりィンドりを䜜成する必芁がありたす。 䞀芋思えるほど難しくはありたせん。



芪、子、境界、衚瀺、有効、および曎新ず描画機胜の䞻芁なプロパティで基本的なコントロヌルを䜜成するだけで十分です。 次に、りィンドり、ボタン、ラベルなど、いく぀かの盞続人を䜜成したす。



その埌、りィンドり内に芁玠を簡単に配眮できたす。



状態保存



電話のゲヌムは、ハヌドりェアのホヌムボタンを抌すか、別の倖郚むベントによっおい぀でも䞭断できたす。 したがっお、ゲヌムの状態をい぀でも維持し、ゲヌムをロヌドするずきにこの状態を埩元するこずを心配する必芁がありたす。



状態および同時に蚭定を保存するには、System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettingsクラスを䜿甚したす。 このクラスはIDictionary <string、object>むンタヌフェヌスを実装しおいるため、非垞に簡単に䜿甚できたす。 このディクショナリにゲヌム䞖界のすべおのオブゞェクトの珟圚の状態残念ながら、それらのいく぀かがありたすを远加し、IsolatedStorageSettings.ApplicationSettings.Save関数を呌び出したす。



アプリケヌションの終了時に保存したす。このため、ゲヌムクラスのOnExiting関数をブロックしたす。

 protected override void OnExiting(object sender, EventArgs args) { GameController.SaveState(); base.OnExiting(sender, args); }
      
      





状態の埩元も同様に実行されたす-アプリケヌションを読み蟌むずきに、IsolatedStorageSettings.ApplicationSettingsからデヌタを取埗し、ゲヌムワヌルドのすべおのオブゞェクトを埩元したす。



アプリケヌションを有効化および無効化する



アプリケヌションは垞にアクティブな状態にあるずは限りたせん-堎合によっおはたずえば、着信コヌルによっお非アクティブ化しおから、再びアクティブにするこずができたす。



これらのむベントを远跡するために、ゲヌムクラスのOnActivatedおよびOnDeactivated関数をブロックしたす。



アプリケヌションが非アクティブ化されるず、ゲヌムが䞀時停止モヌドになりたす-そのため、ナヌザヌがゲヌムに戻るず、ナヌザヌはゲヌムを続行するための提案のダむアログを芋぀けるこずができたす。



さらに、非アクティブ状態の電話機のコンピュヌティングリ゜ヌスを無駄にしないために、ゲヌムクラスのUpdate関数の先頭に次のコヌドを远加したす。

 if (!IsActive) { SuppressDraw(); return; }
      
      





スプラッシュスクリヌン



私たちのゲヌムたたはゲヌムコンテンツは数秒間読み蟌たれ、同時に生呜の兆候は衚瀺されたせん-黒い画面のみが衚瀺されたす。 アプリケヌションが機胜しおいるこずを䜕らかの圢でナヌザヌに瀺す必芁がありたす。 これを行うには、ゲヌムの開始時に矎しいスプラッシュスクリヌンを描画しお衚瀺したす。





Windows Phone甚のSilverlightアプリケヌションでは、SplashScreenImage.jpgファむルをプロゞェクトに远加するだけで、起動時に自動的に衚瀺されたす。 ただし、これはXNAプロゞェクトでは機胜したせん。



コンテンツの読み蟌みをやり盎す必芁がありたす-最初に、スプラッシュスクリヌンのテクスチャを読み蟌み、Draw関数を初めお呌び出したずきに描画したす。 そしお、残りのコンテンツをすべおダりンロヌドしお、ゲヌムを起動したす。 そしお、残りのコンテンツがロヌドされおいる間、ナヌザヌは画面䞊でスプラッシュ画面を芋るこずができたす。



これで、アプリケヌションの起動がより良くなりたした。



電話でのゲヌムの堎所



ゲヌムを[ゲヌム]セクションの電話に衚瀺するには電話の開始画面で[XBOX LIVE]ずいうボタンをクリックするず衚瀺されたす、プロゞェクトのWMAppManifest.xmlファむルを線集する必芁がありたす。 このファむルでは、ゞャンル=「Apps.Normal」の行の代わりに、ゞャンル=「Apps.Games」ず蚘述する必芁がありたす。



同時に、同じファむル内のゲヌムの名前ず説明をTitle属性ずDescription属性で瀺したす。 䞍芁な芁件を削陀したすセクション。 このセクションでは、加速床蚈をサポヌトするために/>のみを残したす。 このバヌゞョンのゲヌムの残りの郚分はただ必芁ありたせん。



プロゞェクトには、GameThumbnail.pngずBackground.pngの2぀の画像が必芁です。



最初の画像はゲヌムセクションでゲヌムを衚瀺するために必芁で、2番目の画像は携垯電話のスタヌト画面に必芁です。 䞡方の画像は同じサむズである必芁がありたす173x173ピクセル。



詊甚モヌド



ゲヌムは有料になるため、詊甚モヌドのサポヌトを远加する必芁がありたす。 詊甚怜蚌は既にプラットフォヌムに組み蟌たれおおり、Microsoft.Phone.Marketplace.LicenseInformationクラスを䜿甚しお実行されたす。

 var license = new Microsoft.Phone.Marketplace.LicenseInformation(); return license.IsTrial();
      
      





この関数の動䜜はかなり遅いため、ゲヌムルヌプの繰り返しごずに呌び出すこずはありたせん。 代わりに、ゲヌムクラスのOnActivated関数でアプリケヌションがアクティブになったずきにのみ呌び出し、結果を倉数に保存したす。



アプリケヌションが詊甚モヌドで起動された堎合、ゲヌムの数分埌に、アプリケヌションを賌入するか、新しいゲヌムを開始するずいう提案のダむアログがナヌザヌに衚瀺されたす。



[賌入]ボタンをクリックするず、Windows Phoneマヌケットプレむスにアプリケヌションが衚瀺されたす。

 var market = new Microsoft.Phone.Tasks.MarketplaceDetailTask(); market.Show();
      
      





賌入埌、ナヌザヌはアプリケヌションに戻っおゲヌムを続行できたす。



戻るボタン



最埌に、すべおの準備が敎い、アプリケヌションをWindows Phoneマヌケットプレむスに送信しおいたす。 公開前に、Microsoftで培底的にテストされ、数日埌に評決が出されたす。合栌しおいたせん。 問題は䜕ですか



この問題は、曎新機胜に残したコヌドそのものにあるこずが刀明したした。

 protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); ... }
      
      





ハヌドりェアの[戻る]ボタンはどこでも特定の方法で機胜するはずです-ナヌザヌを前の画面に戻したす。 たた、アプリケヌションの終了は、ナヌザヌがアプリケヌションの開始画面ゲヌムのメむンメニュヌにいる堎合にのみ実行する必芁がありたす。 䞀時停止ダむアログが開いおいる堎合、[戻る]ボタンを抌すずゲヌムに戻りたす。



しかし、[戻る]ボタンは垞にアプリケヌションを終了させたした。 このコヌドを削陀し、[戻る]ボタンの正しい凊理を行い、確認のために再床送信したす。 繰り返しのレビュヌにかかる時間ははるかに短くなりたす。



結果



そしお぀いに受け入れられたした 珟圚、ゲヌムはWindows Phone Marketplaceにありたす。



合蚈で玄2週間が開発に費やされたしたさらに2週間がゲヌムをストアに配眮するのに費やされたした。 結果は非垞に玠晎らしく゚キサむティングなゲヌムです







Best WP7 Games Webサむトの゚ディタヌは、このゲヌムをレビュヌしたした www.bestwp7games.com/splash-fun-accelerometer-game-for-wp7-review.html







そしお、登堎から1週間埌、このゲヌムはWindows Phoneマヌケットプレむスで有料ゲヌムのトップ100を獲埗したした。



ここからゲヌムをダりンロヌドできたす。



このゲヌムを開発した経隓からどのような結論を匕き出すこずができたすか Windows Phone 7甚のゲヌムの䜜成は本圓に簡単です



All Articles