1. 程式人生 > >如何較為優雅地實現新手引導功能?

如何較為優雅地實現新手引導功能?

早期的專案中曉衡遇到遊戲終於要完成了,辛苦了一陣滿以為可以稍微放鬆一下了,但策劃、運營要求,增加一個他們認為非常“簡單”且重要的功能:新手引導。

回想起當年,接到這個任務時的感覺是手腳冒汗、天暈地暗、日月無光,遊戲程式碼本來就千瘡面孔,邏輯錯綜複雜,根本不知道該怎麼下手?更困難的是,遊戲本身功能和需求還不穩定,老闆隨便一個想法可能就會被改、改、改...,我該怎麼辦?

在這種情艱難的情況下一定要,需要保持冷靜,在痛定思痛之後,我開始了引導功能的開發,在做的過程中不斷積累,編寫了一套配置式、可程式設計的引導框架,然後交給其他開發人員或策劃人員做具體的引導內容,真的是:“殺不死你的會使你更強大”。

實現新手引導的困難

通常實現新手引導的困難在於,它與當前需求、功能密切相關,而且稍有不甚連正常流程都走不通,下面一起看看新手引導到底有那些痛點。

開發中的痛點

  1. 需要在正常流程中插入引導程式碼,干擾流程;
  2. 引導程式碼的增加會影響原有程式碼邏輯,增加維護難和成本;
  3. 介面或需求的變化會導致引導功能大幅修改,甚至重新制作;
  4. 手指提示對應的矩形區定位麻煩,不能簡單使用固定的位置和矩形大小;
  5. 編寫引導的程式碼也很困難,需要策劃—程式之間高度配合。

期望的程式設計體驗

在瞭解到傳統的引導製作過程中的難點與弊端後,一直在思考沒有更好的實現方式,我心中的引導功能的程式設計方式希望有以下幾點:

  1. 引導功能程式碼,不能混入正常遊戲邏輯程式碼中,後患無窮,應儘量分離;(難以忍受優雅的程式碼被無情的打亂,更難忍受糟糕的程式碼被弄的支離破碎)
  2. 介面只發生簡單的UI位移、Size大小、節點層次的調整,不需要修改具引導程式碼;
  3. 定位UI指引矩形區域應儘可能簡單,能自適應不同的螢幕尺寸;
  4. 最好能做到策劃人員都可以來製作部分流程引導;
  5. 在引導需求明確、遊戲功能正常的情況下,製作一個常規的引導步驟應該非常快捷。

下面是我使用Cocos Creator 官方 demo-ui 工程上嵌入的引導案例演示:

demo體驗地址:
http://game.ixuexie.com/godGuide

這裡有一個視訊演示:
https://www.bilibili.com/video/av60001770/

框架要點

演示中的引導操作,是使用下面JSON配置進行控制:

