您現在的位置是:首頁 > 遊戲

Scratch第三十八講:英雄難過棍子關

由 文胖仔 發表于 遊戲2021-11-29
簡介CC哥一開始想的就是看棍子有沒有碰到下一個柱子的時候有一個問題,因為棍子本身就在一個柱子的克隆體上,所以用檢測命令沒法檢測,因為這個命令是把克隆體和本體當成一樣來處理的

如何用木棒搭橋

最近一直再想做一個小遊戲,但是做好了不知道叫什麼名字,在網上查了才知道叫“英雄難過棍子關”

,不知道對不對,先這麼叫著吧。大家反正一看就知道了。

題外話

這個遊戲,CC哥當時在手機上玩的不亦樂乎,最近在想做什麼題材時,就一直想做一個玩玩。以前我就說過,Scratch就是一個最好的思維訓練工具,不僅僅是程式設計思維,更是想象力,創造性,嚴謹,細心,專注的一種鍛鍊。所以CC哥的教學不像其他教學,就是帶著大家一起去嘗試,去思考,就算程式最後不漂亮,不夠嚴謹,或者編的不夠好,都不重要,重要的是,我們在享受這個學習的過程,不僅僅是學生們,CC哥跟著大家一起在學習,一起享受學習的快樂。

影片載入中。。。

設計思路

1:會變長的棍子

做這個程式,CC哥第一個在想,這個棍子怎麼能變長呀,關鍵是變長了之後倒下來的時候怎麼能夠自然。在這個部分有兩種做法,一個就是改變角色的大小,這個相對簡單。倒下來的時候只要用旋轉就行了。但是這裡面有個問題,就是棍子在變長的時候會同時變粗。

Scratch第三十八講:英雄難過棍子關

還有一種做法,CC哥也不知道對不對,就是用畫圖來畫一個棍子,但是畫的棍子在倒下來的時候只能用反覆擦掉重新畫,這樣雖然能實現倒下來,但是CC哥試了以後,發現效果不自然,刷屏閃爍的厲害。同時後面做其他處理的時候也會複雜很多。所以這裡CC哥還是用了第一種做法。如果小朋友們嘗試到了更好的做法,一定告訴CC哥,我會單獨幫你發個帖子。

Scratch第三十八講:英雄難過棍子關

2:每一步出現下一個柱子。

這個比較簡單,只要用克隆就好了。每走一步克隆一個。但是在這裡,CC哥遇到了一個坑,研究了半天,才發現了之前忽略掉的一個小知識,就是訊息和克隆體的關係,一會給大家詳細介紹。

3:棍子不夠長掉下來,或者棍子太長超過了下一個柱子。

這個就是要解決位置的關係,要確認棍子的長度,棍子頭的位置要保證在下一個橋墩上,不能短,也不能超過。

開始程式設計

程式設計的幾個關鍵點想明白了,就開始動手吧,在程式設計的過程中在看會遇到什麼問題。

Scratch第三十八講:英雄難過棍子關

先弄了幾個角色,為什麼有兩根柱子,一會CC哥在講。先看棍子這個角色。

Scratch第三十八講:英雄難過棍子關

注意到沒有,棍子其實就是一根線,注意關鍵點是這個線的起點在圓心的位置,為什麼這樣呢?大家想一下,棍子一會從直立倒下來的時候是不是圍繞著棍子的一頭在旋轉?所以我們一定要把棍子的一頭放在中心點上。

柱子和小貓這個角色CC哥就不再介紹了,本來想做個火柴人呢,CC哥一直想做個火柴人的小遊戲,不過還沒想好到底做成什麼樣子,等下次好好研究一下再說。

Scratch第三十八講:英雄難過棍子關

我們再重新捋一下程式的流程:

第一步:小貓和棍子都在第一個柱子上。同時出現了下一個柱子。

小貓這部分的程式是:

Scratch第三十八講:英雄難過棍子關

棍子這部分的程式是:

這部分核心是棍子到初始位置,然後棍子朝上,這個好理解。那這些變數的都是為了後面程式定義的初始化。‘棍子長度‘好理解,長度30。我們需要這個變數是因為我們一會需要知道棍子的長短,確保能算出棍子是否能夠搭到下一個柱子上。

“新柱子”這個變數和“開始新搭橋”這兩個變數,都是一種描述狀態的變數,也就是後面程式設計的時候會用這兩個變數的數值,來判斷程式中的一種狀態。可以是角色的狀態,也可以是一個過程的狀態。這部分一會在程式裡專門講這兩個變數的用途。

Scratch第三十八講:英雄難過棍子關

柱子這部分的程式是:

這部分程式是個主要程式,其中最關鍵的就是柱子先克隆自己然後走到下一個隨機的位置。那麼什麼時候克隆自己呢?也就是小貓走到每走到下一個柱子的時候克隆自己。在這裡第一個坑就出現了。

Scratch第三十八講:英雄難過棍子關

Scratch第三十八講:英雄難過棍子關

