雲端變數

雲端變數 1-線上遊戲基礎

傑夫老師被點歌了,有學生要聽「雲端變數」,那就來回應一下學生的要求。

要怎麼才能建立雲端變數的資格不多說,官方說法就是你要正式成為 Scratcher,只要多分享專案就能成為 Scratcher,這點並不難。然而要玩別人利用雲端變數做的專案,也要用有 Scratcher 資格的帳號登入才能玩,不然會看到以下的提示。

表示不能使用雲端變數

表示不能使用雲端變數

還有一件事,如果你要玩別人的專案,就必須在「專案頁面」或全螢幕模式下,才會同步更新這個專案的雲端變數,下圖右邊就是在專案頁面中。反過來說,如果玩家(不是這個專案的作者)在「程式頁面」中執行專案,雲端變數是不會同步更新的!原因很簡單,就是不希望玩家利用程式把雲端變數任意 "篡改",嚴重的話造成整個專案毀掉不能執行就慘了!

雲端變數會同步更新

雲端變數會同步更新

從上面的圖就看出來雲端變數的用法,只要有人改變了雲端變數的值,同時在玩這個專案的玩家(們),都會看到雲端變數被更新了。最常見的就是利用雲端變數儲存遊戲的最高分,只要有玩家破紀錄就會立即更新,尤其在多人同時一起玩的狀態,能即時讓玩家知道紀錄被破了,非常刺激。

來寫一個小程式,當角色被點擊時就把雲端變數『Cloud』加 1,再由兩個人同時來執行,結果就像下面這樣。不管貓咪在哪一邊(左邊作者或右邊玩家)被點擊,變數『Cloud』都會被加 1。

簡單的雲端變數測試

簡單的雲端變數測試

而且,所有人都可以查看雲端變數的改變紀錄,如果有使用雲端變數的專案,專案頁面下方就會有這樣的方框。

專案頁面的下方會有這樣的方框

專案頁面的下方會有這樣的方框

點擊「觀看資料」就可看到雲端變數的改變紀錄。

雲端變數改變紀錄

雲端變數改變紀錄

這份紀錄就是上面兩個用戶交互點擊貓咪改變雲端變數過程。

雲端變數就這麼簡單,就是一個儲存在雲端人人都可以看到或更新的變數,一旦被更新了之後就會讓所有同時在執行這個專案的人看到它新的值。但~就這麼簡單嗎?利用雲端變數就可以建立多人線上遊戲了,下一篇傑夫老師再來深入介紹。

雲端變數 2-線上遊戲基礎

上一篇傑夫老師做了基本介紹,這一篇就來看看雲端變數可以怎麼應用。

既然可以及時更新資料,也就是說可以把一方的操作傳到另一方,並在另一方顯示出來。說明白一點,就是在其中一邊控制移動角色,在另一邊這個角色就被遠端操控而移動。

看看下面的例子,P1-X 與 P1-Y 都是雲端變數,分別紀錄著「鼠標的x」與「鼠標的y」,貓咪再一直定位到 P1-X, P1-Y 的位置。這樣能不能達到前面所說的效果呢?

這樣的程式,如果有兩個玩家同時執行,會有問題

這樣的程式,如果有兩個玩家同時執行,會有問題

這不會達到想要的效果,因為有兩個玩家同時點擊綠旗開始執行,兩個玩家同時都在更新 P1-X, P1-Y 這兩個雲端變數,最後這隻貓咪就只會定位在自己滑鼠的位置,忽略來自雲端的更新。

所以,必須分辨誰是主控端、誰是客戶端 (client) ,作法就是要加入一個變數『Player』來分別,程式改成下面這樣。

角色要分辨主客端

角色要分辨主客端

這樣,按下 "1" 鍵的人就可以操控貓咪了。執行結果就像下面這樣。

這樣就能做到遠端操控

這樣就能做到遠端操控

如果再加一個角色,並把程式稍加修改增加 P2-X 與 P2-Y 兩個雲端變數紀錄第二個角色的座標,那麼就可以有兩個玩家同時上線了。

第二個玩家的程式

第二個玩家的程式

下面就是加入第二個角色的執行結果,注意到在點擊綠旗前 P2-X 與 P2-Y 的值已經在改變,表示第二個玩家已經在操控。點擊綠旗後,貓咪跟著滑鼠移動,但另一個角色 Gobo 是被遠端玩家所操弄著的。

多人線上遊戲的雛形

多人線上遊戲的雛形

好了~這就是利用雲端變數做的多人線上遊戲的雛形,說穿了其實沒什麼高深的技巧。

但仔細看前兩張圖,貓咪在客戶端的移動好像有點 lag (延遲)!這能解決嗎?就讓傑夫老師在下一篇再來說明。

雲端變數 3-線上遊戲基礎

前一篇中,利用雲端變數傳送座標的範例中,貓咪在客戶端的移動好像有點 lag (延遲)!傑夫老師就來試著解決。

前一篇用了 P1-X, P1-Y 兩個參數來傳輸一個角色的座標位置,但這兩個變數是"分別"被傳到雲端,造成了遠端的玩家也是在分別收到 P1-X, P1-Y 的狀況下更新貓咪位置,所以仔細看當主控端貓咪斜線移動時,遠端的貓咪走的路徑像是樓梯狀而不是斜線。

遠端的貓咪是走的路徑是樓梯狀不是斜線

遠端的貓咪是走的路徑是樓梯狀不是斜線

解決的方式就是將這兩個變數"同時"上傳到雲端,也就是只利用一個雲端變數。但是雲端變數只能儲存數字,要如何把兩個數字同時放在一個變數中,卻又能再解開來?而且這兩個數字可能有同時為負值的時候,似乎多了一些難度。

解決的方法有很多,傑夫老師先找一個比較數學的方法。

先來分析一下:

X座標值的範圍:-240 到 240 ,有可能是1, 2, 3位數,有時前面會有負號

Y座標值的範圍:-180 到 180 ,也有可能是1, 2, 3位數,有時前面會有負號

如果有辦法固定這兩個座標值的位數也沒有正負,那就可以解決了。

那麼:

把X座標值加上 1240 後,這個值的範圍就在 1000 到 1480 之間

把Y座標值加上 1180 後,這個值的範圍就在 1000 到 1360 之間

這兩個新的值都是四位數,且不會是負的

最後在用字串組合的方式將這兩個數字組合起來,變成一個 8 位數字,再將這個數字存到雲端變數『P1』中。

那怎麼變回剛剛的兩個數字呢?

要取出前面 4 位數,那就求 P1 除以 10000 的整數值(無條件捨去小數)

要取出後面 4 位數,那就求 P1 除以 10000 後的餘數值

最後:

前面的 4 位數減去 1240,就變回了 X 座標值

後面的 4 位數減去 1180,就變回了 Y 座標值

程式就修改如下:

『.P1-X』與『.P1-Y』是兩個區域變數,其實可以不需要

前面運算的程式

前面運算的程式

遠端的貓咪一動起來比之前順多了

遠端的貓咪一動起來比之前順多了

還是會有一些延遲,但比之前順多了,這裡的延遲主要有兩方面:一是因為雲端變數更新的頻率沒有像畫面更新 (30fps) 那麼快,二是因為上傳到雲端還受網路速度的影響。但在 Scratch 中,這樣已經是很好的結果了。

其實,雲端變數還是可以傳文字,但是要經過編解碼,網路上可以找到方法喔,有興趣的人可以自己試試看喔。Bye now~