module.exports = {
    name: '進入商店',
    debug: true,
    autorun: true,
    steps: [
        {
            desc: '文字提示',
            command: { cmd: 'text', args: ['歡迎體驗Shawn的新手引導框架', '本案例演示:\n1.文字提示指令\n2.手指定位指令\n3.自動執行引導\n4.點選操作錄影', '首先,請點選首頁按鈕'] },
        },

        {
            desc: '點選主介面主頁按鈕',
            command: { cmd: 'finger', args: 'Home > main_btns > btn_home'},
            delayTime: 0.5,
        },

        {
            desc: '文字提示',
            command: { cmd: 'text', args:  '點選主介面設定按鈕' }
        },

        {
            desc: '點選主介面設定按鈕',
            command: { cmd: 'finger', args: 'Home > main_btns > btn_setting'},
        },

        {
            desc: '文字提示',
            command: { cmd: 'text', args: '點選主介面商店按鈕' }
        },
}

配置中的重點是 steps 陣列專案,其中的 desc 是引導步驟的描述,主要用於除錯,command是引導指令,這裡實現的是一個手指指示指令:finger, 後面的args是指令引數,藉助CSS中的選擇器概念,我這裡簡單實現了一個節點獲取的方法,稱之為:定位器。

定位器

點定位器的概念,其實它非常簡單,如下圖所示:

你可能會想到,引擎提供的 cc.find 就搞定,程式碼如下:

cc.find('Canvas/Home/lower/main_btns/layout/btn_home')

節點路徑字串可以精確定位到 btn_home 節點,但在實際使用中時會感覺很繁瑣:

  1. 字串太長,容易出錯;
  2. 節點名字、層級變化,節點路徑字串就失效了,容易被誤傷。

為了使路徑表達更簡潔可靠,筆者引入了兩個定位符號:

/: 右斜槓,代表1級子節點(與cc.find相同)
>: 大於符號,表示1~n級子節點

可以將上面btn_home節點的定位符改為

godGuide.find('Canvas > btn_home');

如果我們預設從Canvas節點開始檢索,也可以直接寫成下面這樣:

godGuide.find('btn_home');

這樣將從 Canvas 節點一層層開始遍歷,想提高檢索節點的效率可以改為:

godGuide.find('Home > main_btns > btn_home');

如果場景中有同名節點,也可以使用 '>'符號解決,但同一層級不能有同名節點(如果你需要檢查的話)。

自動引導

引導的測試工作效率低下,既然有了可配置的引導,能否讓它自動去執行呢?看下面視訊:

https://v.qq.com/x/page/v3017l51xep.html

曉衡最早只是在瀏覽器上實現了滑鼠的點選模擬,後來擴充套件到了原生App上也可以使用。 自動引導,可以方便對引導流程的測試和驗證。

流程錄製

引導的核心是獲取目標節點,我們是通過手寫節點定位器(一種簡化的節點路徑表達方式)獲取節點。如果實現一個功能,記錄下我們點選的節點路徑,是否可以實現自動生成引導流程呢?然後再讓它自動播放出來?

結語

新手引導框架已經開源,並且支援最新版本的 Cocos Creator 2.2.0 下,Github倉庫地址獻上:
https://github.com/ShawnZhang2015/GodGuide

原創不易,如果覺得有幫助,請點個贊吧!

相關推薦

如何較為優雅實現新手引導功能

早期的專案中曉衡遇到遊戲終於要完成了,辛苦了一陣滿以為可以稍微放鬆一下了,但策劃、運營要求,增加一個他們認為非常“簡單”且重要的功能:新手引導。 回想起當年,接到這個任務時的感覺是手腳冒汗、天暈地暗、日月無光,遊戲程式碼本來就千瘡面孔,邏輯錯綜複雜,根本不知道該怎麼下手?更困難的是,遊戲本身功能和需求還不

優雅實現單例功能

using System; namespace ZkjTools { public class TSingleton<T> where T : class, new() { private static T _instance

Android 如何優雅實現@人功能

最近有個需求:評論@人。網上已經有一些文章分享了類似功能實現邏輯,但是幾乎都是擴充套件EditText類,這種實現方式肯定不能進入我的首發陣容。你以為是因為它不符合面向物件六大原則?錯,只因為它不夠優雅!不夠優雅!不夠優雅! 那麼,只有飲水機程式碼怎麼辦?當然是 read the fuking so

驚了!7 行代碼優雅實現 Excel 文件生成&下載功能

actor ntb tar Coding adf 一個數 bucket merge col 歡迎關註個人微信公眾號: 小哈學Java, 文末分享阿裏 P8 資深架構師吐血總結的 《Java 核心知識整理&面試.pdf》資源鏈接!! 個人網站: https://ww

vue中點擊空白處隱藏彈框(用指令優雅實現

out component 效果 name eight 有變 空白 and 解綁 在寫vue的項目的時候,彈框經常性出現,並要求點擊彈框外面,關閉彈框,那麽如何實現呢?且聽我一一。。。不了,能實現效果就好 <template> <div&g

優雅實現Android主流圖片加載框架封裝,可無侵入切換框架

ror 要去 out drawable 如果 jpg gre cached square 項目開發中,往往會隨著需求的改變而切換到其它圖片加載框架上去。如果最初代碼設計的耦合度太高,那麽恭喜你,成功入坑了。至今無法忘卻整個項目一行行去復制粘貼被支配的恐懼。:) 那麽是否存在

Java多執行緒之使用volatile優雅實現單例

關於volitale關鍵字 volitale即是揮發物,被該關鍵字修飾變數的值發生改變時,會導致該變數的CPU快取失效,必須CPU需要重新去記憶體拉取最新的值。 該關鍵字保證了變數的可見性(用一句術語:對於變數的寫入操作總是happens-before每一個

優雅實現app國際化功能

       最近在做國際化功能,這裡講過程中的技術點記錄一下。               第一。如果切換不同語言之後讀取不同的values語言內容       1.所有的activity中(一般都是baseactivit中),重寫下面的方法/** * 設定修改語

lua版本ClippingNode實現新手引導

1.GameLayer.lua GameLayer = class("GameLayer",function() return cc.Layer:create() end) function GameLayer:create() local view =

假裝優雅實現定時快取裝飾器

參考資料 Python 工匠:使用裝飾器的技巧 一日一技:實現有過期時間的LRU快取 這次的參考資料寫在前面,因為寫得真不錯!開始閱讀本篇分享前,建議先閱讀參考資料,如果還不能實現定時快取裝飾器,再繼續從這裡開始讀。 實現思路 功能拆分: 快取上次函式執行的結果一段時間。 把它封裝成裝飾器。 定時

MQTT是IBM開發的一個即時通訊協議,構建於TCP/IP協議上,是物聯網IoT的訂閱協議,借助消息推送功能,可以更好實現遠程控制

集合 cap 消息處理 簡易 遠程控制 mes ogr 設計思想 成本 最近一直做物聯網方面的開發,以下內容關於使用MQTT過程中遇到問題的記錄以及需要掌握的機制原理,主要講解理論。 背景 MQTT是IBM開發的一個即時通訊協議。MQTT構建於TCP/IP協議上

如何優雅用Redis實現分布式鎖

cal 沒有 cond 發現 指定 finally 描述 sel 現在 https://mp.weixin.qq.com/s?__biz=MzAxNjM2MTk0Ng==&mid=2247484976&idx=2&sn=a0b6771f0b4e471

Android 新手引導半透明蒙層效果實現

效果圖: 其中的文字和我知道啦是ui切得兩張透明圖片 自定義View: package com.cymobi.library.view.widget; import android.app.Activity; import android.content.Conte

【redis】使用redisTemplate優雅操作redis及使用redis實現分散式鎖

前言: 上篇已經介紹了redis及如何安裝和叢集redis,這篇介紹如何通過工具優雅地操作redis. Long Long ago,程式猿們還在通過jedis來操作著redis,那時候的猿類,一個個累的沒日沒夜,重複的造著輪子,忙得沒時間陪家人,終於有一天猿類的春天來了,spring家族的r

新手如何優雅部署第一個以太坊私有鏈?

今天我們先在windows系統上學習入門以太坊。 首先,我們先要下載以太坊錢包,https://ethfans.org/wikis/Home 在這個網站上下載官方錢包映象,這幾個都可以下載下來,他們各有優勢和用處(具體的由於篇幅先不贅述)但今天Ethereum Wallet和Get

如何在優雅Spring 中實現訊息的傳送和消費

本文將對rocktmq-spring-boot的設計實現做一個簡單的介紹,讀者可以通過本文了解將RocketMQ Client端整合為spring-boot-starter框架的開發細節,然後通過一個簡單的示例來一步一步的講解如何使用這個spring-boot-starter工具包來配置,傳送和消費Rocke

如何在優雅Spring 中實現消息的發送和消費

取消 命令行操作 回調方法 模板類 names 消息中間件 throw 出現 其中 本文將對rocktmq-spring-boot的設計實現做一個簡單的介紹,讀者可以通過本文了解將RocketMQ Client端集成為spring-boot-starter框架的開發細節,然

方便快捷實現底部導航欄,包含顯示未讀數、提示小紅點、動畫等功能

輕量級底部導航欄 目前市場上的App,幾乎都有底部頁籤導航欄,所以我們在開發的時候經常需要用到這個,雖然 github 上有不少已經封裝好的底部導航欄的工具,例如 bottombar,alphaIndicator(仿微信滑動漸變底部控制元件)等,但是這些控制元件由於功能太多,而且也沒有給

Android RecyclerView優雅實現列表單選功能

1.前言 1.現在有一個簡單的需求,需要實現列表單選功能,如何實現尼?首先我大概說下我實現的思路,首先在Bean(實體類)裡面宣告一個boolean 值,根據這個boolean值去改變RadioButton的是否選中狀態,同時在Activity或者Fragm

APP中透明新手引導頁面的實現

很多時候剛剛安裝一個新的APP的時候,它都會有一個透明背景的引導。裡面通常會有些指示的標誌告訴使用者某個按鈕是幹嘛的,某個區域是幹嘛的。 實現這樣一個效果可以用以下步驟: 1.要新建一個activit