3.幸運撲克——寫第一個撩妹手機遊戲

這節課我會做一個簡單的手機小遊戲,它的原理和方法都非常簡單,也很好掌握,是對前幾節課的一個鞏固和深入。

本節課需要了解:

定義變數

用代碼修改控制項屬性

布爾值的運算

Initialize的運用

BitmapDrawable

File文件的用法

Rnd方法

Not方法

首先我們要做一定的準備工作,就是把我們小遊戲需要的圖片素材都處理好(PS好尺寸大小)、整理好(給命名)。

然後打開B4A,新建(保存)項目,創建包名。然後把圖片拷貝進項目所在的目錄下的Files文件夾,我所準備的素材如下:

1920x1080背景圖1張——用作遊戲活動界面背景

300x300圖1張——用作app圖標

200x131圖15張——1張牌背,1張作弊牌,13張遊戲用牌(注意牌的命名)

然後我們開始寫代碼。

首先我們要設置,這個遊戲是全屏,並且是橫屏。修改第一段代碼區內容:

其次我們打開Visual Designer,畫出我們需要的控制項。注意在Abstract Designer下方的下拉欄里選擇適合你手機的解析度,比如我的紅米note是1920*1080的,我就選擇了一個Nexus 5(landscape)的屏,關於屏幕與解析度的關係現在先按下不表,目前你所要做的就是選擇一個適合你手機解析度的橫屏選項,然後如圖畫兩個button控制項和一個label控制項。

然後如圖設置Label1的屬性,文字、文字顏色、長寬高等。

接下來我們在左側的Views Tree裡面點擊Activity,將它的Drawable屬性設置為BitmapDrawable,Image File選擇我們1920x1080的背景圖(bg.jpg),對齊方式選擇Fill(鋪滿),如果此處下拉欄是空白,可以點Views Tree下方的Files標籤用Add Files來載入圖片。

然後我們點開Tools菜單Generate Members,在彈出的窗口中勾選Button1、Button2、Label1和其子目錄里的Click兩項以及Activity的Click項,然後點擊Generate Members。

接下來我們可以保存(保存名為main)並關閉布局,打開代碼區域,開始寫代碼。


首先我們要引入一個概念,叫做變數。顧名思義,變數就是一個可以變化的量,上節課提到的布爾值就是一個變數,除此之外還有很多變數,但我先不講,這裡先說布爾值。

你可以任意給變數命名,B4A保留的關鍵詞除外(比如Button、Boolean等),但只要是和關鍵字不同即可,比如Button1或Button_1都是可以的。變數名必須以字母開頭,可以使用A-Z,a-z,0-9 以及下劃線,不能有空格和括弧。值得一提的是,在B4A裡面變數名對大小寫不敏感,比如Index 和index 其實指的是同一個變數。

給變數起個好名字是個好習慣,尤其是在進入這一行之後,工作上會對變數的命名有很多的要求,這樣方便一個項目多人跟進操作,同樣一個對象,比如第八個按鈕,有的團隊會要求寫成Button8有的會寫成Btn_8或者BUTTON_No_8,有很多業內流行的命名法則,比如駝峰命名法、下劃線命名法等等,但目前來說,你需要做的,就是在給變數取名的時候盡量讓他有意義,讓自己或別人一看就懂。

B4A里定義(聲明)變數,需要用到Dim…As…語法。Dim接變數名稱As接變數類型。

比如我這裡在Globals里定義兩個布爾值:

Dim zuobi As Booleannzuobi=FalsenDim beianxia As Boolean=Falsen

這兩個變數我都賦予了他們初始值,有兩種寫法,都是可行的,其實不賦值也是可以的,聲明變數時本身就會有一個預設值,所以這裡其實也可以寫成:

Dim zuobi,beianxia As Booleann

zuobi就是一個作弊開關,beianxia就是一個被按下開關。

有的朋友可能發現了,我還定義了一個BitmapDrawable,學過上節課的朋友可能明白,這是一個點陣圖繪製,嚴格來說這不是一個變數,應該稱之為對象,或者可以稱之為類,這種對象在被定義後,需要初始化才能使用,初始化的方法代碼是Initialize,我們在Activity_Create里將其初始化為我們預先準備好的牌背,這裡的語法是:

