App Inventor學習記錄48-2,自製小遊戲-5,飛機射擊遊戲(二)

接著上一篇飛機射擊遊戲(一)的主結構,這裡繼續往下走,只是原本子彈發射的方式不理想,整個改寫過……可以說是除了主要的圖片外,其它的部份大約有 9成都改了……直接看這一篇,也是可以的。

記錄一下:
App Inventor學習記錄48-2,自製小遊戲-5,飛機射擊遊戲(二)


首先畫面編排的部份,更新如下:

新增了一個火球,其它的部份沒有變更。


整個程式碼的部份如下:

除了第 1加入了隕石的位置調整的代碼,和第 2部份沒有變動之外,其它都改了……
在寫的時候,就有點後悔為什麼要寫這篇……
倒不是累,而是怕我有的地方講不清楚。


第 1部份的程式碼說明:

子彈位置已經介紹過的部份,請見飛機射擊遊戲(一),這裡就補充新增的部份。
在程式初始化的時候,把隕石的位置給定一下。
把隕石的 X座標,設定為 1到畫布寬度減掉隕石圖片寬度再減 1,這個是為了不要讓隕石碰到左右的邊界。
把隕石的 Y座標,設定為 1,是為了不讓隕石碰到上面的邊界。
把隕石的速度,設定為 10。
把隕石的指向,設定為 -90。讓隕石的前進方向是往下的。
把隕石的旋轉,設定為假,讓隕石的不會因為調整指向的關系,而旋轉角度

把未發射子彈清單的內容,設定成子彈清單的內容。
未發射子彈清單這個變數,是為了子彈發射用的,主要的作用就是把子彈碰到物體,或是邊界之後,把子彈的啟用屬性,設定為假。然後再用這個屬性做判斷,看這個子彈是不是重新拿來使用,可以的話,就把它加到未發射子單清單中。


第 2部份的程式碼說明:

向左飛向右發的按鈕,請見上一篇
飛機射擊遊戲(一)


第 3部份的程式碼說明:

建立一個子彈清單的變數,把子彈 1、2、3都加到這個變數中。
建立一個未發紙子彈清單,先代入一個空白清單當預設值。


第 4部份的程式碼說明:

本來用變數決定發射子彈順序的方法不好用,寫到後來整個卡住走不下去。要不就是子彈無法發射,不然就是一次只能發射一個子彈,乾脆用清單的方式做,整個改寫過。

首先加入一個流程判斷:
if not is list empty?判斷未發射子彈清單是不是空的,前面多了一個 not,所以整個的意思是如果未發射子彈清單的內容不是空的的話,再進行下一步。

再來同樣是一個流程判斷:
判定任意圖像精像元件的 y值,是不是大於畫布寬度乘以 0.8的值,如果是的話,再往下走。
那要怎麼決定要判斷的是那一個圖像這裡用的未發射子彈清單的第 1項的圖像精靈來判斷

然後,
未發射子彈清單的第 1項的圖像精靈的啟用,設定為真。
未發射子彈清單的第 1項的圖像精靈的可見性,設定為真。
未發射子彈清單的第 1項的圖像精靈的 x值,設定為飛機的 x值。
未發射子彈清單的第 1項的圖像精靈的 y值,設定為飛機的 y值減 10。
未發射子彈清單的第 1項的圖像精靈的速度,設定 10。

然後,把未發射子彈清單的第 1項,從未發射子彈清單這個清單中刪除掉

也就是說,不管我們未發射子彈清單中,有幾個子彈在,我們都用它的第 1項的子彈來做判斷及移動。然後,這個子彈發射出去之後,就把這個子彈從清單中移除。等下一次按下發射這個按鈕的時候,再同樣用未發射子彈清單中的第 1項的子彈下去做判斷。

假設,原本我們的清單內容是這樣:
子彈 3、子彈1、子彈2。
未發射子彈清單中第 1項就是子彈 3

當我們按下發射按鈕之後,就會拿子彈 3來做判斷,把它發射出去。然後,把子彈 3從未發射子彈清單中移掉。所以我們未發射子彈清單的內容就會變成:
子彈 1、子彈2。

等下一次再按下發射按鈕的時候,就一樣拿未發射子彈清單第 1項,也就是子彈 1,來做判斷及移動。

這樣就不用管子彈的順序,只要我們有子彈,就可以一直發射。


第 5-1部份的程式說明:

當我們的子彈一直飛飛飛,飛到最上面的邊界的時候,我們要讓它變不見,而且要把它加回到未發射的子彈清單中,這樣就可以重覆的利用這幾個圖像精靈,不斷的發射子彈。

