Windows Mobile 6 遊戲開發入門
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Windows Mobile 6 遊戲開發入門

  • 3,607 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
3,607
On Slideshare
3,585
From Embeds
22
Number of Embeds
1

Actions

Shares
Downloads
20
Comments
0
Likes
0

Embeds 22

http://www.slideshare.net 22

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Windows Mobile 6 遊戲開發入門 王寧疆 資深講師 資策會數位教育研究所 MCPD/MCT/MVP
  • 2. 大綱 Windows Mobile行動裝置平台 Windows Mobile遊戲開發支援 Windows Mobile遊戲開發技術 認識GAPI, GAPINET, GAPIDraw, 與 GAPIDrawNET 認識DirectX, DirectX Mobile, 與Managed DirectX 使用DirectX Mobile的基本動作 Windows Mobile遊戲開發體驗 好用的DirectX開發輔助工具
  • 3. Windows Mobile行動裝置平台 Microsoft Visual Studio Native Managed Server side MFC ATL .NET Compact ASP .NET Win32 Framework Mobile Controls Software Platform (APIs) Device Management Communication Presentation Data Access Multimedia Remote API Connection Manager Home Screen SQL CE GAPI Configuration* TAPI* User Interface/Shell ADO CE Camera Bluetooth SMS* HTML Control XML D3DM Security MAPI* DOM CE DB Location* Notif Broker* POOM* OLE DB Pocket Watson ActiveSync* Windows Mobile Windows CE CE DB Pocket Outlook ActiveSync Pocket Internet Explorer SQL CE Windows Media Player Drivers Device Processor Display Radio GSM/GPRS WiFi Hardware Memory USB or Serial CDMA/1xRTT Bluetooth * = Managed wrappers
  • 4. Windows Mobile遊戲開發支援
  • 5. Windows Mobile遊戲開發技術 GDI/GDI+ 功能薄弱, 以Bitmap類別的功能為例, MakeTransparent方法和SetResolution方法都 無法使用, 而且也不能呼叫繼承自Image類別 的RotateFlip方法 GAPI/GAPINet 支援高效能、而且即時的繪圖功能 GAPIDraw/GAPIDrawNet 適合Pocket PC 2003與Windows Mobile 5.0或 更高版本的行動裝置的遊戲程式設計支援 DirectX/Managed DirectX/DirectX Mobile 支援Direct3D三維繪圖引擎
  • 6. 認識GAPI/GAPINET, GAPIDraw/GAPIDrawNET 認識GAPI Game API的縮寫, 支援在行動裝置上執行高效 能的圖形繪製 體積輕巧的遊戲設計介面(大約8KB) 認識GAPINET 將GAPI提供的C函數介面封裝成.NET平台能夠 使用的類別介面, 協助使用C#或VB.NET的程式 設計師開發行動裝置的遊戲程式
  • 7. 認識GAPI/GAPINET, GAPIDraw/GAPIDrawNET(續) 認識GAPIDraw 一組支援開發Windows Mobile平台遊戲, 導覽程式, 和 進階使用者介面的C++類別和應用程式架構 認識GAPIDrawNET 將GAPIDraw提供的功能封 裝成.NET可用的類別
  • 8. GAPIDraw的特性 GapiDraw的功能類似DirectX提供的 DirectDraw, 可以視為DirectDraw功能的擴 充, 包括功能更強的blit效果, 旋轉中放大功 能, 從檔案或記憶體載入圖形, 多種繪圖工 具, 碰撞遮罩, 圖形交集處理, 由執行緒控制 的計時器, 以及點陣字型支援等等… 提供支援.NET語言(VB.NET和C#程式語言)開 發遊戲程式的開放原始碼(Open Source)
  • 9. GAPI的基本功能 函數名稱 說明 GXBeginDraw 執行繪圖前的準備工作,傳回螢幕記憶 體的位址,而不是DC的Handle(HDC)。 GXCloseDisplay 結束繪圖的動作,釋放GAPI所佔據的螢 幕資源。通常在應用程式結束前呼叫。 GXCloseInput 釋放GAPI佔據的按鍵資源。 GXEndDraw 和GXBeginDraw成對使用,可以在完成 一個完整的繪圖動作後呼叫,忘記呼叫 GXEndDraw會造成記憶體很快就不敷使 用。 GXGetDefaultKeys 提供建議的按鍵資訊。 GXGetDisplayProperties 查詢螢幕顯示記憶體的相關資訊並存放 到GXDisplayProperties結構的變數中。
  • 10. GAPI的基本功能(續) 函數名稱 說明 GXIsDisplayDRAMBuffer 判斷顯示螢幕是否標準的函數。 GXOpenDisplay 應用程式在執行繪圖動作之前必須先 呼叫這個函數,取得顯示裝置的控制 權,並拒絕其他的應用程式使用螢幕。 GXOpenInput 取得按鍵的控制權, 並將按鍵操作引發 的訊息傳給應用程式, 而不是傳給 Windows CE的Shell, 避免使用者在執 行GAPI應用程式的時候啟動其他的應 用程式。 GXResume 恢復被GXSuspend暫停的GAPI繪圖動 作,應用程式可以在收到 WM_SETFOCUS訊息時呼叫這個方法。 GXSetViewport 定義GAPI的視界(View Port)。 GXSuspend 暫停繪圖工作, 應用程式可以在收到 WM_KILLFOCUS訊息時呼叫此方法。
  • 11. GAPI的使用方式
  • 12. 認識DirectX Microsoft Windows平台支援多媒體, 遊戲開 發, 以及影音播放的技術, 其內容包括: Direct3D, DirectDraw, DirectMusic, DirectPlay, DirectSound, DirectInput等等 Managed DirectX (簡稱MDX) 支援利用Visual Basic .NET或C#程式語言使用 DirectX功能控制現代化的顯示卡 Managed DirectX版本: 1.1版, 2.0版, 新版已改名為XNA DirectX Mobile 支援Windows Mobile行動裝置的DirectX
  • 13. DirectX的沿革 1992年Servan Keondjian創立 RenderMorphics公司, 設立研究3D圖學的實 驗室, 名稱Reality Lab Microsoft於1995年購併RenderMorphics公 司, 為Windows 95加入3D圖學功能, 即第一 個版本的DirectX 目前DirectX的最新版本為Windows Vista支 援的DirectX 10.0 DirectX 11.0目前正在研發中…
  • 14. DirectX的重要功能 Direct3D  提供3D繪圖和動畫功能, 可以發揮顯示卡的硬 體加速功能 DirectDraw  提供2D繪圖, 與直接存取顯示記憶體的能力 DirectInput  支援各種輸入裝置控制, 包括鍵盤, 滑鼠, 搖桿, 控制板, 方向盤, 腳踏板等等 DirectSound  支援播放與錄製WAV格式的聲音檔案, 提供立體 聲與立體音效. 需要進階聲音播放控制功能時請 用DirectMusic
  • 15. DirectX的重要功能 (續) DirectMusic  播放功能更強大的DirectSound. 支援動態音軌, 3D聲音定位, 以及硬體加速, 支援MIDI, WAV格 式, 和DirectMusic Producer錄製的聲音檔案 DirectPlay  支援網路遊戲開發, 包括即時語音會議  支援GPRS, Bluetooth, Wi-Fi連線方式 DirectShow  支援聲音/影像錄製與播放, 支援TV電視卡 DirectSetup  支援將DirectX安裝到使用者的電腦
  • 16. DirectX For Windows Mobile Direct3D Mobile 支援Windows Mobile的Direct3D 需要Microsoft Windows Mobile 5.0或更高的版本 DirectDraw 可以利用Platform Invocation技術進行呼叫 DirectInput 目前Windows Mobile 5.0/6.0皆未支援 DirectInput相關的功能, 行動裝置應用程式可以 依賴GAPI進行輸入控制, 或直接處理鍵盤事件 DirectSound 請使用Waveform Audio API代替
  • 17. 認識Direct3D Mobile 支援行動裝置的Direct3D Mobile的功能 DirectX 9的功能精簡版, 功能接近DirectX 8 提供高效能3D繪圖和動畫功能 支援3D遊戲製作 支援全螢幕/非全螢幕顯示模式 體積精巧, 模組化 支援行動裝置的主流硬體與驅動程式 數值資料支援 支援IEEE 32-bit浮點數 支援16.16 Fixed Point數值, 解決部分行動裝置處理 器未提供浮點運算的問題
  • 18. Windows Mobile與DirectDraw 支援行動裝置的DirectDraw的功能 提供2維繪圖與硬體加速功能 支援影片播放 體積精巧 支援行動裝置螢幕旋轉功能 使用方法 可以將所定義的Platform Invocation功能包裝 成類別, 方便使用
  • 19. 使用DirectX Mobile DirectX常用的名詞與型態 使用DirectX Mobile的基本動作 繪圖與動畫 輸入控制 聲音控制
  • 20. DirectX常用的名詞與型態 Device:負責繪製內容, 播放聲音的型態  DirectDraw Device, Direct3D Device, DirectSound Device, … Caps:描述Direct3D Device的能力 PresentParameters :描述Direct3D Device的 特性 Surface:存放欲顯示的內容, 可以用來存取 Video記憶體或主記憶體 SurfaceDescription:描述Surface的資訊 SurfaceCaps:描述Surface的能力
  • 21. DirectX常用的名詞與型態(續) Buffer:存放欲顯示的內容  存放DirectSound欲播放的聲音:Buffer, SecondaryBuffer  存放Direct3D的內容:VertexBuffer, IndexBuffer ColorKey:用來指定圖片的透空色彩 Pool:指定Direct3D的存放VertexBuffer的記憶 體位置  VideoMemory:存放在顯示卡的記憶體中  SystemMemory:存放在主記憶體中  Managed:存放在主記憶體中, 視需要自動複製到 顯示卡的記憶體中
  • 22. Vertex Buffer與Index Buffer Vertex Buffer的內容 Index Buffer的內容
  • 23. 使用DirectX Mobile的基本動作 參考Microsoft.WindowsMobile.DirectX.dll組件 建立DirectX裝置(Device)  同一個時間只能建立一個Device 查詢Device的能力 建立Vertex Buffer 判斷螢幕的方向 輸入控制
  • 24. 建立DirectX裝置(Device) – C# //設定Direct3D Mobile device需要的參數 PresentParameters sPresentParameters = new PresentParameters(); sPresentParameters.Windowed = true; sPresentParameters.SwapEffect = SwapEffect.Discard; sPresentParameters.BackBufferFormat = Format.Unknown; sPresentParameters.EnableAutoDepthStencil = true; sPresentParameters.AutoDepthStencilFormat = DepthFormat.D16; //建立Direct3D Mobile device m_oDevice = new Device(0, DeviceType.Default, this, CreateFlags.None, sPresentParameters);
  • 25. 建立DirectX裝置(Device) – VB ‘設定Direct3D Mobile device需要的參數 Dim sPresentParameters As PresentParameters = New _ PresentParameters() sPresentParameters.Windowed = True sPresentParameters.SwapEffect = SwapEffect.Discard sPresentParameters.BackBufferFormat = Format.Unknown sPresentParameters.EnableAutoDepthStencil = True sPresentParameters.AutoDepthStencilFormat = _ DepthFormat.D16 '建立Direct3D Mobile device m_oDevice = New Device(0, DeviceType.Default, Me, _ CreateFlags.None, sPresentParameters)
  • 26. 查詢Device的能力 //查詢Device的能力 Caps m_sDeviceCaps = m_oDevice.DeviceCaps; //判斷Device是否支援 floating point values if (m_sDeviceCaps.DeviceCaps.NativeFloat) { Trace.WriteLine("Device Supports Floating Point Values"); } //判斷Device是否支援directional lights if (m_sDeviceCaps.VertexProcessingCaps.SupportsDirectionalLights) { Trace.WriteLine("Device Supports Directional Lights"); }
  • 27. 建立Vertex Buffer //建立Vertex Buffer m_oVB = new VertexBuffer( typeof(CustomVertex.PositionNormal), 100, m_oDevice, 0, CustomVertex.PositionNormal.Format, eD3DMPool); //填入欲顯示的資料到VerTex Buffer PopulateVertexBuffer(m_oVB);
  • 28. 顯示VerTex Buffer的內容 m_oDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Bisque, 1.0F, 0); m_oDevice.BeginScene(); SetupMatrices(); SetupLights(); SetupMaterials(); m_oDevice.SetStreamSource(0, m_oVB, 0); m_oDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 98); m_oDevice.EndScene(); m_oDevice.Present();
  • 29. 判斷螢幕的方向 //判斷使用者是否旋轉過行動裝置的螢幕 if (SystemSettings.ScreenOrientation != ScreenOrientation.Angle0) { //使用者旋轉過行動裝置的螢幕 // ... }
  • 30. 輸入控制 兩種選擇:  呼叫GAPI功能  處理事件  MouseUp, MouseDown, MouseMove  KeyUp, KeyDown, KeyPress private void Form1_KeyDown(object sender, KeyEventArgs e) { if ((e.KeyCode == System.Windows.Forms.Keys.Up)) // Up … }
  • 31. 結束繪圖的動作 丟棄VerTex Buffer m_oVB.Dispose(); 丟棄Device m_oDevice.Dispose();
  • 32. 使用Direct3D Mobile顯示動畫
  • 33. 聲音控制 使用Waveform Audio API 利用Platform Invocation技術 宣告 [DllImport("CoreDll.dll", EntryPoint = "PlaySound", SetLastError = true)] private extern static bool PlaySound(string szSound, IntPtr hMod, int flags); 呼叫 PlaySound(Path.Combine("Audios", fileName), IntPtr.Zero, (int)(SND.SYNC | SND.FILENAME));
  • 34. Windows Mobile遊戲開發體驗 建立專案, 參考必要的組件 修改Program.cs中的Main方法 顯示遊戲背景 顯示太空船 移動太空船 發出雷射光 加入幽浮 幽浮投彈 命中檢查 加入音效
  • 35. 修改Program.cs中的Main方法 加入控制程式執行的迴圈 using (Form1 app = new Form1()) 利用Render方法更新 { 遊戲顯示的內容, app.Show(); 例如動畫 while (app.Focused) public void Render() { { 顯示遊戲內容 app.Render(); } Application.DoEvents(); } } 允許程式處理事件
  • 36. 顯示遊戲背景(一) 為專案建立存放圖片的images資料夾, 加入 當做主畫面的invasion.png和當做背景圖的 backdrop2.png, 將兩張圖的[複製到輸出目錄] 屬性設定成:有更新時才複製 為Form1類別加入以下的變數宣告: private DirectDrawGraphics _graphics; private Surface _screen; private Surface _main; private Surface _background; tagRECT srcScreenRec, destScreenRec;
  • 37. 顯示遊戲背景(二) 為Form1製作Load事件處理程序: string AppPath = Path.GetDirectoryName( Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName); _graphics = new DirectDrawGraphics(this, CooperativeFlags.Fullscreen, BackbufferMode.Any); _screen = _graphics.ScreenSurface; _main = _graphics.CreateSurfaceFromImage(new Bitmap(Path.Combine(AppPath, "imagesinvasion.png"))); destScreenRec = new tagRECT(0, 0, _screen.Width, _screen.Height); srcScreenRec = new tagRECT(0, 0, _main.Width, _main.Height); _screen.Draw(ref destScreenRec, _main, ref srcScreenRec, BltFlags.DDBLT_WAITNOTBUSY); _graphics.Flip();
  • 38. 顯示遊戲背景(三) 為Form1製作Closing事件處理程序: _graphics.Dispose(); 為Form1製作[File | Exit]功能表, 並為Exit功 能表製作Click事件處理程序: Close();
  • 39. 顯示太空船(一) 於存放圖片的images資料夾, 加入當做太空 船的ship.png, 將圖的[複製到輸出目錄]屬性 設定成:有更新時才複製 為Form1類別加入以下的變數宣告: private Surface _ship; tagRECT srcShipRec, destShipRec; const int _shipSize = 70; const int _scoreBar = 20;
  • 40. 顯示太空船(二) 於Form1的Load事件處理程序加入: _ship = _graphics.CreateSurfaceFromImage(new Bitmap(Path.Combine(AppPath, "imagesship.png"))); _ship.SetColorKey(Color.Black, ColorKeyFlags.SRCBLT); destShipRec = new tagRECT(0, _screen.Height - _shipSize - _scoreBar, _shipSize, _screen.Height - _scoreBar); srcShipRec = new tagRECT(0, 0, _shipSize, _shipSize); _screen.Draw(ref destShipRec, _ship, ref srcShipRec, BltFlags.DDBLT_KEYSRC); _graphics.Flip();
  • 41. 太空船的圖案 DirectX支援BMP, JPG, PNG, 等常見的圖形檔 格式 利用單一圖形檔案內含多張不同的圖案, 再 指定座標來取用
  • 42. ColorKey與透空顯示 利用ColorKey指定圖片的背景色彩, 達到透空 的效果 搭配DDBLT_KEYSRC效果進行顯示 未透空顯示 透空顯示 ColorKey為 白色
  • 43. Primary Buffer與Back Buffer 利用Flip方法切換Primary Buffer與Back Buffer可以提升顯示速度 傳統的顯示法 – 複製資料到Video Memory DirectX的顯示法 – 切換Video Memory
  • 44. 移動太空船 為Form1加入keyDown事件處理程序 private void Form1_KeyDown(object sender, KeyEventArgs e) { if ((e.KeyCode == System.Windows.Forms.Keys.Left)) { if (destShipRec.left > 0 ) { destShipRec.left -= 10; destShipRec.right -= 10; } } if ((e.KeyCode == System.Windows.Forms.Keys.Right)) { … } }
  • 45. DirectX與動畫顯示 顯示幽浮 幽浮爆炸
  • 46. 發射雷射光 (一) 於存放圖片的images資料夾, 加入當做雷射 光的Laser.png, 將圖的[複製到輸出目錄]屬性 設定成:有更新時才複製 為Form1類別加入以下的變數宣告: private Surface _laser; tagRECT srcLaserRec, destLaserRec; const int _LaserSize = 20; const int GunPosition = 15; bool bShowLaser=false;
  • 47. 發射雷射光 (二) 於Form1的Load事件處理程序加入: _laser = _graphics.CreateSurfaceFromImage(new Bitmap(Path.Combine(AppPath, "imagesLaser.png"))); _laser.SetColorKey(Color.Black, ColorKeyFlags.SRCBLT); 為Closing事件處理程序加入: _laser.Dispose();
  • 48. 發射雷射光 (三) 於Form1類別的Render方法加入: if (bShowLaser) { _screen.Draw(ref destLaserRec, _laser, ref srcLaserRec, BltFlags.DDBLT_KEYSRC); _graphics.Flip(); if (destLaserRec.top > destScreenRec.top) { destLaserRec.top -= 10; destLaserRec.bottom -= 10; } else { bShowLaser = false; }
  • 49. 發射雷射光 (四) 修改Form1類別的KeyDown事件處理程序: if ((e.KeyCode == System.Windows.Forms.Keys.Enter)) { destLaserRec = new tagRECT(destShipRec.left + GunPosition, destShipRec.top, destShipRec.left + GunPosition + _LaserSize, destShipRec.top + _LaserSize); srcLaserRec = new tagRECT(0, 0, 20, 20); bShowLaser = true; }
  • 50. 加入幽浮 (一) 於存放圖片的images資料夾, 加入當做幽浮 的Ufo.png, 將圖的[複製到輸出目錄]屬性設 定成:有更新時才複製 為Form1類別加入以下的變數宣告: private Surface _ufo; tagRECT srcUfoRec, destUfoRec; const int _UfoSize = 70; Random rndUfo=null; 為Closing事件處理程序加入: _ufo.Dispose();
  • 51. 加入幽浮 (二) 於Form1的Load事件處理程序加入: _ufo = _graphics.CreateSurfaceFromImage(new Bitmap(Path.Combine(AppPath, "imagesUfo.png"))); _ufo.SetColorKey(Color.Black, ColorKeyFlags.SRCBLT); rndUfo=new Random(); destUfoRec = new tagRECT(0, 0, _UfoSize, _UfoSize); srcUfoRec = new tagRECT(0, 0, _UfoSize, _UfoSize);
  • 52. 加入幽浮 (三) 於Form1類別的Render方法加入: int left=rndUfo.Next(0, _screen.Width+1-_UfoSize); int top=rndUfo.Next(0, _screen.Height+1-_UfoSize); destUfoRec=new tagRECT(left, top, left+_UfoSize, top+_UfoSize); _screen.Draw(ref destUfoRec, _ufo, ref srcUfoRec, BltFlags.DDBLT_KEYSRC); _graphics.Flip();
  • 53. 調整幽浮移動的速度 將顯示幽浮的程式碼改成: int Direction = rndUfo.Next(0, 2); if (Direction == 0) { if (destUfoRec.right < destScreenRec.right) { destUfoRec.left += 5; destUfoRec.right = destUfoRec.left + _UfoSize; } } else { //省略 } _screen.Draw(ref destUfoRec, _ufo, ref srcUfoRec, BltFlags.DDBLT_KEYSRC); _graphics.Flip();
  • 54. 旋轉幽浮 在Form1類別中宣告: int UfoFrameNo=0; 在顯示幽浮之後加入以下的程式碼: UfoFrameNo++; UfoFrameNo=UfoFrameNo>4?0:UfoFrameNo; srcUfoRec = new tagRECT(_UfoSize*UfoFrameNo, 0, _UfoSize*UfoFrameNo+_UfoSize, _UfoSize);
  • 55. 幽浮投彈 (一) 於存放圖片的images資料夾, 加入當做炸彈 的bomb.png, 將圖的[複製到輸出目錄]屬性 設定成:有更新時才複製 為Form1類別加入以下的變數宣告: private Surface _bomb; tagRECT srcBombRec, destBombRec; const int _BombSize = 20; int BombFrameNo = 0; DateTime dtBomb; bool bShowBomb = false; bool bShowUfo=true; bool bShowShipExplode=false;
  • 56. 幽浮投彈 (二) 於Form1的Load事件處理程序加入: _bomb = _graphics.CreateSurfaceFromImage(new Bitmap(Path.Combine(AppPath, "imagesbomb.png"))); _bomb.SetColorKey(Color.Black, ColorKeyFlags.SRCBLT); srcBombRec = new tagRECT(0, 0, _BombSize, _BombSize); dtBomb=DateTime.Now; 為Closing事件處理程序加入: _bomb.Dispose();
  • 57. 幽浮投彈 (三) 於Form1類別的Render方法加入: if (bShowUfo) { if (DateTime.Now.Subtract(dtBomb).Seconds > 3) { bShowBomb = true; int left=destUfoRec.left+(_UfoSize-_BombSize)/2; destBombRec = new tagRECT(left, destUfoRec.bottom, left + _BombSize, destUfoRec.bottom + _BombSize); dtBomb = DateTime.Now; } } if (bShowBomb && !bShowShipExplode) { //省略 }
  • 58. 命中檢查 (一) 在Form1類別中宣告: bool bShowShip=true; bool bShowUfoExplode=false; 修改顯示幽浮的語法: if (bShowUfo) { _screen.Draw(ref destUfoRec, _ufo, ref srcUfoRec, BltFlags.DDBLT_KEYSRC); _graphics.Flip(); }
  • 59. 命中檢查 (二) 修改顯示太空船的語法: if (bShowShip) { _screen.Draw(ref destShipRec, _ship, ref srcShipRec, BltFlags.DDBLT_KEYSRC); _graphics.Flip(); } 於Form1類別的Render方法加入 CheckCollision方法呼叫: CheckCollision();
  • 60. 命中檢查 (三) 為Form1類別加入CheckCollision方法: private void CheckCollision() { Rectangle rtShip = new Rectangle(destShipRec.left, destShipRec.top, _shipSize, _shipSize); int BombCenterX = (destBombRec.left + destBombRec.right) / 2; int BombCenterY = (destBombRec.top + destBombRec.bottom) / 2; Rectangle rtBomb = new Rectangle(destBombRec.left-5, destBombRec.top-5,10, 10); Rectangle rtUfo = new Rectangle(destUfoRec.left, destUfoRec.top, _UfoSize, _UfoSize); //省略 }
  • 61. 顯示太空船爆炸效果 (一) 於存放圖片的images資料夾, 加入當做爆炸 效果的shipexplode.png, 將圖的[複製到輸出 目錄]屬性設定成:有更新時才複製 為Form1類別加入以下的變數宣告: private Surface _shipexplode; tagRECT srcShipExplodeRec; int ShipExplodeFrameNo=0; 為Closing事件處理程序加入: _shipexplode.Dispose();
  • 62. 顯示太空船爆炸效果 (二) 於Form1的Load事件處理程序加入: _shipexplode = _graphics.CreateSurfaceFromImage(new Bitmap(Path.Combine(AppPath, "imagesshipexplode.png"))); _shipexplode.SetColorKey(Color.Black, ColorKeyFlags.SRCBLT); srcShipExplodeRec = new tagRECT(0, 0, _shipSize, _shipSize);
  • 63. 顯示太空船爆炸效果 (三) 於Form1類別的Render方法的CheckCollision 呼叫之後加入: if (bShowShipExplode) { //ship was hitted _screen.Draw(ref destShipRec, _shipexplode, ref srcShipExplodeRec, BltFlags.DDBLT_KEYSRC); _graphics.Flip(); ShipExplodeFrameNo++; if (ShipExplodeFrameNo>6) { bShowShipExplode = false; ShipExplodeFrameNo=0; } else { 省略 } }
  • 64. 顯示幽浮爆炸效果 (一) 於存放圖片的images資料夾, 加入當做爆炸 效果的ufoexplode.png, 將圖的[複製到輸出目 錄]屬性設定成:有更新時才複製 為Form1類別加入以下的變數宣告: private Surface _ufoexplode; tagRECT srcUfoExplodeRec; int UfoExplodeFrameNo=0; 為Closing事件處理程序加入: _ufoexplode.Dispose();
  • 65. 顯示幽浮爆炸效果 (二) 於Form1的Load事件處理程序加入: _ufoexplode = _graphics.CreateSurfaceFromImage(new Bitmap(Path.Combine(AppPath, "imagesufoexplode.png"))); _ufoexplode.SetColorKey(Color.Black, ColorKeyFlags.SRCBLT); srcUfoExplodeRec = new tagRECT(0, _UfoSize, _UfoSize, _UfoSize+_UfoSize);
  • 66. 顯示幽浮爆炸效果 (三) 於Form1類別的Render方法的CheckCollision 呼叫之後加入: if (bShowUfoExplode) { //Ufo was hitted _screen.Draw(ref destUfoRec, _ufoexplode, ref srcUfoExplodeRec, BltFlags.DDBLT_KEYSRC); _graphics.Flip(); UfoExplodeFrameNo++; if (UfoExplodeFrameNo>4) { bShowUfoExplode = false; UfoExplodeFrameNo=0; } else { 省略 } }
  • 67. 加入音效 (一) 為專案建立存放音效檔案的audios資料夾, 於 audios資料夾加入laser.wmv, bomb.wmv, explosion.wmv, 將音效檔案的[複製到輸出目 錄]屬性設定成:有更新時才複製 於Form1類別加入: [DllImport("CoreDll.dll", EntryPoint = "PlaySound", SetLastError = true)] private extern static bool PlaySound(string szSound, IntPtr hMod, int flags); private enum SND { SYNC = 0x0000, //省略 }
  • 68. 加入音效 (二) 加入發射雷射音效: PlaySound(Path.Combine("audios", "laser.wmv"), IntPtr.Zero, (int)(SND.SYNC | SND.FILENAME)); 加入投擲炸彈音效: PlaySound(Path.Combine("audios", "bomb.wmv"), IntPtr.Zero, (int)(SND.SYNC | SND.FILENAME)); 加入命中太空船和幽浮音效: PlaySound(Path.Combine("audios", "explosion.wmv"), IntPtr.Zero, (int)(SND.SYNC | SND.FILENAME));
  • 69. 使用DirectX功能製作的 Windows Mobile遊戲
  • 70. 程式改良 1) 遊戲結束時詢問使用者是否再玩? 2) 計分, 排行 3) 彈藥存量 4) 船體受損程度 5) 將以下的內容製作成類別: 雷射光 幽浮 炸彈 …
  • 71. 好用的DirectX開發輔助工具 Audio Console DirectX Caps Viewer DirectX Console Panel DirectX Error Lookup DirectX Texture Tool DirectX Viewer Game Definition File Editor Microsoft Cross-Platform Audio Creation Tool(XACT) PIX for Windows
  • 72. 複習 Windows Mobile行動裝置平台 Windows Mobile遊戲開發支援 Windows Mobile遊戲開發技術 認識GAPI, GAPINET, GAPIDraw, 與 GAPIDrawNET 認識DirectX, DirectX Mobile, 與Managed DirectX 使用DirectX Mobile的基本動作 Windows Mobile遊戲開發體驗 好用的DirectX開發輔助工具
  • 73. 下載 GAPINet http://msdn.microsoft.com/en- us/library/aa446577.aspx GAPIDraw http://www.gapidraw.com/download.php GAPIDrawNet http://code.google.com/p/gapidrawnet/ DirectX SDK http://msdn.microsoft.com/en- us/directx/aa937788.aspx
  • 74. 下載-資策會台北中心 http://www.iiiedu.org.tw/taipei 資訊專區