beimian.Initialize(LoadBitmap(File.DirAssets,"pm.png"))n

有用到一個LoadBitmap,後面是跟的路徑地址,如果圖片是放在項目路徑下的Files文件夾裡面的話,這裡就填File.DirAssets加上小寫逗號加文件名,如果我的文件名不是pm.png而是1.png的話,這裡我也可以寫成:

beimian.Initialize(LoadBitmap(File.DirAssets,1&".png"))n

注意,這個語法只會判斷小寫的逗號後最終的組成部分是一個文件名就可以。(B4A裡面強大的聯想詞系統,可以讓你在簡單的輸入之後就自動彈出或補全後面的單詞,同樣你也可以通過閱讀和學習這些智能聯想來獲取更多的代碼知識。)

我們把這個屬性賦值給兩個button按鈕的背景。

這樣一打開App,就會出現兩個顯示為牌背的按鈕。

接下來我們寫按鈕事件:

首先按鈕是一次性的,點擊後不可再點擊,所以在事件第一欄要寫

Button1.Enabled=False

也就是button1的啟用開關關閉。

其實我們要記錄它被按下,前面我們定義的變數beianxia開關就要打開,所以第二欄

beianxia=True

然後我們用一個If Then判斷,如果作弊開關打開了的話,就定義一個作弊圖(zuobitu)也就是15.png(撲克牌中的大王),如果作弊開關沒打開的話,就定義一個隨機圖(suijitu),這裡用到了一個方法Rnd,就是隨機取數,它的語法是Rnd加上英文括弧加上最小值加上小寫逗號加上最大值加上英文括弧,其中最小值是包括的,最大值是不包括的,所以Rnd(2,15)也就是隨機從2,3,4,5,6,7,8,9,10,11,12,13,14里隨機挑選一個數出來。

最後完整的代碼如下:

Sub Button1_Clickn Button1.Enabled=Falsen beianxia=Truen If zuobi=True Thenn Dim zuobitu As BitmapDrawable n zuobitu.Initialize(LoadBitmap(File.DirAssets,"15.png")) n Button1.Background= zuobitun Elsen Dim suijitu As BitmapDrawable n suijitu.Initialize(LoadBitmap(File.DirAssets,Rnd(2,15) & ".png")) n Button1.Background=suijitun End IfnEnd Subn

Button2裡面複製Button 1的代碼稍作修改即可。

接下來我們把作弊開關設置到Label1_Click裡面,就只有很簡單的一句,如果被按下按鈕打開了的話,就按一下作弊按鈕:

If beianxia=True Then zuobi=Not(zuobi)n

這裡用到了一個Not方法,Not的意思就是相反的布爾值,比如我們zuobi開關最開始的值是False,在beianxia開關打開後,我們點擊一下Label1,zuobi的值就成了True,再點一下Label1,zuobi的值就成了False。

所以當某玩家翻開了一張牌之後,牌面的結果是隨機,此時你按一下Label1,再翻開剩下的一張牌,那就必定是大王。如果你不按或者按兩次Label1,那麼你的牌翻開後也是隨機的。

遊戲過程已經設計出來了,但這樣按鈕是一次性的,每次只能玩一次,要退出之後再進才能再開一把,如何能重置遊戲呢?我們就在Activity_Click裡面把所有都重置,這樣玩完一局之後只要點一下活動空白處就可以重新再來一局。到這裡為止,遊戲就寫完了,趕緊編譯一下運行吧。

最終運行效果如視頻:

https://www.zhihu.com/video/940229899701673984

題圖:隨手PS

活動背景圖片:隨手PS

牌背圖片:土屋書店出版 大野文子 《マンガで覚える図解 タロットの基本》

牌面圖片:撲克牌素材

備註:附上最後編譯的app下載地址,適用Android6.0以上版本,最好是1920x1080手機。

幸運撲克App下載

推薦閱讀:

手機遊戲是否一定要比端游和頁游更碎片化?為什麼?
報名| UWA DAY 2017 精彩議題曝光,重磅嘉賓揭曉!
求教一年unity3D經驗需要掌握哪些知識?
#每天一個小目標#Unity技術分享(六)
從《城堡戰爭》到《皇室戰爭》看如何從war3自定義地圖開發手游新玩法

TAG:Android开发 | Android应用 | 手机游戏开发 |