我們有三個子彈要做重覆的事,所以這裡我們先建立一個小程式叫碰到邊界
我們在這個小程式中,加入一個參數叫做那一個子彈碰到邊界
這一個參數,等一下,就可以拿來放子彈 1、子彈 2或是子彈 3,這樣我們就不用重覆的一直寫同樣的東西。

在這個小程式碰到邊界中,我們要做的事情有那些:
把那一個子彈碰到邊界這個圖像精靈的啟用,設定為假。
把那一個子彈碰到邊界這個圖像精靈的可見性,設定為假。
把那一個子彈碰到邊界這個圖像精靈的 x值,設定為飛機的 x值。
把那一個子彈碰到邊界這個圖像精靈的 y值,設定為飛機的 y值再減10。

然後,加入一個流程判斷:
如果,那一個子彈碰到邊界,沒有在未發射子彈清單的清單內的話。
就把那一個子彈碰到邊界,加到未發射子彈清單的清單內。


第 5-2部份的程式說明:

當子彈 1到達邊界的時候:
我們呼叫碰到邊界這個小程式,在那一個子彈碰到邊界的參數這裡用子彈 1去代替碰到邊界這個小程式中,那一個子彈碰到邊界的值
也就是說,當子彈 1到達邊界的時候,會進行碰到邊界這個小程式,這個時候我們往上看到程式第 5-1部份,現在的程式中,那一個子彈碰到邊界的值,會全部用子彈 1下去做判斷。

接下來的子彈 2、子彈3的做法就是一樣的。只是要代入的參數值不同。


第 6-1部份的程式碼說明:

子彈會在 2種情形下消失,一個是到邊界,一個是碰撞到隕石這個圖像精靈的時候。
這部份我們就是要來寫碰撞到隕石這個圖像精靈的事件。

由於 3個子彈的寫法都是一樣的。所以我們再新建一個小程式叫碰到物體。碰到物體裡頭,我們加入 2個參數,一個叫那個子彈碰到物體,一個叫碰到什麼物體

加入流程判斷:
如果碰到什麼物體是隕石的話。
把那個子彈碰到物體這個圖像精靈的啟用,設定為假。
把那個子彈碰到物體這個圖像精靈的可見性,設定為假。
把那個子彈碰到物體這個圖像精靈的 x值,設定為飛機的 x值。
把那個子彈碰到物體這個圖像精靈的 y值,設定為飛機的 y值再減10。

然後,加入一個流程判斷:
如果,那個子彈碰到物體,沒有在未發射子彈清單的清單內的話。
就把那個子彈碰到物體,加到未發射子彈清單的清單內。


第 6-2部份的程式碼說明:

當子彈 1碰撞的時候:
我們呼叫碰到物體的小程式。
那個子彈碰到物體的參數值,用子彈 1代入。
碰到什麼物體的參數值,用 other其它精靈代入。

子彈 2、子彈 3的寫法都是一樣的。


第 7-1部份的程式碼說明。

當隕石這個圖像精靈碰撞的時候:
把隕石這個圖像精靈的 x值,設定成 1到畫布寬度減掉隕石圖片寬度再減 1。
把隕石這個圖像精靈的 y值,設定成 1。

補充一下,如果我們沒有用到 other其它精靈的話,就代表當隕石碰到任何的東西的時候,都會移動到我們指定的位置上。這裡其實要加上碰到飛機的事件,這部份下一篇再寫。


第 7-2部份的程式碼說明:

當隕石到達邊界的時候:
如果 edge邊緣數值等於 -1的時候。
把畫布的可見性,設定為假。
……
……
簡單說,就是結束遊戲。


好的,這一篇就先寫到這裡,飛機遊戲的第三部份,再來寫得分,重置遊戲等等的功能。這一篇主要調整了飛彈發射的程式碼,讓我們可以發射 3發的飛彈。主要用到的功能,是清單的使用,以及任意元件的設定方法。

清單和任意元件的使用頻率,之後會越來越高。
清單的功能是躲不掉,是一定要熟用的。可以說是最重要的元件之一

任意元件的我一開始在用的時候,覺得很難用。但後面越用越多,才發現真的好用。只要多用幾次,就會習慣它的寫法,就不會有一開始抓不到頭緒的問題。

這次的 aia檔的下載連結如下:
點我下載 NO_48_2_Fight_Plane_2.aia

參考書籍如下:
手機應用程式設計超簡單 App Inventor 2零基礎入門班
TQC+ 創意App程式設計認證指南
TQC+創意App程式設計認證指南解題秘笈
手機應用程式設計超簡單:App Inventor 2初學特訓班
手機應用程式設計超簡單:App Inventor 2小專題特訓班
手機應用程式設計超簡單:App Inventor 2資料庫專題特訓班

之前介紹過的一些 appinventor的使用記錄,都整理在下面這個頁面上了。
APP INVENTOR學習記錄及資源整理頁面

發表迴響