>本文是Microsoft的Web開發系列的一部分。感謝您支持使SitietPoint成為可能的合作夥伴。 本文討論:
基本遊戲發展哲學
>代碼下載(.zip)
快速開發:利用HTML,JavaScript和CSS中的現有Web開發技能來創建幾乎任何帶有瀏覽器的設備,使用Visual Studio和ASP.NET。
> Visual Studio作為工具:利用視覺工作室進行快速遊戲開發和跨不同設備進行測試,確保兼容性和性能。
這個應用程序將不需要服務器代碼,因此我首先在Visual Studio中創建一個新的,空的網頁項目。我將通過選擇文件後選擇“ Visual C#”選項來使用空網站的空C#模板。新| ASP.NET空網站。
索引HTML文件僅需要三個資源:jQuery,主樣式表和主JavaScript文件。我將一個空的CSS文件添加到名為style.css和一個空的JavaScript文件的項目中,稱為ping.js,以避免加載頁面時錯誤:
><span><span><!DOCTYPE html></span> </span><span><span><span><html</span>></span> </span><span><span><span><head</span>></span> </span> <span><span><span><script</span> src<span>="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.min.js"</span>></span><span><span></script</span>></span> </span> <span><span><span><script</span> src<span>="ping.js"</span>></span><span><span></script</span>></span> </span> <span><span><span><link</span> rel<span>="stylesheet"</span> href<span>="style.css"</span>></span><span><span></script</span>></span> </span><span><span><span></head</span>></span> </span><span><span><span><body</span>></span> </span><span><span><span></body</span>></span> </span><span><span><span></html</span>></span> </span>
也不要忘記在瀏覽器和設備之間對此應用進行測試(或任何其他)。雖然我編寫的代碼與Chrome,Firefox和Microsoft Edge等現代瀏覽器可互操作,但這始終是雙重檢查的最佳實踐。現在,您可以使用免費的虛擬機和其他工具(例如http://www.browserstack.com。
基本設計>
>
<span><span><span><div</span> id<span>="arena"</span>></span> </span> <span><span><span><div</span> id<span>="score"</span>></span> </span> <span><span><span><h1</span>></span> </span> <span><span><span><span</span> id<span>="playerScore"</span>></span>0<span><span></span</span>></span> </span> <span><span><span><span</span> id<span>="opponentScore"</span>></span>0<span><span></span</span>></span> </span> <span><span><span></h1</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="player"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="opponent"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="ball"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="controls-left"</span>></span> </span> <span><span><span><div</span> id<span>="up"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="down"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="controls-right"</span>></span> </span> <span><span><span><div</span> id<span>="left"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="right"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span><span><span><span></div</span>></span> </span>
>第二,我需要將競技場填充整個屏幕,並應用了競技場背景圖像(請參見下圖):
<span>body { </span> <span>margin: 0px; </span> <span>height: 100%; </span><span>} </span>
<span><span>#arena</span> { </span> <span>background-image: <span>url(arena.png)</span>; </span> <span>background-size: 100% 100%; </span> <span>margin: 0px; </span> <span>width: 100%; </span> <span>height: 100%; </span> <span>overflow: hidden; </span><span>} </span>
我也希望文本字體以復古主題為主題。大多數現代瀏覽器都讓我包括自己的字體。我從Codeman38(Zone38.net)找到了適當的按下2P字體。要將字體添加到計分板中,我必須創建一個新的字體臉:
<span><span><!DOCTYPE html></span> </span><span><span><span><html</span>></span> </span><span><span><span><head</span>></span> </span> <span><span><span><script</span> src<span>="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.min.js"</span>></span><span><span></script</span>></span> </span> <span><span><span><script</span> src<span>="ping.js"</span>></span><span><span></script</span>></span> </span> <span><span><span><link</span> rel<span>="stylesheet"</span> href<span>="style.css"</span>></span><span><span></script</span>></span> </span><span><span><span></head</span>></span> </span><span><span><span><body</span>></span> </span><span><span><span></body</span>></span> </span><span><span><span></html</span>></span> </span>
>現在,得分在H1標籤中,因此我可以為所有H1標籤設置字體。萬一缺少字體,我將提供一些備份選項:
><span><span><span><div</span> id<span>="arena"</span>></span> </span> <span><span><span><div</span> id<span>="score"</span>></span> </span> <span><span><span><h1</span>></span> </span> <span><span><span><span</span> id<span>="playerScore"</span>></span>0<span><span></span</span>></span> </span> <span><span><span><span</span> id<span>="opponentScore"</span>></span>0<span><span></span</span>></span> </span> <span><span><span></h1</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="player"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="opponent"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="ball"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="controls-left"</span>></span> </span> <span><span><span><div</span> id<span>="up"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="down"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="controls-right"</span>></span> </span> <span><span><span><div</span> id<span>="left"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="right"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span><span><span><span></div</span>></span> </span>
對於其他元素,我將使用一張圖像片。精靈表包含一個我在一個文件中所需的遊戲所需的圖像(請參見下圖)。
>>在此表上具有圖像的任何元素都將分配一個精靈類。然後,對於每個元素,我將使用背景位置來定義我要顯示的精靈表的哪一部分:
<span>body { </span> <span>margin: 0px; </span> <span>height: 100%; </span><span>} </span>
>
<span><span>#arena</span> { </span> <span>background-image: <span>url(arena.png)</span>; </span> <span>background-size: 100% 100%; </span> <span>margin: 0px; </span> <span>width: 100%; </span> <span>height: 100%; </span> <span>overflow: hidden; </span><span>} </span>
<span><span>#score</span> { </span> <span>position: absolute; </span> <span>z-index: 1000; </span> <span>left: 50%; </span> <span>top: 5%; </span> <span>transform: translate(-50%, 0%); </span><span>} </span>
<span><span>@font-face</span> { </span> <span>font-family: 'PressStart2P'; </span> <span>src: <span>url('PressStart2P.woff')</span>; </span><span>} </span>
<span>h1 { </span> <span>font-family: 'PressStart2P', 'Georgia', serif; </span><span>} </span>
>
<span><span>.sprite</span> { </span> <span>background-image: <span>url("sprites.png")</span>; </span> <span>width: 128px; </span> <span>height: 128px; </span><span>} </span>
<span><span><span><div</span> id<span>="player"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span><span><span><span><div</span> id<span>="opponent"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span><span><span><span><div</span> id<span>="ball"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span><span><span><span><div</span> id<span>="controls-left"</span>></span> </span> <span><span><span><div</span> id<span>="up"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="down"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span><span><span><span></div</span>></span> </span><span><span><span><div</span> id<span>="controls-right"</span>></span> </span> <span><span><span><div</span> id<span>="left"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="right"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span><span><span><span></div</span>></span> </span>
>
遵循彈跳球>
這是一個簡單的概念。當您調用它時,球功能會產生一個新的球。無需使用新關鍵字。這種模式通過闡明可用的對象屬性來減少該變量周圍的一些混亂。而且由於我只有一個小時來製作這個遊戲,所以我需要最大程度地減少任何令人困惑的概念。當我完成簡單的球類時,這種模式的結構:
>為創建一個新的球,我只稱其為已定義的此功能:
<span><span><!DOCTYPE html></span> </span><span><span><span><html</span>></span> </span><span><span><span><head</span>></span> </span> <span><span><span><script</span> src<span>="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.min.js"</span>></span><span><span></script</span>></span> </span> <span><span><span><script</span> src<span>="ping.js"</span>></span><span><span></script</span>></span> </span> <span><span><span><link</span> rel<span>="stylesheet"</span> href<span>="style.css"</span>></span><span><span></script</span>></span> </span><span><span><span></head</span>></span> </span><span><span><span><body</span>></span> </span><span><span><span></body</span>></span> </span><span><span><span></html</span>></span> </span>
>現在我想使球移動並在屏幕上彈跳。首先,我需要以某個時間間隔調用更新功能來創建球的動畫。現代瀏覽器提供了一種用於此目的的函數,稱為requestAnimationFrame。這將作為一個參數函數,並將在下次運行動畫週期時稱之為傳遞功能。當瀏覽器準備好進行更新時,這使球可以平穩地走動。當它調用傳遞功能時,它將在加載頁面後將其在幾秒鐘內提供時間。這對於確保動畫隨著時間的流逝至關重要。在遊戲中,requestAnimationFrame的使用如下:
><span><span><span><div</span> id<span>="arena"</span>></span> </span> <span><span><span><div</span> id<span>="score"</span>></span> </span> <span><span><span><h1</span>></span> </span> <span><span><span><span</span> id<span>="playerScore"</span>></span>0<span><span></span</span>></span> </span> <span><span><span><span</span> id<span>="opponentScore"</span>></span>0<span><span></span</span>></span> </span> <span><span><span></h1</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="player"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="opponent"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="ball"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="controls-left"</span>></span> </span> <span><span><span><div</span> id<span>="up"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="down"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="controls-right"</span>></span> </span> <span><span><span><div</span> id<span>="left"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="right"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span><span><span><span></div</span>></span> </span>
請注意,隨著球完成更新,函數中再次調用requestAnimationFrame。這確保了連續動畫。
>雖然此代碼可以正常工作,但在頁面滿載完整之前,腳本可能會開始運行。為了避免這種情況,我將使用jQuery:
<span>body { </span> <span>margin: 0px; </span> <span>height: 100%; </span><span>} </span>
<span><span>#arena</span> { </span> <span>background-image: <span>url(arena.png)</span>; </span> <span>background-size: 100% 100%; </span> <span>margin: 0px; </span> <span>width: 100%; </span> <span>height: 100%; </span> <span>overflow: hidden; </span><span>} </span>
一個可移動的播放器
我現在可以創建兩個玩家,並讓他們移至屏幕上適當的一側:
<span><span>#score</span> { </span> <span>position: absolute; </span> <span>z-index: 1000; </span> <span>left: 50%; </span> <span>top: 5%; </span> <span>transform: translate(-50%, 0%); </span><span>} </span>
鍵盤輸入
<span><span>@font-face</span> { </span> <span>font-family: 'PressStart2P'; </span> <span>src: <span>url('PressStart2P.woff')</span>; </span><span>} </span>
> 為了確保各種平台上的觸摸輸入和鼠標輸入之間的一致性,我將使用出色的統一框架hand.js(handjs.codeplex.com)。首先,我將腳本添加到HTML中:
><span>h1 { </span> <span>font-family: 'PressStart2P', 'Georgia', serif; </span><span>} </span>
<span><span><!DOCTYPE html></span> </span><span><span><span><html</span>></span> </span><span><span><span><head</span>></span> </span> <span><span><span><script</span> src<span>="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.min.js"</span>></span><span><span></script</span>></span> </span> <span><span><span><script</span> src<span>="ping.js"</span>></span><span><span></script</span>></span> </span> <span><span><span><link</span> rel<span>="stylesheet"</span> href<span>="style.css"</span>></span><span><span></script</span>></span> </span><span><span><span></head</span>></span> </span><span><span><span><body</span>></span> </span><span><span><span></body</span>></span> </span><span><span><span></html</span>></span> </span>
隨著球的反彈,我想讓玩家抓住球。當它被抓住時,球有一個主人,並遵循該主人的動議。我將在球的移動方法中添加功能,允許所有者,然後球將遵循:
<span><span><span><div</span> id<span>="arena"</span>></span> </span> <span><span><span><div</span> id<span>="score"</span>></span> </span> <span><span><span><h1</span>></span> </span> <span><span><span><span</span> id<span>="playerScore"</span>></span>0<span><span></span</span>></span> </span> <span><span><span><span</span> id<span>="opponentScore"</span>></span>0<span><span></span</span>></span> </span> <span><span><span></h1</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="player"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="opponent"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="ball"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="controls-left"</span>></span> </span> <span><span><span><div</span> id<span>="up"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="down"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="controls-right"</span>></span> </span> <span><span><span><div</span> id<span>="left"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="right"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span><span><span><span></div</span>></span> </span>
>
<span>body { </span> <span>margin: 0px; </span> <span>height: 100%; </span><span>} </span>
>
<span><span>#arena</span> { </span> <span>background-image: <span>url(arena.png)</span>; </span> <span>background-size: 100% 100%; </span> <span>margin: 0px; </span> <span>width: 100%; </span> <span>height: 100%; </span> <span>overflow: hidden; </span><span>} </span>
>
然後,我們可以增強鍵盤功能以設置播放器的目標和射擊功能。瞄準的工作方式略有不同。當瞄準鍵釋放時,目標將恢復直接。<span><span>#score</span> { </span> <span>position: absolute; </span> <span>z-index: 1000; </span> <span>left: 50%; </span> <span>top: 5%; </span> <span>transform: translate(-50%, 0%); </span><span>} </span>
最終添加將是所有控件的觸摸支持。我將在正確的控件上更改玩家的目標。我還將在屏幕上的任何地方都觸摸它:
<span><span>@font-face</span> { </span> <span>font-family: 'PressStart2P'; </span> <span>src: <span>url('PressStart2P.woff')</span>; </span><span>} </span>
>保持得分
<span>h1 { </span> <span>font-family: 'PressStart2P', 'Georgia', serif; </span><span>} </span>
>下面的代碼對這些事件做出反應,以更新得分並交出球。將此代碼添加到JavaScript文檔的底部。
<span><span>.sprite</span> { </span> <span>background-image: <span>url("sprites.png")</span>; </span> <span>width: 128px; </span> <span>height: 128px; </span><span>} </span>
現在,當球超越對手時(這並不困難,因為對手沒有移動),您的得分就會上升,球將交給對手。但是,對手只會抓住球。
<span><span><span><div</span> id<span>="player"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span><span><span><span><div</span> id<span>="opponent"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span><span><span><span><div</span> id<span>="ball"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span><span><span><span><div</span> id<span>="controls-left"</span>></span> </span> <span><span><span><div</span> id<span>="up"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="down"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span><span><span><span></div</span>></span> </span><span><span><span><div</span> id<span>="controls-right"</span>></span> </span> <span><span><span><div</span> id<span>="left"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="right"</span> class<span>="sprite"</span>></span><span><span></div</span>></span> </span><span><span><span></div</span>></span> </span>
您幾乎有一場比賽。如果你有一個可以和誰一起玩的人。作為最後一步,我將展示如何用簡單的AI控制對手。對手會在球移動時試圖與球保持平行。如果對手接球,它將隨機移動並朝隨機發射球。為了使人工智能感覺更加人性化,我將在所有事情中添加延誤。請注意,這不是高度智能的AI,但這將是與遊戲對抗的事情。
在設計這種系統時,在各州進行思考是一件好事。對手AI有三個可能的狀態:遵循,瞄準/射擊和等待。我將成為遵循添加更人性化元素的行動之間的狀態。僅針對AI對像開始:
<span><span><!DOCTYPE html></span> </span><span><span><span><html</span>></span> </span><span><span><span><head</span>></span> </span> <span><span><span><script</span> src<span>="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.min.js"</span>></span><span><span></script</span>></span> </span> <span><span><span><script</span> src<span>="ping.js"</span>></span><span><span></script</span>></span> </span> <span><span><span><link</span> rel<span>="stylesheet"</span> href<span>="style.css"</span>></span><span><span></script</span>></span> </span><span><span><span></head</span>></span> </span><span><span><span><body</span>></span> </span><span><span><span></body</span>></span> </span><span><span><span></html</span>></span> </span>
>根據AI的狀態,我希望它採取不同的動作。就像球一樣,我將在requestAnimationframe中進行更新函數,以根據其狀態制定AI法案:
<span><span><span><div</span> id<span>="arena"</span>></span> </span> <span><span><span><div</span> id<span>="score"</span>></span> </span> <span><span><span><h1</span>></span> </span> <span><span><span><span</span> id<span>="playerScore"</span>></span>0<span><span></span</span>></span> </span> <span><span><span><span</span> id<span>="opponentScore"</span>></span>0<span><span></span</span>></span> </span> <span><span><span></h1</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="player"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="opponent"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="ball"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="controls-left"</span>></span> </span> <span><span><span><div</span> id<span>="up"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="down"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="controls-right"</span>></span> </span> <span><span><span><div</span> id<span>="left"</span>></span><span><span></div</span>></span> </span> <span><span><span><div</span> id<span>="right"</span>></span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span><span><span><span></div</span>></span> </span>
<span>body { </span> <span>margin: 0px; </span> <span>height: 100%; </span><span>} </span>
<span><span>#arena</span> { </span> <span>background-image: <span>url(arena.png)</span>; </span> <span>background-size: 100% 100%; </span> <span>margin: 0px; </span> <span>width: 100%; </span> <span>height: 100%; </span> <span>overflow: hidden; </span><span>} </span>
總結
到目前為止,您擁有一個完整的網絡遊戲,可在PC,智能手機和平板電腦上使用。該遊戲有許多可能的改進。例如,它在智能手機上的肖像模式中看起來會有些尷尬,因此您需要確保在景觀中握住手機才能正常工作。這只是網絡及以後遊戲開發的可能性的一個小表明。
<span><span>#score</span> { </span> <span>position: absolute; </span> <span>z-index: 1000; </span> <span>left: 50%; </span> <span>top: 5%; </span> <span>transform: translate(-50%, 0%); </span><span>} </span>
本文是Microsoft Tech傳教士的Web開發系列的一部分,該系列有關實用的JavaScript學習,開源項目和互操作性最佳實踐,包括Microsoft Edge瀏覽器和新的Edgehtml渲染引擎。
我們鼓勵您在瀏覽器和設備上進行測試,包括Microsoft Edge(Windows 10的默認瀏覽器),並在dev.modern.ie上使用免費工具:>掃描您的網站以獲取過時的庫,佈局問題和可訪問性
>>遠程測試您自己的設備上的Microsoft Edge
GitHub上的編碼實驗室:跨瀏覽器測試和最佳實踐在Microsoft Edge上以及我們的工程師和傳教士的Web平台上的深入技術學習:
我如何在Visual Studio中添加聲音效果和音樂?在Visual Studio中為遊戲的聲音效果和音樂涉及使用System.Media名稱空間中的Soundplayer類。您可以使用播放方法播放聲音效果或音樂曲目,以及停止播放聲音的停止方法。您也可以使用Playlooping方法連續播放聲音。 Soundplayer類支持WAV文件,因此您需要將聲音效果和音樂曲目轉換為此格式。
>
雖然在技術上可以使用Visual Studio和asp.net開發遊戲機,但這並不是這些最常見的用例工具。遊戲機遊戲開發通常涉及使用專用遊戲開發引擎(例如Unity或Unreal Engine),該引擎為遊戲機遊戲開發提供了更高級的工具和功能。但是,您可以使用Visual Studio和ASP.NET來開發控制台遊戲的服務器端組件,例如多人遊戲配對服務或排行榜系統。 >以上是使用Visual Studio和ASP.NET在一個小時內構建網絡遊戲的詳細內容。更多資訊請關注PHP中文網其他相關文章!