Web前端可以轉行做游戲嗎?

来源:https://www.cnblogs.com/manfredHu/archive/2018/03/15/8571277.html
-Advertisement-
Play Games

作者:ManfredHu 鏈接:http://www.manfredhu.com/2018/03/15/31-laya-game-tips/index.html 聲明:版權所有,轉載請保留本段信息,謝謝大家 LayaBox Web前端最近都在跨界!!現在又伸手到游戲領域了。但是真的那麼好跨界嗎?請讓 ...


作者:ManfredHu
鏈接:http://www.manfredhu.com/2018/03/15/31-laya-game-tips/index.html
聲明:版權所有,轉載請保留本段信息,謝謝大家

LayaBoxLayaBox

Web前端最近都在跨界!!現在又伸手到游戲領域了。但是真的那麼好跨界嗎?請讓我一一道來。

Canvas和WebGL的出現其實讓Web游戲有了實現的可能,但是讓我們用ctx一個個畫,效率還是低了點,所以需要游戲引擎。它幫助我們去動態渲染游戲每一幀的元素。

業界比較著名的幾個H5游戲引擎,有Egret(白鷺),Layabox,Three.js,coco2d-js等等,詳情可以看知乎的回答
因為我們團隊不是一開始做游戲的,我們是傳統意義上的前端團隊,從web發家的,起初做的是電商類的業務——拍拍。所以這裡我們綜合幾家游戲引擎,選擇了Layabox。
有如下有點吧:

  1. LayaAir是一個優秀的適用於多端的游戲引擎,配備有豐富的組件,有自己的IDE可以快速構建佈局等,不需要寫類似CSS的代碼
  2. 支持html的頁面渲染,就是說你可以讓游戲引擎跟web頁面,混用(這在一些類似文本的頁面非常有用)
  3. 支持2D、3D甚至VR方面的開發。性能也足夠優秀
  4. 對Web前端普遍的上手難度也較其他引擎框架簡單很多
  5. 不需要寫重構(CSS)代碼

其實我們團隊之前也是做得H5競猜小游戲,不過是基於DOM的,用CSS3做動畫。但是發現CSS3操作複雜動畫,有很多缺點:

  1. 複雜動畫支持度非常差
  2. 頁面元素太多,渲染性能差
  3. 很多複雜的需求做起來很耗時
  4. 玩家手機容易發燙(頁面元素多,動畫複雜)

因此,我們經過預研和討論,果斷走出傳統Web的開發模式,擁抱傳統的游戲開發!!當然這裡肯定不是一帆風順的,從Web前端轉向游戲開發,還是有非常多的坑點的。

首先需要擺脫HTML和CSS,你不是在做頁面,你是在做一個游戲!!游戲的邏輯占據了一個游戲80%的工作量,所以你很多時候是在寫JavaScript代碼,這不是問題,其次,你需要擁有面向對象編程的思想。這可能是很多老前端欠缺的,因為JavaScirpt說到底是一門面向函數、面向過程的語言。大家知道模塊化,但是卻還是習慣寫function而不是ES6的class

這裡因為平臺也在轉型向ES6靠近,所以大膽採用了ES6+Babel+Webpack的模式,甚至於在做Weex、小程式、Web三端融合。即一份代碼,可以在三個平臺跑。扯的有點遠哈,下麵開始正文,我們不說用法,具體是說一些坑點,和優缺點對比。

游戲引擎不適用的地方

游戲引擎這東西在動畫一塊是真心好用,可以高度還原設計師的動畫,可是其沒有網頁的排版佈局,更多的佈局應該是通過x、y、更改pivot、anchor屬性來實現。
CSS可以很快速的通過代碼進行相關佈局(flex、float、position等屬性),網頁那種自上而下的內容排版可以自動適應內容,對文字處理十分便捷。

針對各自的優缺點,從實現的便捷性來說,游戲主場景(動畫極多)的情況下,為了提高用戶的體驗,應該用游戲引擎來寫。
而對一些活動浮層、投註記錄、游戲規則等有大量圖片文本的頁面,應該用傳統的Web網頁來編寫,這樣才是物盡其用的做法。

在這個背景下,游戲開發的前端需要掌握多好幾種技能——簡單的游戲開發的技能、重構部分的構建技能(團隊大前端的趨勢下,去除重構崗位,重構工作由前端接管),可以說工作量翻了一倍。但是在業務側來考慮,因為減少了相關的中間環節,需求迭代可以更快速的落地。

