如何編程游戲,如何快速開發(fā)一個(gè)小游戲?
如何快速開發(fā)一款火爆的小游戲?“火爆”是一個(gè)偏運(yùn)營的詞,在小游戲上線120天《微信開發(fā)者》公眾號(hào)有一篇推文,其中有幾個(gè)數(shù)字或許可以用來描述“火爆”這個(gè)詞。截止微信小游戲正式允許第三方開發(fā)者發(fā)布已有22天,對外發(fā)布的小游戲達(dá)300多款,注冊用戶總規(guī)模過億的游戲有數(shù)款,安卓月流水過千萬的也有數(shù)款。
該文還提到與火爆相關(guān)的兩個(gè)姿勢。一是社交匹配度,在小游戲這樣一個(gè)去中心化的大背景下,讓游戲內(nèi)容和微信社交相結(jié)合是一個(gè)很重要的點(diǎn),同時(shí)開發(fā)者也需要在利用社交互動(dòng)提升用戶體驗(yàn)和群聊分享造成用戶騷擾之間選擇一個(gè)平衡點(diǎn),過猶不及。第二是操作簡便度,說的是游戲易上手操作簡單。這是我們根據(jù)游戲成為爆款后觀察得出的結(jié)論,并不是說具備這兩個(gè)特性就一定能開發(fā)出一款火爆的游戲,并且新的爆款游戲也不一定符合這些特點(diǎn),僅供參考。
今天介紹的內(nèi)容更傾向于技術(shù)方面,所以“火爆”就從標(biāo)題里面去掉了,并且也不會(huì)介紹具體的游戲邏輯如何開發(fā),而是更偏向于如何利用好微信的開放能力開發(fā)一款小游戲。
什么是“小游戲”?小游戲是什么?
首先為大家介紹一下小游戲是什么。從普通用戶的視角看,小游戲是小程序的一個(gè)子類目,可在微信內(nèi)被便捷的獲取和傳播,即點(diǎn)即玩,具備出色的用戶體驗(yàn)。小游戲是小程序,普通用戶分不清也無需分清。
小游戲Runtime
如果放大小游戲的Runtime可以看到很多的細(xì)節(jié),這是一個(gè)典型的分層架構(gòu):
最上層藍(lán)色部分,是游戲代碼,分為游戲邏輯,游戲引擎、weapp-adapter三部分。大部分游戲開發(fā)會(huì)用到一些引擎的工具、工作流,以及利用引擎封裝的高層API去實(shí)現(xiàn)游戲邏輯。其次是weapp-adapter,因?yàn)樾∮螒虻牡讓右环矫娌皇莣ebview,可以簡單看成是webview經(jīng)過精簡、優(yōu)化過后的平臺(tái);另一方面核心能力的實(shí)現(xiàn)上卻參考了webview。所以這里如果有一個(gè)適配器,把小游戲的底層API——wx API適配到一個(gè)接近webview的接口,對上層引擎、已存在的游戲接入微信小游戲平臺(tái)則會(huì)更加容易,這個(gè)就是weapp-adapter的作用。其中只有游戲邏輯是必要的。
可以看到,在架構(gòu)上小游戲和小程序是有差別的,小游戲沒有頁面概念的,wxss/wxml不再存在。其次,底層實(shí)現(xiàn)也不是webview,小游戲和webview的關(guān)系只能說是渲染相關(guān)的核心能力可以通過weapp-adapter的簡單適配保持接口一致,但同時(shí)很多webview上存在的功能并沒有對等的實(shí)現(xiàn),比如小游戲就沒有DOM/BOM的概念,也沒有全局的document/window對象。
小游戲的入口為game js文件,語言為Javascript,但有一些限制,比如禁止執(zhí)行動(dòng)態(tài)代碼,因此eval、new Function等能力是不支持的。配置為game.json,可以配置橫豎屏、接口超時(shí)等參數(shù)。js里面可以組合wx API的能力來實(shí)現(xiàn)游戲邏輯, 非代碼類的資源應(yīng)該盡量放到cdn,減少整個(gè)代碼包打包后的大小,以加快用戶首次進(jìn)入時(shí)的速度,微信對首包的大小目前限制為4MB。
Webview Adapter
下面來說一下Webview Adapter,它的初衷是為了讓游戲開發(fā)者更好地熟悉我們的平臺(tái),所以我們的平臺(tái)在能力上會(huì)盡可能地與webview做一些適配,其實(shí)這個(gè)適配也是很簡單的一層。比如說我們在瀏覽器里面使用image對象創(chuàng)建一個(gè)圖片,而在小游戲里是通過wx.createimage來創(chuàng)建的,在代碼中需要做一個(gè)簡單的適配。
以此類推,常見的Canvas、document對象都是在Adapter中通過一個(gè)簡單的適配實(shí)現(xiàn)的,大家可以研究鏈接中的代碼。之后官方不會(huì)繼續(xù)維護(hù)這個(gè)Adapter,我們會(huì)更專注于底層能力的建設(shè)。
小游戲能力概覽
下圖是小游戲能力的概覽,小游戲能力的迭代比較快,部分能力還沒有來得及羅列出來。比如最近剛發(fā)布的游戲圈、健康系統(tǒng)防沉迷相關(guān)的一些接口。
我們先看一下基礎(chǔ)能力,在渲染這部分WebGL1.0和Canvas 2D都是支持的,這里的Canvas更接近于瀏覽器里面的標(biāo)準(zhǔn)。同時(shí),這里提到的可控幀率的概念,如果小游戲在后臺(tái)運(yùn)行的話,可以盡量將幀率降低。
在多媒體部分,小游戲還不能像小程序一樣實(shí)現(xiàn)實(shí)時(shí)的音頻視頻流,這是我們在后續(xù)要進(jìn)一步支持的。網(wǎng)絡(luò)IO的部分與小程序也是類似的,我們也提供了一些UI的組件,比如說拉起鍵盤,模態(tài)對話框等。
小游戲的社交開放能力現(xiàn)在已經(jīng)對外了。其中最重要的一個(gè)能力是在開放域?qū)⑽⑿诺暮糜殃P(guān)系開放出去,給開發(fā)者使用,考慮到對用戶隱私的保護(hù)會(huì)有一些設(shè)計(jì)上的限制。
因?yàn)樾∮螒蛉ブ行幕奶攸c(diǎn),分享這一部分也是非常重要的,開發(fā)者要考慮如何將這個(gè)能力利用起來。在代碼方面,因?yàn)槭装拗剖?MB,但部分小游戲的代碼量可能比較大。我們最近也在規(guī)劃一個(gè)分包的能力,允許異步加載代碼并執(zhí)行,但這個(gè)代碼是一定要經(jīng)過我們審核的。
如何開發(fā)一款小游戲?
那么如何開發(fā)一款小游戲?因?yàn)槲冶救艘仓皇情_發(fā)過一些簡單的游戲,并不是專業(yè)進(jìn)行游戲開發(fā),所以接下來我會(huì)更多地介紹一下如何利用微信的能力來開發(fā)小游戲。
選擇小游戲引擎
微信跟引擎商也有比較密切的合作,一般現(xiàn)在的游戲引擎都會(huì)支持發(fā)布到多個(gè)平臺(tái),對微信小游戲這個(gè)新平臺(tái)而言,已經(jīng)有一部分引擎做了適配,比如Cocos Creator、Egret Engine以及LayAir Engine。適配的主要工作,類似之前提到的weapp-adapter,把wx API的能力,和引擎銜接起來。
比如引擎一般會(huì)把小游戲平臺(tái)和webview平臺(tái)對標(biāo),適配過程就是把wx API對應(yīng)到webview的能力,同時(shí)把只存在于webview能力的依賴去除,比如不再依賴BOM、DOM。已適配的引擎都有相應(yīng)的文章介紹如何把游戲發(fā)布到微信小游戲平臺(tái)。
設(shè)備/環(huán)境適配
小游戲會(huì)有API提供獲取屏幕的寬高、設(shè)備像素比等能力。小游戲開發(fā)完成后,在開發(fā)者工具也可以發(fā)起真機(jī)測試的請求,微信提供了不同設(shè)備的測試集群,幫助開發(fā)者提前去發(fā)現(xiàn)問題。基礎(chǔ)庫提供的wx API本身是一個(gè)不斷迭代更新的過程,對于使用了新能力的小游戲,需要做低版本兼容。
微信登錄
小游戲的登錄過程,跟小程序是類似的。需要用戶自己去定義登錄狀態(tài)。appsecret/session_key代表的是小游戲開發(fā)者和微信平臺(tái)之間的一種信任約定,比如支付、上報(bào)托管數(shù)據(jù),平臺(tái)方需要驗(yàn)證access_token(只有appsecret才能換得到),和用戶相關(guān)的還要驗(yàn)證session_key的簽名,才能保證請求來自于小游戲開發(fā)者/用戶,而不是惡意的第三方和隨意捏造的用戶。
access_token是一種應(yīng)用態(tài)的access_token,和用戶無關(guān),需要保證全局維護(hù)一份,應(yīng)該有一個(gè)中控的模塊去保證access_token有效,同時(shí)在有效期內(nèi)直接使用本地cache的access_token,而不是每次使用都去生成新的access_token,否則可能遇到調(diào)用頻率限制的錯(cuò)誤而影響服務(wù)。切記appsecret/session_key不要放到前端代碼中去,否則可能會(huì)被壞人利用損壞小游戲開發(fā)者/用戶的權(quán)益。
緩存
緩存類型包括數(shù)據(jù)緩存和文件緩存兩類。數(shù)據(jù)緩存即key-value存儲(chǔ),適合結(jié)構(gòu)化類型的小數(shù)據(jù)存儲(chǔ),上限為10MB。文件緩存提供了一個(gè)完整的文件系統(tǒng)API,包括目錄/文件的增刪改讀,適合針對經(jīng)常使用的網(wǎng)絡(luò)資源做本地緩存,上限是50MB。
和瀏覽器不同的是,微信只提供了基本的存儲(chǔ)管理能力,并不對存儲(chǔ)什么,和存儲(chǔ)滿時(shí)刪除什么做一些操作。開發(fā)者自行靈活定義緩存以及淘汰策略,比如對經(jīng)常訪問的資源存儲(chǔ)到文件系統(tǒng)以及在文件存儲(chǔ)滿時(shí),清理一些最近不常訪問的文件。
開放數(shù)據(jù)域
開放數(shù)據(jù)域是一個(gè)封閉、獨(dú)立的 JavaScript 作用域,和執(zhí)行游戲邏輯的環(huán)境——稱為“主域”隔離。其目的是在保證用戶隱私的前提下開放用戶數(shù)據(jù)給第三方,提升小游戲的整體用戶體驗(yàn)。以下為物理視圖,主域的入口為game.js,開放數(shù)據(jù)域則是一個(gè)獨(dú)立的目錄,其入口文件為index.js。
主域和開放數(shù)據(jù)域的通信受到嚴(yán)格的管制,基本原則是只進(jìn)不“出”。
?只進(jìn):允許外部的數(shù)據(jù)進(jìn)入開放數(shù)據(jù)域,即主域可以隨時(shí)postMessage到開放域,以及開放域引用主域準(zhǔn)備好的本地資源
?不“出”:不允許開放數(shù)據(jù)域的數(shù)據(jù)被上傳到第三方服務(wù)器去。因?yàn)殚_放數(shù)據(jù)域里面,index.js是可以直接訪問到用戶敏感數(shù)據(jù)的,比如同玩好友數(shù)據(jù)。當(dāng)然最終開放數(shù)據(jù)域需要index.js在綜合各種數(shù)據(jù)后把數(shù)據(jù)以圖形圖像的方式渲染到sharedCanvas上,在主語sharedCanvas允許draw到主域的上屏Canvas上,最終用戶會(huì)在顯示屏上看到game.js畫出來的好友排行榜、群排行榜或好友超越等社交互動(dòng)信息。
在開發(fā)數(shù)據(jù)域中的數(shù)據(jù),開發(fā)者沒法把數(shù)據(jù)拿出去和游戲數(shù)據(jù)做關(guān)聯(lián),所以如果需要在開放域下展示的游戲數(shù)據(jù),比如分?jǐn)?shù),開發(fā)者需要將該數(shù)據(jù)通過上報(bào)接口把游戲數(shù)據(jù)托管到平臺(tái)。這樣就可以在開發(fā)數(shù)據(jù)域里面就取到相關(guān)數(shù)據(jù),其應(yīng)用場景有好友排行、群排行榜、超越好友提示等。
分享
包括自定義分享和系統(tǒng)菜單分享,可以分享到群聊、單聊。也可以把分享上下文與特定的群關(guān)聯(lián),實(shí)現(xiàn)一些群PK、群排行榜的場景。分享是一把雙刃劍,需要謹(jǐn)慎使用,一方面避免過度騷擾用戶/群聊,另一方面增強(qiáng)社交互動(dòng)提供好的游戲體驗(yàn),需要找到一個(gè)合適的平衡點(diǎn)。
支付
小游戲在安卓下支持虛擬支付,它的方式目前只有一種:即貨幣托管的方式。主要分為2個(gè)流程:
1.充值:RMB -> 游戲幣,這里開發(fā)者只需要拉起支付的流程,平臺(tái)負(fù)責(zé)把用戶RMB兌換成對應(yīng)的游戲幣,存儲(chǔ)到用戶對應(yīng)的游戲帳號(hào)上
2.使用游戲幣購買道具:開發(fā)者可以扣除對應(yīng)的游戲幣,給用戶發(fā)放游戲內(nèi)道具,扣除游戲幣的過程需要有一定的事務(wù)機(jī)制,去保證在網(wǎng)絡(luò)異常的情況下交易正常。扣除游戲幣的接口支持根據(jù)訂單id去重,意味著網(wǎng)絡(luò)超時(shí)等情況下,開發(fā)者可用同樣的訂單id去重試扣除,直至返回明確的響應(yīng)。
以下為簡單時(shí)序圖,部分角色針對開發(fā)者無需關(guān)心的部分做了相應(yīng)簡化處理:
性能
小游戲常見的性能問題,一般是內(nèi)存造成的。如果內(nèi)存占用太多會(huì)被微信客戶端主動(dòng)關(guān)閉,因此開發(fā)者在用戶游戲過程中要及時(shí)釋放不再使用的內(nèi)存(js代碼去除引用,或主動(dòng)調(diào)用對應(yīng)資源的釋放接口,如果有的話),特別是Canvas和Image類大型對象,同時(shí)可以主動(dòng)調(diào)用wx.triggerGC觸發(fā)底層回收對應(yīng)資源。
對于和游戲邏輯相對獨(dú)立的工作,可以考慮在worker中去實(shí)現(xiàn),小游戲提供了獨(dú)立的worker線程執(zhí)行js邏輯的能力。
版本更新機(jī)制
小游戲啟動(dòng)的過程分為冷啟動(dòng)和熱啟動(dòng)。冷啟動(dòng)是指內(nèi)存中無該小游戲的運(yùn)行實(shí)例的情況下,啟動(dòng)小游戲的過程;熱啟動(dòng)是指小游戲的運(yùn)行實(shí)例在內(nèi)存中還存在,只是暫時(shí)切換到了后臺(tái),這時(shí)用戶再次觸發(fā)小游戲回到前臺(tái)的過程。
小游戲會(huì)在冷啟動(dòng)時(shí)檢查小游戲的版本,如有新版本,在下載回本地后,下一次冷啟動(dòng)即可使用最新版。當(dāng)然,我們也提供了API可以供開發(fā)者決策在有版本可用時(shí),是否需要強(qiáng)制更新。
運(yùn)維
特別提醒,小游戲有完善的后端監(jiān)控,可以通過“運(yùn)維中心”開啟,比如腳本錯(cuò)誤監(jiān)控。腳本錯(cuò)誤主要由運(yùn)行過程中未捕獲的異常觸發(fā),需要重點(diǎn)關(guān)注。該類異常,可能會(huì)導(dǎo)致用戶小游戲前端的js邏輯暫停執(zhí)行。
同時(shí),平臺(tái)也提供了完善的數(shù)據(jù)分析服務(wù),可以通過“小游戲數(shù)據(jù)助手”進(jìn)行數(shù)據(jù)分析。
如何開發(fā)自己的游戲創(chuàng)意呢?
要像有創(chuàng)意,你首先就得對游戲這個(gè)詞有了解,需要玩不少的游戲看看是那些游戲是很多人喜歡玩的,那些事玩家不喜歡的,這樣玩的多了大致都能知道了,建議去玩玩《龍門神途》這個(gè)做的就挺不錯(cuò)的,很多人玩?zhèn)€人也在這里玩。
怎么開發(fā)一款自己的游戲?
第一步:程序
為什么要把程序放在第一位呢?因?yàn)槲易约壕褪莻€(gè)程序員(大笑)。
早期開發(fā)游戲大部分只用一種語言,大家或多或少的聽說過。那就是C++。包括咱們國內(nèi)早期開發(fā)游戲最常用的一款游戲引擎叫cocos2d也支持C++語言。那就是下面這款引擎。當(dāng)然現(xiàn)在已經(jīng)沒什么人用了。回到主題,為什么說程序在一個(gè)游戲當(dāng)中非常重要呢?因?yàn)闆]有程序你就不可能做出一款完整的能上平臺(tái)供大家下載玩耍的游戲。如果只是一個(gè)Demo,那無所謂,Unity3D就能拼接一個(gè)游戲。虛幻引擎的藍(lán)圖在這方面支持的更好。但是請注意,我說的是一個(gè)完整的。如果游戲想上線平臺(tái),那不可避免的需要對接各個(gè)應(yīng)用市場。對接SDK產(chǎn)生的問題將多如牛毛。如果沒有一個(gè)有經(jīng)驗(yàn)的程序員,這步就卡死了。
如果你是一個(gè)有經(jīng)驗(yàn)的程序員,上一步的問題解決完畢了。那你就該考慮一個(gè)新的問題了。
第二步:美工!
這里所說的美工只是單純的建模和做動(dòng)畫的,不涉及UI部分。
如果你是想做一個(gè)畫面非常好的游戲,那美工起到的作用將非常的巨大!
我給大家簡單講一下流程,首先呢,你在3DMAX或者M(jìn)AYA當(dāng)中建模,然后你可能需要把模型導(dǎo)入到Zbrush當(dāng)中雕刻一下,然后你需要在PS當(dāng)中繪制模型的貼圖。然后在Maya當(dāng)中綁定骨骼,下一步就是做模型動(dòng)畫了。然后導(dǎo)出到游戲引擎當(dāng)中進(jìn)行使用。是不是很繁瑣?在一個(gè)大型游戲公司會(huì)有專門的人負(fù)責(zé)每一項(xiàng)步驟的。如果你想自己精通每一個(gè)步驟,那我勸你還是好好寫代碼吧。
如果上面兩個(gè)步驟都解決了,是不是就沒有問題了呢?
那我還得不幸的告訴你,那是不可能的。
第三步:UI
還有一個(gè)至關(guān)重要的東西沒有解決,那就是UI。什么是UI呢,就是游戲當(dāng)中的各個(gè)界面。比如說你進(jìn)入一個(gè)游戲,得有注冊,開始游戲,結(jié)束游戲,血條背包,技能等等東西吧。這些統(tǒng)稱為UI。它們其實(shí)都是一張張圖片。非常的雜而且多。需要專門的人去做這些圖標(biāo)。
那如果上面三步你都解決了。那我不能不去感嘆造物主的神奇。你真是一個(gè)全才!不過還有問題沒有解決。
第四步:聲音
聲音這個(gè)問題應(yīng)該是游戲開發(fā)環(huán)節(jié)當(dāng)中最好解決的一個(gè)問題。游戲引擎一般也都自帶了一些音效。但是如果你想開發(fā)類似于鋼琴塊這種游戲。那你還是老老實(shí)實(shí)的去學(xué)一些聲音的軟件吧。
怎樣自己制作單機(jī)游戲?
想要制作小游戲,你必須懂得一門編程語言,建議學(xué)習(xí)C語言程序設(shè)計(jì).
C語言是一種計(jì)算機(jī)程序設(shè)計(jì)語言。它既有高級(jí)語言的特點(diǎn),又具有匯編語言的特點(diǎn)。它可以作為系統(tǒng)設(shè)計(jì)語言,編寫工作系統(tǒng)應(yīng)用程序,也可以作為應(yīng)用程序設(shè)計(jì)語言,編寫不依賴計(jì)算機(jī)硬件的應(yīng)用程序。因此,它的應(yīng)用范圍廣泛。
C語言功能齊全C語言具有各種各樣的數(shù)據(jù)類型,并引入了指針概念,可使程序效率更高。另外C語言也具有強(qiáng)大的圖形功能,支持多種顯示器和驅(qū)動(dòng)器。而且計(jì)算功能、邏輯判斷功能也比較強(qiáng)大,可以實(shí)現(xiàn)決策目的編游戲,編3D游戲,做數(shù)據(jù)庫,做聯(lián)眾世界,做聊天室,做PHOTOSHOP做FLASH,做3DMAX.
自己買教材學(xué)吧,難易看個(gè)人領(lǐng)悟能力
沒學(xué)習(xí)過編程怎么制作游戲?
那肯定是先學(xué)習(xí)java基礎(chǔ),如果是想向手機(jī)游戲方向發(fā)展,那就是要重點(diǎn)學(xué)好java基礎(chǔ)語法,還有線程要重點(diǎn)好好學(xué),異常,IO,什么的都要學(xué)習(xí)到,其實(shí)只要你把java的基本思想搞明白,能夠獨(dú)立寫一些類似計(jì)算器這樣的小程序(一定是獨(dú)立完成,思維邏輯清晰的寫完)的話就可以來研究手機(jī)游戲了
手機(jī)游戲開發(fā)其實(shí)是j2me,是java語言的一個(gè)發(fā)展方向,用j2me就可以制作手機(jī)游戲以及軟件,對于自學(xué)的話我個(gè)人推薦《java me 使用詳解——用eclipse進(jìn)行移動(dòng)開發(fā)》這本書,講解很詳細(xì),適合入門學(xué)習(xí),從高級(jí)用戶界面開始學(xué)習(xí),然后低級(jí)用戶界面,用戶存儲(chǔ),游戲開發(fā),這樣的一個(gè)學(xué)習(xí)過程,但是說實(shí)話,你如果是自學(xué)的話入門可以,但是如果想編一個(gè)像樣的游戲的話那估計(jì)難度有點(diǎn)大,因?yàn)樵谑謾C(jī)游戲開發(fā)過程中很多東西都是經(jīng)驗(yàn),很多人說j2me簡單,其實(shí)說實(shí)話,是簡單,不就是那11個(gè)包里的那幾個(gè)類的調(diào)用嗎?但是用這些類里的方法什么的結(jié)合起來編寫一個(gè)游戲,那就不簡單了,這時(shí)候就需要一個(gè)老師或者有經(jīng)驗(yàn)的人給你指點(diǎn)一下了,就是這樣。
手機(jī)游戲開發(fā)(也就是j2me)其實(shí)不難,技術(shù)性的東西不難,難就難在邏輯思考,重在算法的編寫,游戲中間需要許多的NPC,這些NPC的活動(dòng)都是需要你編寫很多的代碼來實(shí)現(xiàn)人工智能的,所以,加油!祝你成功!