CC哥一開始的時候想的很簡單,什麼時候克隆,當然是小貓走到下一個柱子的時候,釋出一條訊息,柱子收到訊息的時候克隆自己就行了。結果不論怎麼做,程式都怪怪的,總是克隆出不止一個柱子。研究了半天CC哥才意識到一個關鍵問題!當用訊息來同步的時候,那不止柱子的本體收到了訊息,所有的克隆體也會收到同樣的訊息,做同樣的操作!而CC哥只想每次克隆柱子的本體就好。發現了這個坑,下面就簡單了,CC哥沒有在用訊息來進行過程控制,而用了一個新柱子的變數來控制過程,當新柱子這個變數等於1的時候就執行克隆操作。如果等於0的時候就不執行。大家知道新柱子這個變數的用途了吧?是不是又get了一個小技巧?用狀態變數來做程序的管理?

程式的邏輯就是,當需要在新位置出現新的柱子是,先在原來的位置上克隆自己,然後本體移到下一個隨機的距離。(新位置這個變數是記錄下來新柱子和之前柱子之間的距離)如果發現新的位置已經超過邊界了,那麼就讓螢幕上所有的東西都往左移動(釋出全體後退訊息)。也就是之前說過的滾屏了。(注意在一個新柱子生成結束之後,要把狀態變數復位。也就是把新柱子這個變數歸零。)滾屏操作一定要算好位置,這個一會在程式裡面再看細節。

Scratch第三十八講:英雄難過棍子關

第二步:就是開始用棍子搭橋了。

有點長,為了方便大家看清楚,CC哥截成了兩張圖。

思路就是按下空格鍵的時候,棍子就變長,然後鬆開,棍子就倒下來。

Scratch第三十八講:英雄難過棍子關

在棍子變長這裡面有一個小坑。本來CC哥就是簡單的判斷是否按下了空格鍵,用了一個偵測命令。在執行的時候,發現,如果在棍子倒下來的過程中,又按了空格鍵,那這部分程式又被啟動了。

Scratch第三十八講:英雄難過棍子關

所以CC哥在這裡又加了一個狀態變數。《開始搭新橋》,一旦開啟這個過程,就把這個變數變成1,那麼在啟動過程的時候,我們不僅判斷是否按下了空格,同時判斷這個變數的值,如果不等於0,說明一個過程還沒結束,所以不能啟動這個過程。大家明白了沒?

棍子長度我們要計算,因為要判斷是否能夠搭到下一個柱子上。長度的演算法就是看這個棍子放大了多少倍,然後乘以原始的長度。

倒下來的過程,就是右轉90度。

下面一個關鍵點是確定棍子有沒有碰到下一個柱子,又有一個技巧點了,這個CC哥是不是處理的最好也不知道,可能大家有更好的處理方法啦。CC哥一開始想的就是看棍子有沒有碰到下一個柱子的時候有一個問題,因為棍子本身就在一個柱子的克隆體上,所以用檢測命令沒法檢測,因為這個命令是把克隆體和本體當成一樣來處理的。所以沒法直接用這個偵測命令。

Scratch第三十八講:英雄難過棍子關

那怎麼辦,CC哥直接用了之前常用的辦法,又複製了一個角色,然後把它變成透明,這樣就可以用偵測命令了。等編完遊戲的時候,我發現可以直接用棍子的長度來計算是否能到達下一個柱子了。

Scratch第三十八講:英雄難過棍子關

,不過這裡CC哥就不改了。就當重新溫習一下技巧了。

Scratch第三十八講:英雄難過棍子關

如果棍子正好放到下一個柱子上,那麼就通知小貓可以移動了。同時記得把棍子的長度變數復原。如果棍子長度超過了下一個柱子的邊緣,就直接結束遊戲了。

Scratch第三十八講:英雄難過棍子關

Scratch第三十八講:英雄難過棍子關

上面這塊程式是如果棍子不夠長,那麼就做了一段棍子掉落的效果,這部分比較簡單,大家自己看吧。在整個過程執行完之後,要記得把開始新搭橋的變數復位,這樣空格鍵就又可以使用了。

第三步:小貓移動到新的柱子上,開始下一個迴圈。

小貓的程式:

移動到下一個柱子上,同時將新柱子的變數設為1。這個變數的改變會導致立即產生一個新的柱子。參考上面柱子的程式。

Scratch第三十八講:英雄難過棍子關

棍子的程式:復位準備下一輪。

Scratch第三十八講:英雄難過棍子關

全體後退的執行:

這個單獨說一下,其實就是橫向滾動螢幕操作。要算好位置。很簡單,就是新的位置往左走480步。

小貓的後退:

Scratch第三十八講:英雄難過棍子關

棍子的後退:

Scratch第三十八講:英雄難過棍子關

柱子的後退:

柱子的後退包括兩部分,除了往後移動外,還要碰到邊緣的時候刪除克隆體。(在這裡大家就發現一旦接到後退的訊息,所有的克隆體都會同時移動的)

Scratch第三十八講:英雄難過棍子關

Scratch第三十八講:英雄難過棍子關

關於虛擬柱子的程式,其實就是為了偵測方便,就不再講了。

Scratch第三十八講:英雄難過棍子關

Scratch第三十八講:英雄難過棍子關

推薦文章