Laya的IDE使用要註意的地方

LayaIDE提供一個組件庫,如list列表,tab按鈕切換等等簡單的Web組件,可以直接拖拽使用而不用自己用代碼再實現一次。
但是IDE自帶的很多組件有坑點,如list組件的selectHandler觸發並不靈敏,數據源重新綁定後會出現點擊無法響應的問題,這個時候要綁定mouseHanlder來代替點擊事件等。
IDE的使用對於不熟悉的人來說上手並不簡單,熟練後可以提高效率。具體可以看官網的介紹

sceneColor並不起作用

這個屬性是IDE的一個配置屬性,在引用的時候並不會起作用。可以理解為是一個IDE的背景色,可以讓你在用IDE編輯的時候看的更清楚。
sceneColor並不起作用sceneColor並不起作用
如果你需要更換背景色,應該通過繪製一個底部的矩形來實現。

1 this.graphics.drawRect(0, 0, this.stage.width, this.stage.height, '#404d6f'); //設置背景顏色

 

var和name

var

一般組件view下不管嵌套的層級多深,只要有一個var屬性的命名,都可以用this.xxx來獲取到這個var屬性得帶組件的引用,並對其進行邏輯操作。

name

而name在特定的組件內name有自己的命名規則,如list下的box,命名為render,可以自動識別該box為list內部渲染節點,設置list的repeat等值,直接簡便的實現某些功能。
再譬如dialog界面,我們設置btn的name為close、yes、no等值,可以直接實現關閉dialog視窗的功能等等。name在這個組件下麵也是唯一的,可以用來區分不同的組件。

top、right對x,y的影響

如果組件設置了top、right等值,在對其進行x,y變化是無效的。
解決方法:IDE通過這些屬性設置好佈局要取消掉,會轉化為對應的x、y值,此時可以操作

圖集圖片過大導致圖片載入失敗

之前按照引擎官方人員的建議設置最大合集圖片為2048乘以2048,後面經過我們的測試發現1024寬高比較適配大部分機型,即圖片最大不能超過1024,否則微信手Q會有圖片load時間過長導致失敗的問題。
這裡可能是部分合併的大圖片下載失敗,也可能是全部下載失敗。然後引擎會單獨去下載每個碎片文件,而伺服器是沒有這些文件的,導致下載全部返回404。應該儘量避免這種情況發生。

顯示區域與點擊區域並不完全相等

用一句話來說就是:你看到的並不一定是真實的。如我要完成收起按鈕,然後隱藏整個浮層。
但是你明明可以看到,綁定的點擊事件卻沒有觸發。
這是因為這個層級的高度或者寬度太小,被遮擋這部分是不會觸發的。但是是可見的

分離代碼和工程

起初是因為不想在LayaIDE下寫代碼,所以分成了兩部分,後面發現這種形式還是非常OK的,因為Laya工作人員不是傳統前端開發,他們的IDE是類似Atom的Electron做的,所以其實運行起來編碼體驗並不是太好。其次是因為IDE會生成圖片(png)和圖集(atlas)文件,這些圖片類的靜態資源,更新頻率還是非常高的。如果你只需要修改代碼,或者只要修改圖片圖集,發佈一次就好了,不需要同時發佈兩種。

這樣的分離,代碼你可以按照你喜歡的方式來寫,比如webpack配置工程,比如文件擺放,該怎麼放怎麼放。再把Laya生成的東西拷貝進來就好了。

設計稿和工程大小

這裡我們設計稿和IDE的寬度高度是完全對應的,所以不存在換算的問題。也不需要類似CSS的做REM相容等等操作。你設定寬度是750,高度會自動拉伸,但是顯示的頁面層級,需要在初始化的時候拉伸一下,不然還是IDE裡面設定的寬高,當然如果你害怕上面提到的點不到,也可以設定一個非常大的值。

Object.assign相容

Object.assign是ECMAScript標準的合併對象屬性的方法,類似有jQuery的extend等等。
如果你拋棄了jQuery和Zepto等懶得寫extend方法,又擁抱了ES6,那你可以像我這樣找polyfill來相容,這裡babel官方有個模塊
也可以自己選擇做相容,在入口開始的時候載入相容文件就好。

抗鋸齒問題

這個問題是在WebGL下(Canvas不會),會出現graphics.drawCircle繪製的圓環有鋸齒問題。如下圖:
鋸齒問題鋸齒問題
左邊為沒有設置抗鋸齒,右邊設置了抗鋸齒。

1 2 Laya.Config.isAntialias=true; //開啟抗鋸齒,會消耗一些性能 Laya.init(Browser.clientWidth, Browser.clientHeight, WebGL);

 

mask遮罩不支持抗鋸齒

有無鋸齒處理的區別有無鋸齒處理的區別
如圖,下邊是沒有優化前的,鋸齒嚴重。上邊那個圖是優化後的,明顯邊框清晰了很多。
這裡之前的思路是矩形頭像和mask遮罩為一個整體在前面,然後內邊框和外邊框層級在後面,但是這樣的話,mask遮罩部分現在laya還不會抗鋸齒,所以這裡對公共頭像組件進行參數擴展,加了zOrder參數。讓邊框蓋在頭像上,就可以達到抗鋸齒的作用。
最後實現的思路如下圖層級所示。
頭像層級頭像層級

Laya幾種優化的寫法

用Laya自帶的屬性獲取像素比

1 2 3 //var browserHeight = document.body.scrollHeight * window.devicePixelRatio; var browserHeight = Laya.Browser.height;//會考慮設備像素比,而且會針對特定機型調整補全 `

這個不用自己算了,Laya.Broswer現在可以獲取得到了。簡化了運算過程

用.super()方法繼承父類

Laya.class定義的時候會在原型定義.super方法,直接用就好。兩種用法等價,但是看起來.super更簡單把?
可能有一些例子是通過xxx._super.call(this)繼承父類的,其實直接xxx.super(this)就好了。_super還是看成私有屬性好了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡要:本系列文章講會對expo進行全面的介紹,本人從2017年6月份接觸expo以來,對expo的研究斷斷續續,一路走來將近10個月,廢話不多說,接下來你看到內容,講全部來與官網 我猜去全部機翻+個人修改補充+demo測試的形式,對expo進行一次大補血!歡迎加入expo興趣學習交流群:597732 ...
  • 在Android開發過程中,遇到需要列表顯示的時候,這時候就會用到listview。 1.首先創建一個ListViewTest項目,選擇empty activity類型。修改activity_main.xml的佈局文件,添加listview控制項,設置寬高和id等屬性 此時通過預覽就可以看見listv ...
  • 入坑iOS開發這麼久,一直都是在模擬器上運行,公司的項目也都有公司的開發者賬號進行真機調試。但是很多時候在網上download一些demo想在真機上運行看一下效果的時候都沒法成行,今天抽空好好研究和學習了一下在最新的xcode9上如何進行無證書真機調試,過程其實很簡單,下麵我們來瞭解一下整個過程。 ...
  • 簡要:本系列文章講會對expo進行全面的介紹,本人從2017年6月份接觸expo以來,對expo的研究斷斷續續,一路走來將近10個月,廢話不多說,接下來你看到內容,講全部來與官網 我猜去全部機翻+個人修改補充+demo測試的形式,對expo進行一次大補血!歡迎加入expo興趣學習交流群:597732 ...
  • 在實際開發過程中經常在按鈕上添加文字和圖片,位置和圖片的位置根據需求放置也是不一樣的。下麵實現了各種顯示方式,如下圖: UIButton+LSAdditions.h UIButton+LSAdditions.m 現在測試代碼如下: ...
  • 崩潰分析方式:命令行解析Crash文件 通過Mac自帶的命令行工具解析Crash文件需要具備三個文件 symbolicatecrash,Xcode自帶的崩潰分析工具,使用這個工具可以更精確的定位崩潰所在的位置,將0x開頭的地址替換為響應的代碼和具體行數。 我們打包時產生的dSYM文件。 崩潰時產生的 ...
  • id類型是一個通用類型,OC使用id表示任意類型的對象,它可以作為一個占位符表示這是一個不確定的類型的對象或者引用。因此,所有的對象都 可以用id來表示。這很有用,想象一下,如果你需要實現一個通用的鏈表類,你可以將鏈表結點中的數據欄位的類型聲明為id類型,那麼你就可以往這個鏈表中存放任意類型的對象了 ...
  • textView用於顯示文本,大量文字顯示在一起顯得過於緊湊。可通過在佈局中更改TextView屬性設置行間距。 1、android:lineSpacingMultiplier="1.5" 表示1.5倍行距 2、android:lineSpacingExtra="3dp" 表示行間距離為3dp 有時 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...